Browse Source

Implement split screen in "Split Screen Platformer"

Fabio Alessandrelli 8 năm trước cách đây
mục cha
commit
ed6ae9dc2f

+ 12 - 7
2d/split_screen_platformer/engine.cfg

@@ -1,7 +1,7 @@
 [application]
 
-name="Platformer"
-main_scene="res://stage.tscn"
+name="Split Screen Platformer"
+main_scene="res://split_stage.tscn"
 icon="res://icon.png"
 name_es="Plataformero"
 target_fps="60"
@@ -19,11 +19,16 @@ repeat=false
 
 [input]
 
-move_left=[key(Left), jbutton(0, 14)]
-move_right=[key(Right), jbutton(0, 15)]
-jump=[key(Up), jbutton(0, 0)]
-shoot=[key(Space), jbutton(0, 2)]
-spawn=[key(F1), jbutton(0, 11)]
+move_left1=[key(A), jbutton(1, 14)]
+move_right1=[key(D), jbutton(1, 15)]
+jump1=[key(W), jbutton(1, 0)]
+shoot1=[key(Space), jbutton(1, 2)]
+spawn1=[key(F2), jbutton(1, 11)]
+move_left0=[key(Left), jbutton(0, 14)]
+move_right0=[key(Right), jbutton(0, 15)]
+jump0=[key(Up), jbutton(0, 0)]
+shoot0=[key(Return), jbutton(0, 2)]
+spawn0=[key(F1), jbutton(0, 11)]
 
 [physics_2d]
 

+ 6 - 5
2d/split_screen_platformer/player.gd

@@ -52,6 +52,7 @@ var bullet = preload("res://bullet.tscn")
 var floor_h_velocity = 0.0
 var enemy
 
+export(int, "Player 1", "Player 2") var index = 0
 
 func _integrate_forces(s):
 	var lv = s.get_linear_velocity()
@@ -61,11 +62,11 @@ func _integrate_forces(s):
 	var new_siding_left = siding_left
 	
 	# Get the controls
-	var move_left = Input.is_action_pressed("move_left")
-	var move_right = Input.is_action_pressed("move_right")
-	var jump = Input.is_action_pressed("jump")
-	var shoot = Input.is_action_pressed("shoot")
-	var spawn = Input.is_action_pressed("spawn")
+	var move_left = Input.is_action_pressed("move_left" + str(index))
+	var move_right = Input.is_action_pressed("move_right" + str(index))
+	var jump = Input.is_action_pressed("jump" + str(index))
+	var shoot = Input.is_action_pressed("shoot" + str(index))
+	var spawn = Input.is_action_pressed("spawn" + str(index))
 	
 	if spawn:
 		var e = enemy.instance()

+ 22 - 11
2d/split_screen_platformer/player.tscn

@@ -35,7 +35,8 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ 22 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ 22 ] }
 
 [sub_resource type="Animation" id=5]
 
@@ -46,7 +47,8 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ 21 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ 21 ] }
 
 [sub_resource type="Animation" id=6]
 
@@ -57,7 +59,8 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ 26 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ 26 ] }
 
 [sub_resource type="Animation" id=7]
 
@@ -67,7 +70,8 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0, 1.25, 1.5, 2, 4.5, 4.75, 5, 5.25 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1, 1, 1 ), "values":[ 16, 17, 18, 16, 19, 20, 19, 16 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0, 1.25, 1.5, 2, 4.5, 4.75, 5, 5.25 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1, 1, 1 ), "update":1, "values":[ 16, 17, 18, 16, 19, 20, 19, 16 ] }
 
 [sub_resource type="Animation" id=8]
 
@@ -77,7 +81,8 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ 25 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ 25 ] }
 
 [sub_resource type="Animation" id=9]
 
@@ -87,7 +92,8 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0, 0.25, 0.5 ), "transitions":FloatArray( 1, 1, 1 ), "values":[ 23, 24, 23 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0, 0.25, 0.5 ), "transitions":FloatArray( 1, 1, 1 ), "update":1, "values":[ 23, 24, 23 ] }
 
 [sub_resource type="Animation" id=10]
 
@@ -97,7 +103,8 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ 26 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ 26 ] }
 
 [sub_resource type="Animation" id=11]
 
@@ -107,7 +114,8 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0, 0.25, 0.5, 0.75, 1, 1.25 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1 ), "values":[ 0, 1, 2, 3, 4, 0 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0, 0.25, 0.5, 0.75, 1, 1.25 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1 ), "update":1, "values":[ 0, 1, 2, 3, 4, 0 ] }
 
 [sub_resource type="Animation" id=12]
 
@@ -117,7 +125,8 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0, 0.25, 0.5, 0.75, 1, 1.25 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1 ), "values":[ 5, 6, 7, 8, 9, 5 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0, 0.25, 0.5, 0.75, 1, 1.25 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1 ), "update":1, "values":[ 5, 6, 7, 8, 9, 5 ] }
 
 [sub_resource type="Animation" id=13]
 
@@ -127,13 +136,14 @@ step = 0.25
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0, 0.25, 0.5, 0.75, 1, 1.25 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1 ), "values":[ 10, 11, 12, 13, 14, 5 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0, 0.25, 0.5, 0.75, 1, 1.25 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1 ), "update":1, "values":[ 10, 11, 12, 13, 14, 5 ] }
 
 [sub_resource type="SampleLibrary" id=14]
 
+samples/coin = { "db":0.0, "pitch":1.0, "sample":ExtResource( 4 ) }
 samples/jump = { "db":0.0, "pitch":1.0, "sample":ExtResource( 5 ) }
 samples/shoot = { "db":0.0, "pitch":1.0, "sample":ExtResource( 6 ) }
-samples/coin = { "db":0.0, "pitch":1.0, "sample":ExtResource( 4 ) }
 
 [node name="player" type="RigidBody2D"]
 
@@ -162,6 +172,7 @@ velocity/angular = 0.0
 damp_override/linear = -1.0
 damp_override/angular = -1.0
 script/script = ExtResource( 1 )
+index = 0
 
 [node name="sprite" type="Sprite" parent="."]
 

+ 15 - 0
2d/split_screen_platformer/split_stage.gd

@@ -0,0 +1,15 @@
+extends Control
+
+func _ready():
+	#make bottom viewport have the same world2D as the top viewport, so both show the same
+	get_node("bottom/viewport").set_world_2d( get_node("top/viewport").get_world_2d() )
+	#make player2 camera control the offset of the bottom viewport
+	get_node("top/viewport/stage/player2/camera").set_custom_viewport( get_node("bottom/viewport") )
+	#
+	var parallax_copy = get_node("top/viewport/stage/parallax_bg").duplicate()
+	parallax_copy.set_custom_viewport( get_node("bottom/viewport") )
+	get_node("top/viewport/stage").add_child(parallax_copy)
+	
+	#simple and alternatively, copy them to the other viewport, but they must be erased when level is unloaded
+	#get_node("bottom/viewport").add_child( get_node("top/viewport/stage/parallax_bg").duplicate() )
+	pass

+ 83 - 0
2d/split_screen_platformer/split_stage.tscn

@@ -0,0 +1,83 @@
+[gd_scene load_steps=3 format=1]
+
+[ext_resource path="res://split_stage.gd" type="Script" id=1]
+[ext_resource path="res://stage.tscn" type="PackedScene" id=2]
+
+[node name="main_control" type="Control"]
+
+anchor/right = 1
+anchor/bottom = 1
+focus/ignore_mouse = false
+focus/stop_mouse = true
+size_flags/horizontal = 2
+size_flags/vertical = 2
+margin/left = 0.0
+margin/top = 0.0
+margin/right = 0.0
+margin/bottom = 0.0
+script/script = ExtResource( 1 )
+
+[node name="top" type="Control" parent="."]
+
+anchor/right = 1
+anchor/bottom = 3
+focus/ignore_mouse = false
+focus/stop_mouse = true
+size_flags/horizontal = 2
+size_flags/vertical = 2
+margin/left = 0.0
+margin/top = 0.0
+margin/right = 0.0
+margin/bottom = 0.0
+
+[node name="viewport" type="Viewport" parent="top"]
+
+rect = Rect2( 0, 0, 800, 240 )
+own_world = false
+world = null
+transparent_bg = false
+render_target/enabled = false
+render_target/v_flip = false
+render_target/clear_on_new_frame = true
+render_target/filter = false
+render_target/gen_mipmaps = false
+render_target/update_mode = 2
+audio_listener/enable_2d = false
+audio_listener/enable_3d = false
+physics/object_picking = false
+gui/disable_input = false
+
+[node name="stage" parent="top/viewport" instance=ExtResource( 2 )]
+
+[node name="bottom" type="Control" parent="."]
+
+anchor/top = 3
+anchor/right = 1
+anchor/bottom = 1
+focus/ignore_mouse = false
+focus/stop_mouse = true
+size_flags/horizontal = 2
+size_flags/vertical = 2
+margin/left = 0.0
+margin/top = 0.0
+margin/right = 0.0
+margin/bottom = 0.0
+
+[node name="viewport" type="Viewport" parent="bottom"]
+
+rect = Rect2( 0, 0, 800, 240 )
+own_world = false
+world = null
+transparent_bg = false
+render_target/enabled = false
+render_target/v_flip = false
+render_target/clear_on_new_frame = true
+render_target/filter = false
+render_target/gen_mipmaps = false
+render_target/update_mode = 2
+audio_listener/enable_2d = false
+audio_listener/enable_3d = false
+physics/object_picking = false
+gui/disable_input = false
+
+

+ 6 - 42
2d/split_screen_platformer/stage.tscn

@@ -36,212 +36,170 @@ __meta__ = { "_edit_lock_":true }
 [node name="coin" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 672, 1179 )
-linear_damp = 0.1
 
 [node name="coin 2" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 704, 1179 )
-linear_damp = 0.1
 
 [node name="coin 3" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 736, 1179 )
-linear_damp = 0.1
 
 [node name="coin 4" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1120, 992 )
-linear_damp = 0.1
 
 [node name="coin 5" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1152, 992 )
-linear_damp = 0.1
 
 [node name="coin 6" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1184, 992 )
-linear_damp = 0.1
 
 [node name="coin 7" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1216, 992 )
-linear_damp = 0.1
 
 [node name="coin 8" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1248, 992 )
-linear_damp = 0.1
 
 [node name="coin 9" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1568, 864 )
-linear_damp = 0.1
 
 [node name="coin 10" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1632, 864 )
-linear_damp = 0.1
 
 [node name="coin 11" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1824, 768 )
-linear_damp = 0.1
 
 [node name="coin 12" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1888, 768 )
-linear_damp = 0.1
 
 [node name="coin 13" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 2080, 672 )
-linear_damp = 0.1
 
 [node name="coin 14" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 2144, 672 )
-linear_damp = 0.1
 
 [node name="coin 15" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1792, 1248 )
-linear_damp = 0.1
 
 [node name="coin 16" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1856, 1248 )
-linear_damp = 0.1
 
 [node name="coin 17" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1920, 1248 )
-linear_damp = 0.1
 
 [node name="coin 18" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1920, 1184 )
-linear_damp = 0.1
 
 [node name="coin 19" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1856, 1184 )
-linear_damp = 0.1
 
 [node name="coin 20" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 1792, 1184 )
-linear_damp = 0.1
 
 [node name="coin 21" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 98.8868, 488.515 )
-linear_damp = 0.1
 
 [node name="coin 22" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 89.5989, 481.217 )
-linear_damp = 0.1
 
 [node name="coin 23" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 108.175, 481.217 )
-linear_damp = 0.1
 
 [node name="coin 24" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 116.136, 469.939 )
-linear_damp = 0.1
 
 [node name="coin 25" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 117.463, 457.997 )
-linear_damp = 0.1
 
 [node name="coin 26" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 106.184, 449.373 )
-linear_damp = 0.1
 
 [node name="coin 27" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 98.2234, 458.661 )
-linear_damp = 0.1
 
 [node name="coin 28" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 88.272, 448.71 )
-linear_damp = 0.1
 
 [node name="coin 29" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 79.6476, 457.334 )
-linear_damp = 0.1
 
 [node name="coin 30" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 82.9647, 468.612 )
-linear_damp = 0.1
 
 [node name="coin 31" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 3357.42, 465.288 )
-linear_damp = 0.1
 
 [node name="coin 31 2" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 3421.42, 465.288 )
-linear_damp = 0.1
 
 [node name="coin 31 3" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 3485.42, 465.288 )
-linear_damp = 0.1
 
 [node name="coin 31 4" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 3485.42, 401.288 )
-linear_damp = 0.1
 
 [node name="coin 31 5" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 3421.42, 401.288 )
-linear_damp = 0.1
 
 [node name="coin 31 6" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 3357.42, 401.288 )
-linear_damp = 0.1
 
 [node name="coin 32" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 4172.75, 605.058 )
-linear_damp = 0.1
 
 [node name="coin 31 7" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 4236.75, 605.058 )
-linear_damp = 0.1
 
 [node name="coin 31 7 2" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 4300.75, 605.058 )
-linear_damp = 0.1
 
 [node name="coin 31 7 3" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 4300.75, 541.058 )
-linear_damp = 0.1
 
 [node name="coin 31 7 4" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 4236.75, 541.058 )
-linear_damp = 0.1
 
 [node name="coin 31 7 5" parent="coins" instance=ExtResource( 2 )]
 
 transform/pos = Vector2( 4172.75, 541.058 )
-linear_damp = 0.1
 
 [node name="props" type="Node" parent="."]
 
@@ -275,6 +233,11 @@ transform/pos = Vector2( 927.698, 1120.81 )
 
 transform/pos = Vector2( 251.684, 1045.6 )
 
+[node name="player2" parent="." instance=ExtResource( 6 )]
+
+transform/pos = Vector2( 179.645, 1046.34 )
+index = 1
+
 [node name="music" type="StreamPlayer" parent="."]
 
 stream/stream = ExtResource( 7 )
@@ -339,6 +302,7 @@ transform/pos = Vector2( 2406.63, 815.115 )
 focus/ignore_mouse = true
 focus/stop_mouse = true
 size_flags/horizontal = 2
+size_flags/vertical = 0
 margin/left = 12.0
 margin/top = -202.0
 margin/right = 358.0