Эх сурвалжийг харах

Platformer demo now uses Kinematic Controller

Juan Linietsky 9 жил өмнө
parent
commit
1a7e9e0dc4
63 өөрчлөгдсөн 2387 нэмэгдсэн , 450 устгасан
  1. 5 12
      2d/platformer/bullet.gd
  2. 11 6
      2d/platformer/bullet.tscn
  3. 6 14
      2d/platformer/coin.gd
  4. 15 7
      2d/platformer/coin.tscn
  5. 42 67
      2d/platformer/enemy.gd
  6. 56 48
      2d/platformer/enemy.tscn
  7. BIN
      2d/platformer/moving_platform.png
  8. BIN
      2d/platformer/one_way_platform.png
  9. 76 204
      2d/platformer/player.gd
  10. 60 77
      2d/platformer/player.tscn
  11. BIN
      2d/platformer/scroll_bg_fg_1.png
  12. BIN
      2d/platformer/scroll_bg_fg_2.png
  13. BIN
      2d/platformer/scroll_bg_sky.png
  14. 6 7
      2d/platformer/stage.tscn
  15. BIN
      2d/platformer/tiles_demo.png
  16. 16 0
      2d/platformer_dcc/bullet.gd
  17. BIN
      2d/platformer_dcc/bullet.png
  18. 115 0
      2d/platformer_dcc/bullet.tscn
  19. 19 0
      2d/platformer_dcc/coin.gd
  20. BIN
      2d/platformer_dcc/coin.png
  21. 146 0
      2d/platformer_dcc/coin.tscn
  22. 83 0
      2d/platformer_dcc/enemy.gd
  23. BIN
      2d/platformer_dcc/enemy.png
  24. 206 0
      2d/platformer_dcc/enemy.tscn
  25. 42 0
      2d/platformer_dcc/engine.cfg
  26. 42 0
      2d/platformer_dcc/engine.cfg~
  27. BIN
      2d/platformer_dcc/icon.png
  28. 20 0
      2d/platformer_dcc/moving_platform.gd
  29. BIN
      2d/platformer_dcc/moving_platform.png
  30. 52 0
      2d/platformer_dcc/moving_platform.tscn
  31. BIN
      2d/platformer_dcc/music.ogg
  32. BIN
      2d/platformer_dcc/one_way_platform.png
  33. 36 0
      2d/platformer_dcc/one_way_platform.tscn
  34. BIN
      2d/platformer_dcc/osb_fire.png
  35. BIN
      2d/platformer_dcc/osb_jump.png
  36. BIN
      2d/platformer_dcc/osb_left.png
  37. BIN
      2d/platformer_dcc/osb_right.png
  38. 101 0
      2d/platformer_dcc/parallax_bg.tscn
  39. 0 0
      2d/platformer_dcc/plank.png
  40. 0 0
      2d/platformer_dcc/plankpin.png
  41. 232 0
      2d/platformer_dcc/player.gd
  42. 330 0
      2d/platformer_dcc/player.tscn
  43. BIN
      2d/platformer_dcc/robot_demo.png
  44. BIN
      2d/platformer_dcc/scroll_bg_cloud_1.png
  45. BIN
      2d/platformer_dcc/scroll_bg_cloud_2.png
  46. BIN
      2d/platformer_dcc/scroll_bg_cloud_3.png
  47. BIN
      2d/platformer_dcc/scroll_bg_fg_1.png
  48. BIN
      2d/platformer_dcc/scroll_bg_fg_2.png
  49. BIN
      2d/platformer_dcc/scroll_bg_sky.png
  50. 0 0
      2d/platformer_dcc/seesaw.tscn
  51. BIN
      2d/platformer_dcc/sound_coin.wav
  52. BIN
      2d/platformer_dcc/sound_explode.wav
  53. BIN
      2d/platformer_dcc/sound_hit.wav
  54. BIN
      2d/platformer_dcc/sound_jump.wav
  55. BIN
      2d/platformer_dcc/sound_shoot.wav
  56. 30 0
      2d/platformer_dcc/stage.tscn
  57. BIN
      2d/platformer_dcc/tiles_demo.png
  58. 1 0
      2d/platformer_dcc/tiles_demo.png.flags
  59. 195 0
      2d/platformer_dcc/tileset.tres
  60. 432 0
      2d/platformer_dcc/tileset_edit.tscn
  61. BIN
      visual_script/platformer/moving_platform.vs
  62. BIN
      visual_script/platformer/player.vs
  63. 12 8
      visual_script/platformer/stage.tscn

+ 5 - 12
2d/platformer/bullet.gd

@@ -1,16 +1,9 @@
 
 extends RigidBody2D
 
-# Member variables
-var disabled = false
-
-
-func disable():
-	if (disabled):
-		return
+func _on_bullet_body_enter( body ):
+	if (body.has_method("hit_by_bullet")):
+		body.call("hit_by_bullet")
+	
+func _on_Timer_timeout():
 	get_node("anim").play("shutdown")
-	disabled = true
-
-
-func _ready():
-	get_node("Timer").start()

+ 11 - 6
2d/platformer/bullet.tscn

@@ -21,14 +21,17 @@ step = 0.0
 tracks/0/type = "value"
 tracks/0/path = NodePath("particles:config/emitting")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ false ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ false ] }
 tracks/1/type = "value"
 tracks/1/path = NodePath("sprite:visibility/self_opacity")
 tracks/1/interp = 1
-tracks/1/keys = { "cont":true, "times":FloatArray( 0, 1.00394 ), "transitions":FloatArray( 1, 1 ), "values":[ 1.0, 0.0 ] }
+tracks/1/imported = false
+tracks/1/keys = { "times":FloatArray( 0, 1.00394 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 1.0, 0.0 ] }
 tracks/2/type = "method"
 tracks/2/path = NodePath(".")
 tracks/2/interp = 1
+tracks/2/imported = false
 tracks/2/keys = { "times":FloatArray( 1.31 ), "transitions":FloatArray( 1 ), "values":[ { "args":[  ], "method":"queue_free" } ] }
 
 [node name="bullet" type="RigidBody2D"]
@@ -46,8 +49,8 @@ bounce = 0.0
 gravity_scale = 1.0
 custom_integrator = false
 continuous_cd = 2
-contacts_reported = 0
-contact_monitor = false
+contacts_reported = 3
+contact_monitor = true
 sleeping = false
 can_sleep = true
 velocity/linear = Vector2( 0, 0 )
@@ -97,7 +100,7 @@ _update_shape_index = -1
 process_mode = 1
 wait_time = 1.0
 one_shot = true
-autostart = false
+autostart = true
 
 [node name="anim" type="AnimationPlayer" parent="."]
 
@@ -110,6 +113,8 @@ playback/speed = 1.0
 blend_times = [  ]
 autoplay = ""
 
-[connection signal="timeout" from="Timer" to="." method="disable"]
+[connection signal="body_enter" from="." to="." method="_on_bullet_body_enter"]
+
+[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
 
 

+ 6 - 14
2d/platformer/coin.gd

@@ -1,19 +1,11 @@
 
 extends Area2D
+	
+var taken=false
 
-# Member variables
-var taken = false
-
-
-func _on_body_enter( body ):
+func _on_coin_body_enter( body ):
+	
 	if (not taken and body extends preload("res://player.gd")):
 		get_node("anim").play("taken")
-		taken = true
-
-
-func _on_coin_area_enter(area):
-	pass # replace with function body
-
-
-func _on_coin_area_enter_shape(area_id, area, area_shape, area_shape):
-	pass # replace with function body
+		taken=true
+		

+ 15 - 7
2d/platformer/coin.tscn

@@ -19,7 +19,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, 1.5 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1, 1 ), "values":[ 0, 1, 2, 3, 2, 1, 0 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0, 0.25, 0.5, 0.75, 1, 1.25, 1.5 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1, 1 ), "update":1, "values":[ 0, 1, 2, 3, 2, 1, 0 ] }
 
 [sub_resource type="Animation" id=3]
 
@@ -29,26 +30,32 @@ step = 0.0
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:frame")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":true, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ 0 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 0 ] }
 tracks/1/type = "value"
 tracks/1/path = NodePath("sound:play/play")
 tracks/1/interp = 1
-tracks/1/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ "coin" ] }
+tracks/1/imported = false
+tracks/1/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ "coin" ] }
 tracks/2/type = "value"
 tracks/2/path = NodePath("particles:visibility/self_opacity")
 tracks/2/interp = 1
-tracks/2/keys = { "cont":true, "times":FloatArray( 0, 1.66 ), "transitions":FloatArray( 1, 1 ), "values":[ 1.0, 0.0 ] }
+tracks/2/imported = false
+tracks/2/keys = { "times":FloatArray( 0, 1.66 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 1.0, 0.0 ] }
 tracks/3/type = "value"
 tracks/3/path = NodePath("sprite:visibility/self_opacity")
 tracks/3/interp = 1
-tracks/3/keys = { "cont":true, "times":FloatArray( 0, 0.4 ), "transitions":FloatArray( 1, 1 ), "values":[ 1.0, 0.0 ] }
+tracks/3/imported = false
+tracks/3/keys = { "times":FloatArray( 0, 0.4 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 1.0, 0.0 ] }
 tracks/4/type = "value"
 tracks/4/path = NodePath("particles:config/emitting")
 tracks/4/interp = 1
-tracks/4/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ true ] }
+tracks/4/imported = false
+tracks/4/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":1, "values":[ true ] }
 tracks/5/type = "method"
 tracks/5/path = NodePath(".")
 tracks/5/interp = 1
+tracks/5/imported = false
 tracks/5/keys = { "times":FloatArray( 2.7 ), "transitions":FloatArray( 1 ), "values":[ { "args":[  ], "method":"queue_free" } ] }
 
 [sub_resource type="SampleLibrary" id=4]
@@ -138,9 +145,10 @@ rect = Rect2( -10, -10, 20, 20 )
 enabler/pause_animations = true
 enabler/freeze_bodies = true
 enabler/pause_particles = true
+enabler/pause_animated_sprites = true
 enabler/process_parent = false
 enabler/fixed_process_parent = false
 
-[connection signal="body_enter" from="." to="." method="_on_body_enter"]
+[connection signal="body_enter" from="." to="." method="_on_coin_body_enter"]
 
 

+ 42 - 67
2d/platformer/enemy.gd

@@ -1,83 +1,58 @@
 
-extends RigidBody2D
+extends KinematicBody2D
 
-# Member variables
-const STATE_WALKING = 0
-const STATE_DYING = 1
-
-var state = STATE_WALKING
-
-var direction = -1
-var anim = ""
-
-var rc_left = null
-var rc_right = null
-var WALK_SPEED = 50
 
-var bullet_class = preload("res://bullet.gd")
-
-
-func _die():
-	queue_free()
+const GRAVITY_VEC = Vector2(0,900)
+const FLOOR_NORMAL = Vector2(0,-1)
 
+const WALK_SPEED = 70
+const STATE_WALKING = 0
+const STATE_KILLED = 1
 
-func _pre_explode():
-	# Stay there
-	clear_shapes()
-	set_mode(MODE_STATIC)
-	get_node("sound").play("explode")
+var linear_velocity = Vector2()
+var direction = -1
+var anim=""
 
+var state = STATE_WALKING
 
-func _integrate_forces(s):
-	var lv = s.get_linear_velocity()
-	var new_anim = anim
+onready var detect_floor_left = get_node("detect_floor_left")
+onready var detect_wall_left = get_node("detect_wall_left")
+onready var detect_floor_right = get_node("detect_floor_right")
+onready var detect_wall_right = get_node("detect_wall_right")
+onready var sprite = get_node("sprite")
 
-	if (state == STATE_DYING):
-		new_anim = "explode"
-	elif (state == STATE_WALKING):
-		new_anim = "walk"
-		
-		var wall_side = 0.0
+func _fixed_process(delta):
+	
+	var new_anim="idle"
+	
+	if (state==STATE_WALKING):
+	
+		linear_velocity+= GRAVITY_VEC*delta
+		linear_velocity.x = direction * WALK_SPEED
+		linear_velocity = move_and_slide( linear_velocity, FLOOR_NORMAL )
 		
-		for i in range(s.get_contact_count()):
-			var cc = s.get_contact_collider_object(i)
-			var dp = s.get_contact_local_normal(i)
+		if (not detect_floor_left.is_colliding() or detect_wall_left.is_colliding()):
+			direction=1.0
 			
-			if (cc):
-				if (cc extends bullet_class and not cc.disabled):
-					set_mode(MODE_RIGID)
-					state = STATE_DYING
-					#lv = s.get_contact_local_normal(i)*400
-					s.set_angular_velocity(sign(dp.x)*33.0)
-					set_friction(1)
-					cc.disable()
-					get_node("sound").play("hit")
-					break
+		if (not detect_floor_right.is_colliding() or detect_wall_right.is_colliding()):
+			direction=-1.0
 			
-			if (dp.x > 0.9):
-				wall_side = 1.0
-			elif (dp.x < -0.9):
-				wall_side = -1.0
+		sprite.set_scale( Vector2(direction,1.0) )
 		
-		if (wall_side != 0 and wall_side != direction):
-			direction = -direction
-			get_node("sprite").set_scale(Vector2(-direction, 1))
-		if (direction < 0 and not rc_left.is_colliding() and rc_right.is_colliding()):
-			direction = -direction
-			get_node("sprite").set_scale(Vector2(-direction, 1))
-		elif (direction > 0 and not rc_right.is_colliding() and rc_left.is_colliding()):
-			direction = -direction
-			get_node("sprite").set_scale(Vector2(-direction, 1))
+		new_anim="walk"
+	else:
+		new_anim="explode"
 		
-		lv.x = direction*WALK_SPEED
-	
-	if(anim != new_anim):
-		anim = new_anim
+	if (anim!=new_anim):
+		anim=new_anim
 		get_node("anim").play(anim)
-	
-	s.set_linear_velocity(lv)
-
+			
+		
+		
+func hit_by_bullet():
+	state=STATE_KILLED	
 
 func _ready():
-	rc_left = get_node("raycast_left")
-	rc_right = get_node("raycast_right")
+	set_fixed_process(true)
+
+

+ 56 - 48
2d/platformer/enemy.tscn

@@ -6,33 +6,48 @@
 [ext_resource path="res://sound_explode.wav" type="Sample" id=4]
 [ext_resource path="res://sound_hit.wav" type="Sample" id=5]
 
-[sub_resource type="CircleShape2D" id=1]
+[sub_resource type="CapsuleShape2D" id=1]
 
 custom_solver_bias = 0.0
-radius = 14.0
+radius = 13.4556
+height = 14.2002
 
 [sub_resource type="Animation" id=2]
 
 resource/name = "explode"
-length = 6.0
+length = 2.0
 loop = false
 step = 0.0
 tracks/0/type = "value"
 tracks/0/path = NodePath("sprite:visibility/self_opacity")
 tracks/0/interp = 1
-tracks/0/keys = { "cont":true, "times":FloatArray( 3.58422, 4.33851 ), "transitions":FloatArray( 1, 1 ), "values":[ 1.0, 0.0 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0.99422, 1.12851 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 1.0, 0.0 ] }
 tracks/1/type = "value"
 tracks/1/path = NodePath("sprite:frame")
 tracks/1/interp = 1
-tracks/1/keys = { "cont":true, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ 4 ] }
+tracks/1/imported = false
+tracks/1/keys = { "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "update":0, "values":[ 4 ] }
 tracks/2/type = "value"
 tracks/2/path = NodePath("Particles2D:config/emitting")
 tracks/2/interp = 1
-tracks/2/keys = { "cont":false, "times":FloatArray( 3.47394 ), "transitions":FloatArray( 1 ), "values":[ true ] }
+tracks/2/imported = false
+tracks/2/keys = { "times":FloatArray( 1.19394 ), "transitions":FloatArray( 1 ), "update":1, "values":[ true ] }
 tracks/3/type = "method"
 tracks/3/path = NodePath(".")
 tracks/3/interp = 1
-tracks/3/keys = { "times":FloatArray( 3.20357, 5.07305 ), "transitions":FloatArray( 1, 1 ), "values":[ { "args":[  ], "method":"_pre_explode" }, { "args":[  ], "method":"_die" } ] }
+tracks/3/imported = false
+tracks/3/keys = { "times":FloatArray( 2.01305 ), "transitions":FloatArray( 1 ), "values":[ { "args":[  ], "method":"queue_free" } ] }
+tracks/4/type = "value"
+tracks/4/path = NodePath("sprite:transform/rot")
+tracks/4/interp = 1
+tracks/4/imported = false
+tracks/4/keys = { "times":FloatArray( 0, 0.99 ), "transitions":FloatArray( 1, 1 ), "update":0, "values":[ 0.0, 360.0 ] }
+tracks/5/type = "value"
+tracks/5/path = NodePath("sound:play/play")
+tracks/5/interp = 1
+tracks/5/imported = false
+tracks/5/keys = { "times":FloatArray( 1.2 ), "transitions":FloatArray( 1 ), "update":2, "values":[ "explode" ] }
 
 [sub_resource type="Animation" id=3]
 
@@ -42,7 +57,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.75, 1.5, 2.25, 3, 3.75, 4.5, 5.25, 6, 6.75 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), "values":[ 5, 6, 5, 6, 5, 6, 7, 6, 7, 5 ] }
+tracks/0/imported = false
+tracks/0/keys = { "times":FloatArray( 0, 0.75, 1.5, 2.25, 3, 3.75, 4.5, 5.25, 6, 6.75 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), "update":1, "values":[ 5, 6, 5, 6, 5, 6, 7, 6, 7, 5 ] }
 
 [sub_resource type="Animation" id=4]
 
@@ -53,7 +69,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="ColorRamp" id=5]
 
@@ -65,35 +82,15 @@ colors = ColorArray( 1, 0.884956, 0.823009, 1, 0.768627, 0.389381, 0, 0 )
 samples/explode = { "db":0.0, "pitch":1.0, "sample":ExtResource( 4 ) }
 samples/hit = { "db":0.0, "pitch":1.0, "sample":ExtResource( 5 ) }
 
-[node name="enemy" type="RigidBody2D"]
+[node name="enemy" type="KinematicBody2D"]
 
 input/pickable = false
 shapes/0/shape = SubResource( 1 )
-shapes/0/transform = Matrix32( 1, 0, 0, 1, -1.08072, -2.16144 )
+shapes/0/transform = Matrix32( -4.37114e-08, -1, 1, -4.37114e-08, -0.00525069, -0.727495 )
 shapes/0/trigger = false
-shapes/1/shape = SubResource( 1 )
-shapes/1/transform = Matrix32( 1, 0, 0, 1, 6.48431, 3.24216 )
-shapes/1/trigger = false
-shapes/2/shape = SubResource( 1 )
-shapes/2/transform = Matrix32( 1, 0, 0, 1, -12.495, 3.53415 )
-shapes/2/trigger = false
 collision/layers = 1
 collision/mask = 1
-mode = 2
-mass = 1.0
-friction = 0.0
-bounce = 0.0
-gravity_scale = 1.0
-custom_integrator = false
-continuous_cd = 0
-contacts_reported = 4
-contact_monitor = false
-sleeping = false
-can_sleep = true
-velocity/linear = Vector2( 0, 0 )
-velocity/angular = 0.0
-damp_override/linear = -1.0
-damp_override/angular = -1.0
+collision/margin = 0.08
 script/script = ExtResource( 1 )
 
 [node name="enabler" type="VisibilityEnabler2D" parent="."]
@@ -104,6 +101,7 @@ rect = Rect2( -10, -10, 20, 20 )
 enabler/pause_animations = true
 enabler/freeze_bodies = true
 enabler/pause_particles = true
+enabler/pause_animated_sprites = true
 enabler/process_parent = false
 enabler/fixed_process_parent = false
 
@@ -123,42 +121,52 @@ autoplay = ""
 [node name="sprite" type="Sprite" parent="."]
 
 texture = ExtResource( 2 )
+flip_h = true
 hframes = 8
 frame = 4
 
 [node name="CollisionShape2D" type="CollisionShape2D" parent="."]
 
-transform/pos = Vector2( -1.08072, -2.16144 )
+transform/pos = Vector2( -0.00525069, -0.727495 )
+transform/rot = 90.0
 shape = SubResource( 1 )
 trigger = false
-_update_shape_index = -1
+_update_shape_index = 0
 
-[node name="CollisionShape2D 2" type="CollisionShape2D" parent="."]
+[node name="detect_floor_left" type="RayCast2D" parent="."]
 
-transform/pos = Vector2( 6.48431, 3.24216 )
-shape = SubResource( 1 )
-trigger = false
-_update_shape_index = -1
+transform/pos = Vector2( -33.2868, -9.34363 )
+enabled = true
+exclude_parent = true
+cast_to = Vector2( 0, 45 )
+layer_mask = 1
+type_mask = 15
 
-[node name="CollisionShape2D 3" type="CollisionShape2D" parent="."]
+[node name="detect_wall_left" type="RayCast2D" parent="."]
 
-transform/pos = Vector2( -12.495, 3.53415 )
-shape = SubResource( 1 )
-trigger = false
-_update_shape_index = -1
+transform/pos = Vector2( -12.1361, -0.739977 )
+transform/rot = -90.0
+enabled = true
+exclude_parent = true
+cast_to = Vector2( 0, 20 )
+layer_mask = 1
+type_mask = 15
 
-[node name="raycast_left" type="RayCast2D" parent="."]
+[node name="detect_wall_right" type="RayCast2D" parent="."]
 
-transform/pos = Vector2( -33.2868, -9.34363 )
+transform/pos = Vector2( 3.2788, -0.381488 )
+transform/rot = 90.0
 enabled = true
-cast_to = Vector2( 0, 45 )
+exclude_parent = true
+cast_to = Vector2( 0, 20 )
 layer_mask = 1
 type_mask = 15
 
-[node name="raycast_right" type="RayCast2D" parent="."]
+[node name="detect_floor_right" type="RayCast2D" parent="."]
 
 transform/pos = Vector2( 29.1987, -9.34363 )
 enabled = true
+exclude_parent = true
 cast_to = Vector2( 0, 45 )
 layer_mask = 1
 type_mask = 15

BIN
2d/platformer/moving_platform.png


BIN
2d/platformer/one_way_platform.png


+ 76 - 204
2d/platformer/player.gd

@@ -1,232 +1,104 @@
 
-extends RigidBody2D
+extends KinematicBody2D
 
-# Character Demo, written by Juan Linietsky.
-#
-# Implementation of a 2D Character controller.
-# This implementation uses the physics engine for
-# controlling a character, in a very similar way
-# than a 3D character controller would be implemented.
-#
-# Using the physics engine for this has the main
-# advantages:
-# -Easy to write.
-# -Interaction with other physics-based objects is free
-# -Only have to deal with the object linear velocity, not position
-# -All collision/area framework available
-# 
-# But also has the following disadvantages:
-#  
-# -Objects may bounce a little bit sometimes
-# -Going up ramps sends the chracter flying up, small hack is needed.
-# -A ray collider is needed to avoid sliding down on ramps and  
-#   undesiderd bumps, small steps and rare numerical precision errors.
-#   (another alternative may be to turn on friction when the character is not moving).
-# -Friction cant be used, so floor velocity must be considered
-#  for moving platforms.
+const GRAVITY_VEC = Vector2(0,900)
+const FLOOR_NORMAL = Vector2(0,-1)
+const SLOPE_SLIDE_STOP = 25.0
+const MIN_ONAIR_TIME = 0.1
+const WALK_SPEED = 250 # pixels/sec
+const JUMP_SPEED = 480
+const SIDING_CHANGE_SPEED = 10
+const BULLET_VELOCITY = 1000
+const SHOOT_TIME_SHOW_WEAPON = 0.2
 
-# Member variables
-var anim = ""
-var siding_left = false
-var jumping = false
-var stopping_jump = false
-var shooting = false
+var linear_vel = Vector2()
+var onair_time = 0 # 
+var on_floor = false
+var shoot_time=99999 #time since last shot
 
-var WALK_ACCEL = 800.0
-var WALK_DEACCEL = 800.0
-var WALK_MAX_VELOCITY = 200.0
-var AIR_ACCEL = 200.0
-var AIR_DEACCEL = 200.0
-var JUMP_VELOCITY = 460
-var STOP_JUMP_FORCE = 900.0
+var anim=""
 
-var MAX_FLOOR_AIRBORNE_TIME = 0.15
+#cache the sprite here for fast access (we will set scale to flip it often)
+onready var sprite = get_node("sprite")
 
-var airborne_time = 1e20
-var shoot_time = 1e20
-
-var MAX_SHOOT_POSE_TIME = 0.3
-
-var bullet = preload("res://bullet.tscn")
-
-var floor_h_velocity = 0.0
-var enemy
-
-
-func _integrate_forces(s):
-	var lv = s.get_linear_velocity()
-	var step = s.get_step()
+func _fixed_process(delta):
 	
-	var new_anim = anim
-	var new_siding_left = siding_left
+	#increment counters
 	
-	# 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")
+	onair_time+=delta
+	shoot_time+=delta
 	
-	if spawn:
-		var e = enemy.instance()
-		var p = get_pos()
-		p.y = p.y - 100
-		e.set_pos(p)
-		get_parent().add_child(e)
 	
-	# Deapply prev floor velocity
-	lv.x -= floor_h_velocity
-	floor_h_velocity = 0.0
+	### MOVEMENT ###
 	
-	# Find the floor (a contact with upwards facing collision normal)
-	var found_floor = false
-	var floor_index = -1
+	# Apply Gravity
+	linear_vel += delta * GRAVITY_VEC
+	# Move and Slide
+	linear_vel = move_and_slide( linear_vel, FLOOR_NORMAL, SLOPE_SLIDE_STOP )
+	# Detect Floor
+	if (is_move_and_slide_on_floor()):
+		onair_time=0		
+		
+	on_floor = onair_time < MIN_ONAIR_TIME
 	
-	for x in range(s.get_contact_count()):
-		var ci = s.get_contact_local_normal(x)
-		if (ci.dot(Vector2(0, -1)) > 0.6):
-			found_floor = true
-			floor_index = x
+	### CONTROL ###
 	
-	# A good idea when impementing characters of all kinds,
-	# compensates for physics imprecission, as well as human reaction delay.
-	if (shoot and not shooting):
-		shoot_time = 0
-		var bi = bullet.instance()
-		var ss
-		if (siding_left):
-			ss = -1.0
-		else:
-			ss = 1.0
-		var pos = get_pos() + get_node("bullet_shoot").get_pos()*Vector2(ss, 1.0)
-		
-		bi.set_pos(pos)
-		get_parent().add_child(bi)
+	# Horizontal Movement
+	var target_speed = 0
+	if (Input.is_action_pressed("move_left")):
+		target_speed += -1
+	if (Input.is_action_pressed("move_right")):
+		target_speed +=  1
 		
-		bi.set_linear_velocity(Vector2(800.0*ss, -80))
-		get_node("sprite/smoke").set_emitting(true)
-		get_node("sound").play("shoot")
-		PS2D.body_add_collision_exception(bi.get_rid(), get_rid()) # Make bullet and this not collide
-	else:
-		shoot_time += step
+	target_speed *= WALK_SPEED
+	linear_vel.x = lerp( linear_vel.x, target_speed, 0.1 )
 	
-	if (found_floor):
-		airborne_time = 0.0
-	else:
-		airborne_time += step # Time it spent in the air
+	# Jumping
+	if (Input.is_action_just_pressed("jump")):
+		linear_vel.y=-JUMP_SPEED
+		get_node("sound").play("jump")
 	
-	var on_floor = airborne_time < MAX_FLOOR_AIRBORNE_TIME
-
-	# Process jump
-	if (jumping):
-		if (lv.y > 0):
-			# Set off the jumping flag if going down
-			jumping = false
-		elif (not jump):
-			stopping_jump = true
-		
-		if (stopping_jump):
-			lv.y += STOP_JUMP_FORCE*step
+	# Shooting		
 	
-	if (on_floor):
-		# Process logic when character is on floor
-		if (move_left and not move_right):
-			if (lv.x > -WALK_MAX_VELOCITY):
-				lv.x -= WALK_ACCEL*step
-		elif (move_right and not move_left):
-			if (lv.x < WALK_MAX_VELOCITY):
-				lv.x += WALK_ACCEL*step
-		else:
-			var xv = abs(lv.x)
-			xv -= WALK_DEACCEL*step
-			if (xv < 0):
-				xv = 0
-			lv.x = sign(lv.x)*xv
+	if (Input.is_action_just_pressed("shoot")):
 		
-		# Check jump
-		if (not jumping and jump):
-			lv.y = -JUMP_VELOCITY
-			jumping = true
-			stopping_jump = false
-			get_node("sound").play("jump")
+		var bullet = preload("res://bullet.tscn").instance()
+		bullet.set_pos( get_node("sprite/bullet_shoot").get_global_pos() ) #use node for shoot position
+		bullet.set_linear_velocity( Vector2( sprite.get_scale().x * BULLET_VELOCITY,0 ) )		
+		bullet.add_collision_exception_with(self) # don't want player to collide with bullet
+		get_parent().add_child( bullet ) #don't want bullet to move with me, so add it as child of parent
+		get_node("sound").play("shoot")
+		shoot_time=0
 		
-		# Check siding
-		if (lv.x < 0 and move_left):
-			new_siding_left = true
-		elif (lv.x > 0 and move_right):
-			new_siding_left = false
-		if (jumping):
-			new_anim = "jumping"
-		elif (abs(lv.x) < 0.1):
-			if (shoot_time < MAX_SHOOT_POSE_TIME):
-				new_anim = "idle_weapon"
-			else:
-				new_anim = "idle"
-		else:
-			if (shoot_time < MAX_SHOOT_POSE_TIME):
-				new_anim = "run_weapon"
-			else:
-				new_anim = "run"
-	else:
-		# Process logic when the character is in the air
-		if (move_left and not move_right):
-			if (lv.x > -WALK_MAX_VELOCITY):
-				lv.x -= AIR_ACCEL*step
-		elif (move_right and not move_left):
-			if (lv.x < WALK_MAX_VELOCITY):
-				lv.x += AIR_ACCEL*step
-		else:
-			var xv = abs(lv.x)
-			xv -= AIR_DEACCEL*step
-			if (xv < 0):
-				xv = 0
-			lv.x = sign(lv.x)*xv
 		
-		if (lv.y < 0):
-			if (shoot_time < MAX_SHOOT_POSE_TIME):
-				new_anim = "jumping_weapon"
-			else:
-				new_anim = "jumping"
-		else:
-			if (shoot_time < MAX_SHOOT_POSE_TIME):
-				new_anim = "falling_weapon"
-			else:
-				new_anim = "falling"
+	### ANIMATION ###
+	
+	var new_anim="idle"
 	
-	# Update siding
-	if (new_siding_left != siding_left):
-		if (new_siding_left):
-			get_node("sprite").set_scale(Vector2(-1, 1))
+	if (on_floor):
+		if (linear_vel.x < -SIDING_CHANGE_SPEED):
+			sprite.set_scale( Vector2( -1, 1 ) )
+			new_anim="run"
+			
+		if (linear_vel.x > SIDING_CHANGE_SPEED):
+			sprite.set_scale( Vector2( 1, 1 ) )
+			new_anim="run"
+			
+	else:
+		
+		if (linear_vel.y < 0 ):
+			new_anim="jumping"
 		else:
-			get_node("sprite").set_scale(Vector2(1, 1))
+			new_anim="falling"
 		
-		siding_left = new_siding_left
+	if (shoot_time < SHOOT_TIME_SHOW_WEAPON):
+		new_anim+="_weapon"
 	
-	# Change animation
-	if (new_anim != anim):
-		anim = new_anim
+	if (new_anim!=anim):
+		anim=new_anim
 		get_node("anim").play(anim)
 	
-	shooting = shoot
 	
-	# Apply floor velocity
-	if (found_floor):
-		floor_h_velocity = s.get_contact_collider_velocity_at_pos(floor_index).x
-		lv.x += floor_h_velocity
-	
-	# Finally, apply gravity and set back the linear velocity
-	lv += s.get_total_gravity()*step
-	s.set_linear_velocity(lv)
-
-
 func _ready():
-	enemy = ResourceLoader.load("res://enemy.tscn")
-	
-#	if !Globals.has_singleton("Facebook"):
-#		return
-#	var Facebook = Globals.get_singleton("Facebook")
-#	var link = Globals.get("facebook/link")
-#	var icon = Globals.get("facebook/icon")
-#	var msg = "I just sneezed on your wall! Beat my score and Stop the Running nose!"
-#	var title = "I just sneezed on your wall!"
-#	Facebook.post("feed", msg, title, link, icon)
+	set_fixed_process(true)
+

+ 60 - 77
2d/platformer/player.tscn

@@ -1,4 +1,4 @@
-[gd_scene load_steps=25 format=1]
+[gd_scene load_steps=24 format=1]
 
 [ext_resource path="res://player.gd" type="Script" id=1]
 [ext_resource path="res://robot_demo.png" type="Texture" id=2]
@@ -11,22 +11,18 @@
 [ext_resource path="res://osb_jump.png" type="Texture" id=9]
 [ext_resource path="res://osb_fire.png" type="Texture" id=10]
 
-[sub_resource type="RayShape2D" id=1]
-
-custom_solver_bias = 0.5
-length = 20.0
-
-[sub_resource type="ConvexPolygonShape2D" id=2]
+[sub_resource type="CapsuleShape2D" id=1]
 
 custom_solver_bias = 0.0
-points = Vector2Array( -19.902, -24.8691, 19.3625, -24.6056, -0.138023, 16.5036 )
+radius = 10.0
+height = 44.4787
 
-[sub_resource type="ColorRamp" id=3]
+[sub_resource type="ColorRamp" id=2]
 
 offsets = FloatArray( 0, 1 )
 colors = ColorArray( 1, 1, 1, 1, 0, 0, 0, 0.0442478 )
 
-[sub_resource type="Animation" id=4]
+[sub_resource type="Animation" id=3]
 
 resource/name = "crouch"
 length = 0.01
@@ -35,9 +31,10 @@ 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]
+[sub_resource type="Animation" id=4]
 
 resource/name = "falling"
 length = 0.01
@@ -46,9 +43,10 @@ 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]
+[sub_resource type="Animation" id=5]
 
 resource/name = "falling_weapon"
 length = 0.5
@@ -57,9 +55,10 @@ 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]
+[sub_resource type="Animation" id=6]
 
 length = 7.0
 loop = true
@@ -67,9 +66,10 @@ 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]
+[sub_resource type="Animation" id=7]
 
 length = 0.5
 loop = true
@@ -77,9 +77,10 @@ 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]
+[sub_resource type="Animation" id=8]
 
 length = 0.5
 loop = true
@@ -87,9 +88,10 @@ 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]
+[sub_resource type="Animation" id=9]
 
 length = 0.5
 loop = true
@@ -97,9 +99,10 @@ 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]
+[sub_resource type="Animation" id=10]
 
 length = 1.25
 loop = true
@@ -107,9 +110,10 @@ 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]
+[sub_resource type="Animation" id=11]
 
 length = 1.25
 loop = true
@@ -117,9 +121,10 @@ 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]
+[sub_resource type="Animation" id=12]
 
 length = 1.25
 loop = true
@@ -127,40 +132,24 @@ 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]
+[sub_resource type="SampleLibrary" id=13]
 
+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"]
+[node name="player" type="KinematicBody2D"]
 
 input/pickable = false
 shapes/0/shape = SubResource( 1 )
-shapes/0/transform = Matrix32( 1, 0, 0, 1.76469, 0.291992, -12.1587 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0.291992, -0.835023 )
 shapes/0/trigger = false
-shapes/1/shape = SubResource( 2 )
-shapes/1/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
-shapes/1/trigger = false
 collision/layers = 1
 collision/mask = 1
-mode = 2
-mass = 3.0
-friction = 0.0
-bounce = 0.0
-gravity_scale = 1.0
-custom_integrator = true
-continuous_cd = 0
-contacts_reported = 3
-contact_monitor = false
-sleeping = false
-can_sleep = true
-velocity/linear = Vector2( 0, 0 )
-velocity/angular = 0.0
-damp_override/linear = -1.0
-damp_override/angular = -1.0
+collision/margin = 0.08
 script/script = ExtResource( 1 )
 
 [node name="sprite" type="Sprite" parent="."]
@@ -168,6 +157,7 @@ script/script = ExtResource( 1 )
 texture = ExtResource( 2 )
 vframes = 2
 hframes = 16
+frame = 22
 
 [node name="smoke" type="Particles2D" parent="sprite"]
 
@@ -199,23 +189,27 @@ params/hue_variation = 0.0
 params/anim_speed_scale = 1.0
 params/anim_initial_pos = 0.0
 randomness/spin_velocity = 2.0
-color/color_ramp = SubResource( 3 )
+color/color_ramp = SubResource( 2 )
+
+[node name="bullet_shoot" type="Position2D" parent="sprite"]
+
+transform/pos = Vector2( 30.6589, 6.13176 )
 
 [node name="anim" type="AnimationPlayer" parent="."]
 
 playback/process_mode = 1
 playback/default_blend_time = 0.0
 root/root = NodePath("..")
-anims/crouch = SubResource( 4 )
-anims/falling = SubResource( 5 )
-anims/falling_weapon = SubResource( 6 )
-anims/idle = SubResource( 7 )
-anims/idle_weapon = SubResource( 8 )
-anims/jumping = SubResource( 9 )
-anims/jumping_weapon = SubResource( 10 )
-anims/run = SubResource( 11 )
-anims/run_weapon = SubResource( 12 )
-anims/standing_weapon_ready = SubResource( 13 )
+anims/crouch = SubResource( 3 )
+anims/falling = SubResource( 4 )
+anims/falling_weapon = SubResource( 5 )
+anims/idle = SubResource( 6 )
+anims/idle_weapon = SubResource( 7 )
+anims/jumping = SubResource( 8 )
+anims/jumping_weapon = SubResource( 9 )
+anims/run = SubResource( 10 )
+anims/run_weapon = SubResource( 11 )
+anims/standing_weapon_ready = SubResource( 12 )
 playback/active = true
 playback/speed = 2.0
 blend_times = [  ]
@@ -231,6 +225,7 @@ limit/left = 0
 limit/top = 0
 limit/right = 10000000
 limit/bottom = 10000000
+limit/smoothed = false
 drag_margin/h_enabled = true
 drag_margin/v_enabled = true
 smoothing/enable = false
@@ -240,22 +235,17 @@ drag_margin/top = 0.2
 drag_margin/right = 0.2
 drag_margin/bottom = 0.2
 
-[node name="bullet_shoot" type="Position2D" parent="."]
-
-transform/pos = Vector2( 31.2428, 4.08784 )
-
 [node name="CollisionShape2D" type="CollisionShape2D" parent="."]
 
-transform/pos = Vector2( 0.291992, -12.1587 )
-transform/scale = Vector2( 1, 1.76469 )
+transform/pos = Vector2( 0.291992, -0.835023 )
 shape = SubResource( 1 )
 trigger = false
-_update_shape_index = -1
+_update_shape_index = 0
 
 [node name="sound" type="SamplePlayer" parent="."]
 
 config/polyphony = 1
-config/samples = SubResource( 14 )
+config/samples = SubResource( 13 )
 default/volume_db = 0.0
 default/pitch_scale = 1.0
 default/pan = 0.0
@@ -269,13 +259,6 @@ default/reverb_room = 2
 default/reverb_send = 0.0
 default/chorus_send = 0.0
 
-[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
-
-build_mode = 0
-polygon = Vector2Array( -0.138023, 16.5036, -19.902, -24.8691, 19.3625, -24.6056 )
-shape_range = Vector2( -1, -1 )
-trigger = false
-
 [node name="ui" type="CanvasLayer" parent="."]
 
 layer = 0

BIN
2d/platformer/scroll_bg_fg_1.png


BIN
2d/platformer/scroll_bg_fg_2.png


BIN
2d/platformer/scroll_bg_sky.png


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 6 - 7
2d/platformer/stage.tscn


BIN
2d/platformer/tiles_demo.png


+ 16 - 0
2d/platformer_dcc/bullet.gd

@@ -0,0 +1,16 @@
+
+extends RigidBody2D
+
+# Member variables
+var disabled = false
+
+
+func disable():
+	if (disabled):
+		return
+	get_node("anim").play("shutdown")
+	disabled = true
+
+
+func _ready():
+	get_node("Timer").start()

BIN
2d/platformer_dcc/bullet.png


+ 115 - 0
2d/platformer_dcc/bullet.tscn

@@ -0,0 +1,115 @@
+[gd_scene load_steps=6 format=1]
+
+[ext_resource path="res://bullet.gd" type="Script" id=1]
+[ext_resource path="res://bullet.png" type="Texture" id=2]
+
+[sub_resource type="CircleShape2D" id=1]
+
+custom_solver_bias = 0.0
+radius = 10.0
+
+[sub_resource type="ColorRamp" id=2]
+
+offsets = FloatArray( 0, 1 )
+colors = ColorArray( 1, 1, 1, 1, 1, 0, 0, 0 )
+
+[sub_resource type="Animation" id=3]
+
+length = 1.5
+loop = false
+step = 0.0
+tracks/0/type = "value"
+tracks/0/path = NodePath("particles:config/emitting")
+tracks/0/interp = 1
+tracks/0/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ false ] }
+tracks/1/type = "value"
+tracks/1/path = NodePath("sprite:visibility/self_opacity")
+tracks/1/interp = 1
+tracks/1/keys = { "cont":true, "times":FloatArray( 0, 1.00394 ), "transitions":FloatArray( 1, 1 ), "values":[ 1.0, 0.0 ] }
+tracks/2/type = "method"
+tracks/2/path = NodePath(".")
+tracks/2/interp = 1
+tracks/2/keys = { "times":FloatArray( 1.31 ), "transitions":FloatArray( 1 ), "values":[ { "args":[  ], "method":"queue_free" } ] }
+
+[node name="bullet" type="RigidBody2D"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 1 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+mode = 0
+mass = 1.0
+friction = 1.0
+bounce = 0.0
+gravity_scale = 1.0
+custom_integrator = false
+continuous_cd = 2
+contacts_reported = 0
+contact_monitor = false
+sleeping = false
+can_sleep = true
+velocity/linear = Vector2( 0, 0 )
+velocity/angular = 0.0
+damp_override/linear = -1.0
+damp_override/angular = -1.0
+script/script = ExtResource( 1 )
+
+[node name="particles" type="Particles2D" parent="."]
+
+visibility/opacity = 0.559322
+visibility/blend_mode = 1
+config/amount = 24
+config/lifetime = 0.1
+config/local_space = false
+config/texture = ExtResource( 2 )
+params/direction = 0.0
+params/spread = 10.0
+params/linear_velocity = 0.0
+params/spin_velocity = 0.0
+params/orbit_velocity = 0.0
+params/gravity_direction = 0.0
+params/gravity_strength = 0.0
+params/radial_accel = 0.0
+params/tangential_accel = 0.0
+params/damping = 0.0
+params/initial_angle = 0.0
+params/initial_size = 1.0
+params/final_size = 0.0
+params/hue_variation = 0.0
+params/anim_speed_scale = 1.0
+params/anim_initial_pos = 0.0
+color/color_ramp = SubResource( 2 )
+
+[node name="sprite" type="Sprite" parent="."]
+
+texture = ExtResource( 2 )
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+
+shape = SubResource( 1 )
+trigger = false
+_update_shape_index = -1
+
+[node name="Timer" type="Timer" parent="."]
+
+process_mode = 1
+wait_time = 1.0
+one_shot = true
+autostart = false
+
+[node name="anim" type="AnimationPlayer" parent="."]
+
+playback/process_mode = 1
+playback/default_blend_time = 0.0
+root/root = NodePath("..")
+anims/shutdown = SubResource( 3 )
+playback/active = true
+playback/speed = 1.0
+blend_times = [  ]
+autoplay = ""
+
+[connection signal="timeout" from="Timer" to="." method="disable"]
+
+

+ 19 - 0
2d/platformer_dcc/coin.gd

@@ -0,0 +1,19 @@
+
+extends Area2D
+
+# Member variables
+var taken = false
+
+
+func _on_body_enter( body ):
+	if (not taken and body extends preload("res://player.gd")):
+		get_node("anim").play("taken")
+		taken = true
+
+
+func _on_coin_area_enter(area):
+	pass # replace with function body
+
+
+func _on_coin_area_enter_shape(area_id, area, area_shape, area_shape):
+	pass # replace with function body

BIN
2d/platformer_dcc/coin.png


+ 146 - 0
2d/platformer_dcc/coin.tscn

@@ -0,0 +1,146 @@
+[gd_scene load_steps=10 format=1]
+
+[ext_resource path="res://coin.gd" type="Script" id=1]
+[ext_resource path="res://coin.png" type="Texture" id=2]
+[ext_resource path="res://sound_coin.wav" type="Sample" id=3]
+[ext_resource path="res://bullet.png" type="Texture" id=4]
+
+[sub_resource type="CircleShape2D" id=1]
+
+custom_solver_bias = 0.0
+radius = 10.0
+
+[sub_resource type="Animation" id=2]
+
+resource/name = "spin"
+length = 1.5
+loop = true
+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, 1.5 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1, 1 ), "values":[ 0, 1, 2, 3, 2, 1, 0 ] }
+
+[sub_resource type="Animation" id=3]
+
+length = 8.0
+loop = false
+step = 0.0
+tracks/0/type = "value"
+tracks/0/path = NodePath("sprite:frame")
+tracks/0/interp = 1
+tracks/0/keys = { "cont":true, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ 0 ] }
+tracks/1/type = "value"
+tracks/1/path = NodePath("sound:play/play")
+tracks/1/interp = 1
+tracks/1/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ "coin" ] }
+tracks/2/type = "value"
+tracks/2/path = NodePath("particles:visibility/self_opacity")
+tracks/2/interp = 1
+tracks/2/keys = { "cont":true, "times":FloatArray( 0, 1.66 ), "transitions":FloatArray( 1, 1 ), "values":[ 1.0, 0.0 ] }
+tracks/3/type = "value"
+tracks/3/path = NodePath("sprite:visibility/self_opacity")
+tracks/3/interp = 1
+tracks/3/keys = { "cont":true, "times":FloatArray( 0, 0.4 ), "transitions":FloatArray( 1, 1 ), "values":[ 1.0, 0.0 ] }
+tracks/4/type = "value"
+tracks/4/path = NodePath("particles:config/emitting")
+tracks/4/interp = 1
+tracks/4/keys = { "cont":false, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ true ] }
+tracks/5/type = "method"
+tracks/5/path = NodePath(".")
+tracks/5/interp = 1
+tracks/5/keys = { "times":FloatArray( 2.7 ), "transitions":FloatArray( 1 ), "values":[ { "args":[  ], "method":"queue_free" } ] }
+
+[sub_resource type="SampleLibrary" id=4]
+
+samples/coin = { "db":0.0, "pitch":1.0, "sample":ExtResource( 3 ) }
+
+[sub_resource type="ColorRamp" id=5]
+
+offsets = FloatArray( 0, 1 )
+colors = ColorArray( 1, 1, 1, 1, 0, 0, 0, 1 )
+
+[node name="coin" type="Area2D"]
+
+input/pickable = true
+shapes/0/shape = SubResource( 1 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+gravity_vec = Vector2( 0, 1 )
+gravity = 98.0
+linear_damp = 0.1
+angular_damp = 1.0
+script/script = ExtResource( 1 )
+
+[node name="sprite" type="Sprite" parent="."]
+
+texture = ExtResource( 2 )
+hframes = 4
+
+[node name="anim" type="AnimationPlayer" parent="."]
+
+playback/process_mode = 1
+playback/default_blend_time = 0.0
+root/root = NodePath("..")
+anims/spin = SubResource( 2 )
+anims/taken = SubResource( 3 )
+playback/active = true
+playback/speed = 3.0
+blend_times = [  ]
+autoplay = "spin"
+
+[node name="collision" type="CollisionShape2D" parent="."]
+
+shape = SubResource( 1 )
+trigger = false
+_update_shape_index = -1
+
+[node name="sound" type="SamplePlayer2D" parent="."]
+
+params/volume_db = 0.0
+params/pitch_scale = 1.0
+params/attenuation/min_distance = 1.0
+params/attenuation/max_distance = 2048.0
+params/attenuation/distance_exp = 1.0
+config/polyphony = 1
+config/samples = SubResource( 4 )
+config/pitch_random = 0.0
+
+[node name="particles" type="Particles2D" parent="."]
+
+visibility/blend_mode = 1
+config/amount = 8
+config/lifetime = 0.4
+config/emitting = false
+config/half_extents = Vector2( 5, 5 )
+config/texture = ExtResource( 4 )
+params/direction = 0.0
+params/spread = 10.0
+params/linear_velocity = 0.0
+params/spin_velocity = 0.0
+params/orbit_velocity = 0.0
+params/gravity_direction = 0.0
+params/gravity_strength = 0.0
+params/radial_accel = 0.0
+params/tangential_accel = 0.0
+params/damping = 0.0
+params/initial_angle = 0.0
+params/initial_size = 0.2
+params/final_size = 0.2
+params/hue_variation = 0.0
+params/anim_speed_scale = 1.0
+params/anim_initial_pos = 0.0
+color/color_ramp = SubResource( 5 )
+
+[node name="enabler" type="VisibilityEnabler2D" parent="."]
+
+rect = Rect2( -10, -10, 20, 20 )
+enabler/pause_animations = true
+enabler/freeze_bodies = true
+enabler/pause_particles = true
+enabler/process_parent = false
+enabler/fixed_process_parent = false
+
+[connection signal="body_enter" from="." to="." method="_on_body_enter"]
+
+

+ 83 - 0
2d/platformer_dcc/enemy.gd

@@ -0,0 +1,83 @@
+
+extends RigidBody2D
+
+# Member variables
+const STATE_WALKING = 0
+const STATE_DYING = 1
+
+var state = STATE_WALKING
+
+var direction = -1
+var anim = ""
+
+var rc_left = null
+var rc_right = null
+var WALK_SPEED = 50
+
+var bullet_class = preload("res://bullet.gd")
+
+
+func _die():
+	queue_free()
+
+
+func _pre_explode():
+	# Stay there
+	clear_shapes()
+	set_mode(MODE_STATIC)
+	get_node("sound").play("explode")
+
+
+func _integrate_forces(s):
+	var lv = s.get_linear_velocity()
+	var new_anim = anim
+
+	if (state == STATE_DYING):
+		new_anim = "explode"
+	elif (state == STATE_WALKING):
+		new_anim = "walk"
+		
+		var wall_side = 0.0
+		
+		for i in range(s.get_contact_count()):
+			var cc = s.get_contact_collider_object(i)
+			var dp = s.get_contact_local_normal(i)
+			
+			if (cc):
+				if (cc extends bullet_class and not cc.disabled):
+					set_mode(MODE_RIGID)
+					state = STATE_DYING
+					#lv = s.get_contact_local_normal(i)*400
+					s.set_angular_velocity(sign(dp.x)*33.0)
+					set_friction(1)
+					cc.disable()
+					get_node("sound").play("hit")
+					break
+			
+			if (dp.x > 0.9):
+				wall_side = 1.0
+			elif (dp.x < -0.9):
+				wall_side = -1.0
+		
+		if (wall_side != 0 and wall_side != direction):
+			direction = -direction
+			get_node("sprite").set_scale(Vector2(-direction, 1))
+		if (direction < 0 and not rc_left.is_colliding() and rc_right.is_colliding()):
+			direction = -direction
+			get_node("sprite").set_scale(Vector2(-direction, 1))
+		elif (direction > 0 and not rc_right.is_colliding() and rc_left.is_colliding()):
+			direction = -direction
+			get_node("sprite").set_scale(Vector2(-direction, 1))
+		
+		lv.x = direction*WALK_SPEED
+	
+	if(anim != new_anim):
+		anim = new_anim
+		get_node("anim").play(anim)
+	
+	s.set_linear_velocity(lv)
+
+
+func _ready():
+	rc_left = get_node("raycast_left")
+	rc_right = get_node("raycast_right")

BIN
2d/platformer_dcc/enemy.png


+ 206 - 0
2d/platformer_dcc/enemy.tscn

@@ -0,0 +1,206 @@
+[gd_scene load_steps=12 format=1]
+
+[ext_resource path="res://enemy.gd" type="Script" id=1]
+[ext_resource path="res://enemy.png" type="Texture" id=2]
+[ext_resource path="res://bullet.png" type="Texture" id=3]
+[ext_resource path="res://sound_explode.wav" type="Sample" id=4]
+[ext_resource path="res://sound_hit.wav" type="Sample" id=5]
+
+[sub_resource type="CircleShape2D" id=1]
+
+custom_solver_bias = 0.0
+radius = 14.0
+
+[sub_resource type="Animation" id=2]
+
+resource/name = "explode"
+length = 6.0
+loop = false
+step = 0.0
+tracks/0/type = "value"
+tracks/0/path = NodePath("sprite:visibility/self_opacity")
+tracks/0/interp = 1
+tracks/0/keys = { "cont":true, "times":FloatArray( 3.58422, 4.33851 ), "transitions":FloatArray( 1, 1 ), "values":[ 1.0, 0.0 ] }
+tracks/1/type = "value"
+tracks/1/path = NodePath("sprite:frame")
+tracks/1/interp = 1
+tracks/1/keys = { "cont":true, "times":FloatArray( 0 ), "transitions":FloatArray( 1 ), "values":[ 4 ] }
+tracks/2/type = "value"
+tracks/2/path = NodePath("Particles2D:config/emitting")
+tracks/2/interp = 1
+tracks/2/keys = { "cont":false, "times":FloatArray( 3.47394 ), "transitions":FloatArray( 1 ), "values":[ true ] }
+tracks/3/type = "method"
+tracks/3/path = NodePath(".")
+tracks/3/interp = 1
+tracks/3/keys = { "times":FloatArray( 3.20357, 5.07305 ), "transitions":FloatArray( 1, 1 ), "values":[ { "args":[  ], "method":"_pre_explode" }, { "args":[  ], "method":"_die" } ] }
+
+[sub_resource type="Animation" id=3]
+
+length = 6.75
+loop = true
+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.75, 1.5, 2.25, 3, 3.75, 4.5, 5.25, 6, 6.75 ), "transitions":FloatArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), "values":[ 5, 6, 5, 6, 5, 6, 7, 6, 7, 5 ] }
+
+[sub_resource type="Animation" id=4]
+
+resource/name = "walk"
+length = 1.25
+loop = true
+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 ] }
+
+[sub_resource type="ColorRamp" id=5]
+
+offsets = FloatArray( 0, 1 )
+colors = ColorArray( 1, 0.884956, 0.823009, 1, 0.768627, 0.389381, 0, 0 )
+
+[sub_resource type="SampleLibrary" id=6]
+
+samples/explode = { "db":0.0, "pitch":1.0, "sample":ExtResource( 4 ) }
+samples/hit = { "db":0.0, "pitch":1.0, "sample":ExtResource( 5 ) }
+
+[node name="enemy" type="RigidBody2D"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 1 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, -1.08072, -2.16144 )
+shapes/0/trigger = false
+shapes/1/shape = SubResource( 1 )
+shapes/1/transform = Matrix32( 1, 0, 0, 1, 6.48431, 3.24216 )
+shapes/1/trigger = false
+shapes/2/shape = SubResource( 1 )
+shapes/2/transform = Matrix32( 1, 0, 0, 1, -12.495, 3.53415 )
+shapes/2/trigger = false
+collision/layers = 1
+collision/mask = 1
+mode = 2
+mass = 1.0
+friction = 0.0
+bounce = 0.0
+gravity_scale = 1.0
+custom_integrator = false
+continuous_cd = 0
+contacts_reported = 4
+contact_monitor = false
+sleeping = false
+can_sleep = true
+velocity/linear = Vector2( 0, 0 )
+velocity/angular = 0.0
+damp_override/linear = -1.0
+damp_override/angular = -1.0
+script/script = ExtResource( 1 )
+
+[node name="enabler" type="VisibilityEnabler2D" parent="."]
+
+transform/pos = Vector2( 16.2569, 11.0034 )
+transform/scale = Vector2( 23.5056, 10.8629 )
+rect = Rect2( -10, -10, 20, 20 )
+enabler/pause_animations = true
+enabler/freeze_bodies = true
+enabler/pause_particles = true
+enabler/process_parent = false
+enabler/fixed_process_parent = false
+
+[node name="anim" type="AnimationPlayer" parent="."]
+
+playback/process_mode = 1
+playback/default_blend_time = 0.0
+root/root = NodePath("..")
+anims/explode = SubResource( 2 )
+anims/idle = SubResource( 3 )
+anims/walk = SubResource( 4 )
+playback/active = true
+playback/speed = 3.0
+blend_times = [  ]
+autoplay = ""
+
+[node name="sprite" type="Sprite" parent="."]
+
+texture = ExtResource( 2 )
+hframes = 8
+frame = 4
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+
+transform/pos = Vector2( -1.08072, -2.16144 )
+shape = SubResource( 1 )
+trigger = false
+_update_shape_index = -1
+
+[node name="CollisionShape2D 2" type="CollisionShape2D" parent="."]
+
+transform/pos = Vector2( 6.48431, 3.24216 )
+shape = SubResource( 1 )
+trigger = false
+_update_shape_index = -1
+
+[node name="CollisionShape2D 3" type="CollisionShape2D" parent="."]
+
+transform/pos = Vector2( -12.495, 3.53415 )
+shape = SubResource( 1 )
+trigger = false
+_update_shape_index = -1
+
+[node name="raycast_left" type="RayCast2D" parent="."]
+
+transform/pos = Vector2( -33.2868, -9.34363 )
+enabled = true
+cast_to = Vector2( 0, 45 )
+layer_mask = 1
+type_mask = 15
+
+[node name="raycast_right" type="RayCast2D" parent="."]
+
+transform/pos = Vector2( 29.1987, -9.34363 )
+enabled = true
+cast_to = Vector2( 0, 45 )
+layer_mask = 1
+type_mask = 15
+
+[node name="Particles2D" type="Particles2D" parent="."]
+
+visibility/self_opacity = 0.121212
+visibility/blend_mode = 1
+config/amount = 32
+config/lifetime = 0.5
+config/emit_timeout = 0.5
+config/emitting = false
+config/explosiveness = 0.1
+config/texture = ExtResource( 3 )
+params/direction = 0.0
+params/spread = 180.0
+params/linear_velocity = 90.0
+params/spin_velocity = 2.0
+params/orbit_velocity = 0.0
+params/gravity_direction = 0.0
+params/gravity_strength = 9.8
+params/radial_accel = 0.0
+params/tangential_accel = 0.0
+params/damping = 0.0
+params/initial_angle = 0.0
+params/initial_size = 2.0
+params/final_size = 3.0
+params/hue_variation = 0.0
+params/anim_speed_scale = 1.0
+params/anim_initial_pos = 0.0
+randomness/spin_velocity = 1.0
+color/color_ramp = SubResource( 5 )
+
+[node name="sound" type="SamplePlayer2D" parent="."]
+
+params/volume_db = 0.0
+params/pitch_scale = 1.0
+params/attenuation/min_distance = 1.0
+params/attenuation/max_distance = 2048.0
+params/attenuation/distance_exp = 1.0
+config/polyphony = 3
+config/samples = SubResource( 6 )
+config/pitch_random = 0.0
+
+

+ 42 - 0
2d/platformer_dcc/engine.cfg

@@ -0,0 +1,42 @@
+[application]
+
+name="Dynamic Character Control-Based Platformer"
+main_scene="res://stage.tscn"
+icon="res://icon.png"
+name_es="Plataformero"
+target_fps="60"
+
+[display]
+
+width=800
+height=480
+stretch_mode="2d"
+stretch_aspect="keep_height"
+
+[image_loader]
+
+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)]
+
+[physics_2d]
+
+default_gravity=700
+
+[rasterizer]
+
+use_pixel_snap=true
+
+[render]
+
+mipmap_policy=1
+
+[texture_import]
+
+filter=false

+ 42 - 0
2d/platformer_dcc/engine.cfg~

@@ -0,0 +1,42 @@
+[application]
+
+name="Platformer"
+main_scene="res://stage.tscn"
+icon="res://icon.png"
+name_es="Plataformero"
+target_fps="60"
+
+[display]
+
+width=800
+height=480
+stretch_mode="2d"
+stretch_aspect="keep_height"
+
+[image_loader]
+
+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)]
+
+[physics_2d]
+
+default_gravity=700
+
+[rasterizer]
+
+use_pixel_snap=true
+
+[render]
+
+mipmap_policy=1
+
+[texture_import]
+
+filter=false

BIN
2d/platformer_dcc/icon.png


+ 20 - 0
2d/platformer_dcc/moving_platform.gd

@@ -0,0 +1,20 @@
+
+extends Node2D
+
+# Member variables
+export var motion = Vector2()
+export var cycle = 1.0
+var accum = 0.0
+
+
+func _fixed_process(delta):
+	accum += delta*(1.0/cycle)*PI*2.0
+	accum = fmod(accum, PI*2.0)
+	var d = sin(accum)
+	var xf = Matrix32()
+	xf[2]= motion*d 
+	get_node("platform").set_transform(xf)
+
+
+func _ready():
+	set_fixed_process(true)

BIN
2d/platformer_dcc/moving_platform.png


+ 52 - 0
2d/platformer_dcc/moving_platform.tscn

@@ -0,0 +1,52 @@
+[gd_scene load_steps=4 format=1]
+
+[ext_resource path="res://moving_platform.gd" type="Script" id=1]
+[ext_resource path="res://moving_platform.png" type="Texture" id=2]
+
+[sub_resource type="ConvexPolygonShape2D" id=1]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -88, 24, -88, -24, 88, -24, 88, 24 )
+
+[node name="moving_platform" type="Node2D"]
+
+script/script = ExtResource( 1 )
+motion = Vector2( 0, 0 )
+cycle = 1.0
+
+[node name="platform" type="RigidBody2D" parent="."]
+
+input/pickable = false
+shapes/0/shape = SubResource( 1 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+mode = 3
+mass = 1.0
+friction = 1.0
+bounce = 0.0
+gravity_scale = 1.0
+custom_integrator = false
+continuous_cd = 0
+contacts_reported = 0
+contact_monitor = false
+sleeping = false
+can_sleep = true
+velocity/linear = Vector2( 0, 0 )
+velocity/angular = 0.0
+damp_override/linear = -1.0
+damp_override/angular = -1.0
+
+[node name="Sprite" type="Sprite" parent="platform"]
+
+texture = ExtResource( 2 )
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="platform"]
+
+build_mode = 0
+polygon = Vector2Array( -88, -24, 88, -24, 88, 24, -88, 24 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+

BIN
2d/platformer_dcc/music.ogg


BIN
2d/platformer_dcc/one_way_platform.png


+ 36 - 0
2d/platformer_dcc/one_way_platform.tscn

@@ -0,0 +1,36 @@
+[gd_scene load_steps=3 format=1]
+
+[ext_resource path="res://one_way_platform.png" type="Texture" id=1]
+
+[sub_resource type="RectangleShape2D" id=1]
+
+custom_solver_bias = 0.0
+extents = Vector2( 100, 10 )
+
+[node name="one_way_platform" type="StaticBody2D"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 1 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 1.46304, -13.1672 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+one_way_collision/direction = Vector2( 0, 1 )
+one_way_collision/max_depth = 20.0
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="sprite" type="Sprite" parent="."]
+
+texture = ExtResource( 1 )
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+
+transform/pos = Vector2( 1.46304, -13.1672 )
+shape = SubResource( 1 )
+trigger = false
+_update_shape_index = -1
+
+

BIN
2d/platformer_dcc/osb_fire.png


BIN
2d/platformer_dcc/osb_jump.png


BIN
2d/platformer_dcc/osb_left.png


BIN
2d/platformer_dcc/osb_right.png


+ 101 - 0
2d/platformer_dcc/parallax_bg.tscn

@@ -0,0 +1,101 @@
+[gd_scene load_steps=7 format=1]
+
+[ext_resource path="res://scroll_bg_sky.png" type="Texture" id=1]
+[ext_resource path="res://scroll_bg_cloud_1.png" type="Texture" id=2]
+[ext_resource path="res://scroll_bg_cloud_2.png" type="Texture" id=3]
+[ext_resource path="res://scroll_bg_cloud_3.png" type="Texture" id=4]
+[ext_resource path="res://scroll_bg_fg_2.png" type="Texture" id=5]
+[ext_resource path="res://scroll_bg_fg_1.png" type="Texture" id=6]
+
+[node name="parallax_bg" type="ParallaxBackground"]
+
+layer = -1
+offset = Vector2( 0, 0 )
+rotation = 0.0
+scale = Vector2( 1, 1 )
+scroll/offset = Vector2( 0, 0 )
+scroll/base_offset = Vector2( 0, 0 )
+scroll/base_scale = Vector2( 0.7, 0 )
+scroll/limit_begin = Vector2( 0, 0 )
+scroll/limit_end = Vector2( 0, 0 )
+scroll/ignore_camera_zoom = false
+
+[node name="sky" type="ParallaxLayer" parent="."]
+
+motion/scale = Vector2( 1, 1 )
+motion/mirroring = Vector2( 800, 0 )
+
+[node name="Sprite" type="Sprite" parent="sky"]
+
+transform/scale = Vector2( 32, 0.94 )
+texture = ExtResource( 1 )
+centered = false
+
+[node name="clouds" type="ParallaxLayer" parent="."]
+
+motion/scale = Vector2( 0.1, 1 )
+motion/mirroring = Vector2( 800, 0 )
+
+[node name="Sprite" type="Sprite" parent="clouds"]
+
+transform/pos = Vector2( 28, 127 )
+texture = ExtResource( 2 )
+centered = false
+
+[node name="Sprite 2" type="Sprite" parent="clouds"]
+
+transform/pos = Vector2( 404, 24 )
+texture = ExtResource( 2 )
+centered = false
+
+[node name="Sprite 3" type="Sprite" parent="clouds"]
+
+transform/pos = Vector2( 154, 46 )
+texture = ExtResource( 3 )
+centered = false
+
+[node name="Sprite 4" type="Sprite" parent="clouds"]
+
+transform/pos = Vector2( 525, 130 )
+texture = ExtResource( 3 )
+centered = false
+
+[node name="Sprite 5" type="Sprite" parent="clouds"]
+
+transform/pos = Vector2( 255, 158 )
+texture = ExtResource( 4 )
+centered = false
+
+[node name="Sprite 6" type="Sprite" parent="clouds"]
+
+transform/pos = Vector2( 674, 70 )
+texture = ExtResource( 4 )
+centered = false
+
+[node name="mount_ 2" type="ParallaxLayer" parent="."]
+
+motion/scale = Vector2( 0.2, 1 )
+motion/mirroring = Vector2( 800, 0 )
+
+[node name="Sprite" type="Sprite" parent="mount_ 2"]
+
+transform/pos = Vector2( 0, 225 )
+texture = ExtResource( 5 )
+centered = false
+region = true
+region_rect = Rect2( 0, 0, 800, 256 )
+
+[node name="mount_1" type="ParallaxLayer" parent="."]
+
+motion/scale = Vector2( 0.4, 1 )
+motion/mirroring = Vector2( 800, 0 )
+
+[node name="Sprite" type="Sprite" parent="mount_1"]
+
+transform/pos = Vector2( 0, 225 )
+texture = ExtResource( 6 )
+centered = false
+region = true
+region_rect = Rect2( 0, 0, 800, 256 )
+
+

+ 0 - 0
2d/platformer/plank.png → 2d/platformer_dcc/plank.png


+ 0 - 0
2d/platformer/plankpin.png → 2d/platformer_dcc/plankpin.png


+ 232 - 0
2d/platformer_dcc/player.gd

@@ -0,0 +1,232 @@
+
+extends RigidBody2D
+
+# Character Demo, written by Juan Linietsky.
+#
+# Implementation of a 2D Character controller.
+# This implementation uses the physics engine for
+# controlling a character, in a very similar way
+# than a 3D character controller would be implemented.
+#
+# Using the physics engine for this has the main
+# advantages:
+# -Easy to write.
+# -Interaction with other physics-based objects is free
+# -Only have to deal with the object linear velocity, not position
+# -All collision/area framework available
+# 
+# But also has the following disadvantages:
+#  
+# -Objects may bounce a little bit sometimes
+# -Going up ramps sends the chracter flying up, small hack is needed.
+# -A ray collider is needed to avoid sliding down on ramps and  
+#   undesiderd bumps, small steps and rare numerical precision errors.
+#   (another alternative may be to turn on friction when the character is not moving).
+# -Friction cant be used, so floor velocity must be considered
+#  for moving platforms.
+
+# Member variables
+var anim = ""
+var siding_left = false
+var jumping = false
+var stopping_jump = false
+var shooting = false
+
+var WALK_ACCEL = 800.0
+var WALK_DEACCEL = 800.0
+var WALK_MAX_VELOCITY = 200.0
+var AIR_ACCEL = 200.0
+var AIR_DEACCEL = 200.0
+var JUMP_VELOCITY = 460
+var STOP_JUMP_FORCE = 900.0
+
+var MAX_FLOOR_AIRBORNE_TIME = 0.15
+
+var airborne_time = 1e20
+var shoot_time = 1e20
+
+var MAX_SHOOT_POSE_TIME = 0.3
+
+var bullet = preload("res://bullet.tscn")
+
+var floor_h_velocity = 0.0
+var enemy
+
+
+func _integrate_forces(s):
+	var lv = s.get_linear_velocity()
+	var step = s.get_step()
+	
+	var new_anim = anim
+	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")
+	
+	if spawn:
+		var e = enemy.instance()
+		var p = get_pos()
+		p.y = p.y - 100
+		e.set_pos(p)
+		get_parent().add_child(e)
+	
+	# Deapply prev floor velocity
+	lv.x -= floor_h_velocity
+	floor_h_velocity = 0.0
+	
+	# Find the floor (a contact with upwards facing collision normal)
+	var found_floor = false
+	var floor_index = -1
+	
+	for x in range(s.get_contact_count()):
+		var ci = s.get_contact_local_normal(x)
+		if (ci.dot(Vector2(0, -1)) > 0.6):
+			found_floor = true
+			floor_index = x
+	
+	# A good idea when impementing characters of all kinds,
+	# compensates for physics imprecission, as well as human reaction delay.
+	if (shoot and not shooting):
+		shoot_time = 0
+		var bi = bullet.instance()
+		var ss
+		if (siding_left):
+			ss = -1.0
+		else:
+			ss = 1.0
+		var pos = get_pos() + get_node("bullet_shoot").get_pos()*Vector2(ss, 1.0)
+		
+		bi.set_pos(pos)
+		get_parent().add_child(bi)
+		
+		bi.set_linear_velocity(Vector2(800.0*ss, -80))
+		get_node("sprite/smoke").set_emitting(true)
+		get_node("sound").play("shoot")
+		PS2D.body_add_collision_exception(bi.get_rid(), get_rid()) # Make bullet and this not collide
+	else:
+		shoot_time += step
+	
+	if (found_floor):
+		airborne_time = 0.0
+	else:
+		airborne_time += step # Time it spent in the air
+	
+	var on_floor = airborne_time < MAX_FLOOR_AIRBORNE_TIME
+
+	# Process jump
+	if (jumping):
+		if (lv.y > 0):
+			# Set off the jumping flag if going down
+			jumping = false
+		elif (not jump):
+			stopping_jump = true
+		
+		if (stopping_jump):
+			lv.y += STOP_JUMP_FORCE*step
+	
+	if (on_floor):
+		# Process logic when character is on floor
+		if (move_left and not move_right):
+			if (lv.x > -WALK_MAX_VELOCITY):
+				lv.x -= WALK_ACCEL*step
+		elif (move_right and not move_left):
+			if (lv.x < WALK_MAX_VELOCITY):
+				lv.x += WALK_ACCEL*step
+		else:
+			var xv = abs(lv.x)
+			xv -= WALK_DEACCEL*step
+			if (xv < 0):
+				xv = 0
+			lv.x = sign(lv.x)*xv
+		
+		# Check jump
+		if (not jumping and jump):
+			lv.y = -JUMP_VELOCITY
+			jumping = true
+			stopping_jump = false
+			get_node("sound").play("jump")
+		
+		# Check siding
+		if (lv.x < 0 and move_left):
+			new_siding_left = true
+		elif (lv.x > 0 and move_right):
+			new_siding_left = false
+		if (jumping):
+			new_anim = "jumping"
+		elif (abs(lv.x) < 0.1):
+			if (shoot_time < MAX_SHOOT_POSE_TIME):
+				new_anim = "idle_weapon"
+			else:
+				new_anim = "idle"
+		else:
+			if (shoot_time < MAX_SHOOT_POSE_TIME):
+				new_anim = "run_weapon"
+			else:
+				new_anim = "run"
+	else:
+		# Process logic when the character is in the air
+		if (move_left and not move_right):
+			if (lv.x > -WALK_MAX_VELOCITY):
+				lv.x -= AIR_ACCEL*step
+		elif (move_right and not move_left):
+			if (lv.x < WALK_MAX_VELOCITY):
+				lv.x += AIR_ACCEL*step
+		else:
+			var xv = abs(lv.x)
+			xv -= AIR_DEACCEL*step
+			if (xv < 0):
+				xv = 0
+			lv.x = sign(lv.x)*xv
+		
+		if (lv.y < 0):
+			if (shoot_time < MAX_SHOOT_POSE_TIME):
+				new_anim = "jumping_weapon"
+			else:
+				new_anim = "jumping"
+		else:
+			if (shoot_time < MAX_SHOOT_POSE_TIME):
+				new_anim = "falling_weapon"
+			else:
+				new_anim = "falling"
+	
+	# Update siding
+	if (new_siding_left != siding_left):
+		if (new_siding_left):
+			get_node("sprite").set_scale(Vector2(-1, 1))
+		else:
+			get_node("sprite").set_scale(Vector2(1, 1))
+		
+		siding_left = new_siding_left
+	
+	# Change animation
+	if (new_anim != anim):
+		anim = new_anim
+		get_node("anim").play(anim)
+	
+	shooting = shoot
+	
+	# Apply floor velocity
+	if (found_floor):
+		floor_h_velocity = s.get_contact_collider_velocity_at_pos(floor_index).x
+		lv.x += floor_h_velocity
+	
+	# Finally, apply gravity and set back the linear velocity
+	lv += s.get_total_gravity()*step
+	s.set_linear_velocity(lv)
+
+
+func _ready():
+	enemy = ResourceLoader.load("res://enemy.tscn")
+	
+#	if !Globals.has_singleton("Facebook"):
+#		return
+#	var Facebook = Globals.get_singleton("Facebook")
+#	var link = Globals.get("facebook/link")
+#	var icon = Globals.get("facebook/icon")
+#	var msg = "I just sneezed on your wall! Beat my score and Stop the Running nose!"
+#	var title = "I just sneezed on your wall!"
+#	Facebook.post("feed", msg, title, link, icon)

+ 330 - 0
2d/platformer_dcc/player.tscn

@@ -0,0 +1,330 @@
+[gd_scene load_steps=25 format=1]
+
+[ext_resource path="res://player.gd" type="Script" id=1]
+[ext_resource path="res://robot_demo.png" type="Texture" id=2]
+[ext_resource path="res://bullet.png" type="Texture" id=3]
+[ext_resource path="res://sound_coin.wav" type="Sample" id=4]
+[ext_resource path="res://sound_jump.wav" type="Sample" id=5]
+[ext_resource path="res://sound_shoot.wav" type="Sample" id=6]
+[ext_resource path="res://osb_left.png" type="Texture" id=7]
+[ext_resource path="res://osb_right.png" type="Texture" id=8]
+[ext_resource path="res://osb_jump.png" type="Texture" id=9]
+[ext_resource path="res://osb_fire.png" type="Texture" id=10]
+
+[sub_resource type="RayShape2D" id=1]
+
+custom_solver_bias = 0.5
+length = 20.0
+
+[sub_resource type="ConvexPolygonShape2D" id=2]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -19.902, -24.8691, 19.3625, -24.6056, -0.138023, 16.5036 )
+
+[sub_resource type="ColorRamp" id=3]
+
+offsets = FloatArray( 0, 1 )
+colors = ColorArray( 1, 1, 1, 1, 0, 0, 0, 0.0442478 )
+
+[sub_resource type="Animation" id=4]
+
+resource/name = "crouch"
+length = 0.01
+loop = true
+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 ] }
+
+[sub_resource type="Animation" id=5]
+
+resource/name = "falling"
+length = 0.01
+loop = true
+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 ] }
+
+[sub_resource type="Animation" id=6]
+
+resource/name = "falling_weapon"
+length = 0.5
+loop = true
+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 ] }
+
+[sub_resource type="Animation" id=7]
+
+length = 7.0
+loop = true
+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 ] }
+
+[sub_resource type="Animation" id=8]
+
+length = 0.5
+loop = true
+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 ] }
+
+[sub_resource type="Animation" id=9]
+
+length = 0.5
+loop = true
+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 ] }
+
+[sub_resource type="Animation" id=10]
+
+length = 0.5
+loop = true
+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 ] }
+
+[sub_resource type="Animation" id=11]
+
+length = 1.25
+loop = true
+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 ] }
+
+[sub_resource type="Animation" id=12]
+
+length = 1.25
+loop = true
+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 ] }
+
+[sub_resource type="Animation" id=13]
+
+length = 1.25
+loop = true
+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 ] }
+
+[sub_resource type="SampleLibrary" id=14]
+
+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"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 1 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1.76469, 0.291992, -12.1587 )
+shapes/0/trigger = false
+shapes/1/shape = SubResource( 2 )
+shapes/1/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/1/trigger = false
+collision/layers = 1
+collision/mask = 1
+mode = 2
+mass = 3.0
+friction = 0.0
+bounce = 0.0
+gravity_scale = 1.0
+custom_integrator = true
+continuous_cd = 0
+contacts_reported = 3
+contact_monitor = false
+sleeping = false
+can_sleep = true
+velocity/linear = Vector2( 0, 0 )
+velocity/angular = 0.0
+damp_override/linear = -1.0
+damp_override/angular = -1.0
+script/script = ExtResource( 1 )
+
+[node name="sprite" type="Sprite" parent="."]
+
+texture = ExtResource( 2 )
+vframes = 2
+hframes = 16
+
+[node name="smoke" type="Particles2D" parent="sprite"]
+
+visibility/self_opacity = 0.363636
+visibility/blend_mode = 1
+transform/pos = Vector2( 20.7312, 3.21187 )
+transform/rot = 83.4504
+config/amount = 4
+config/lifetime = 0.3
+config/emit_timeout = 0.3
+config/emitting = false
+config/local_space = false
+config/explosiveness = 0.1
+config/texture = ExtResource( 3 )
+params/direction = 0.0
+params/spread = 180.0
+params/linear_velocity = 20.0
+params/spin_velocity = 1.0
+params/orbit_velocity = 0.0
+params/gravity_direction = 0.0
+params/gravity_strength = 9.8
+params/radial_accel = 0.0
+params/tangential_accel = 0.0
+params/damping = 0.0
+params/initial_angle = 0.0
+params/initial_size = 2.0
+params/final_size = 2.0
+params/hue_variation = 0.0
+params/anim_speed_scale = 1.0
+params/anim_initial_pos = 0.0
+randomness/spin_velocity = 2.0
+color/color_ramp = SubResource( 3 )
+
+[node name="anim" type="AnimationPlayer" parent="."]
+
+playback/process_mode = 1
+playback/default_blend_time = 0.0
+root/root = NodePath("..")
+anims/crouch = SubResource( 4 )
+anims/falling = SubResource( 5 )
+anims/falling_weapon = SubResource( 6 )
+anims/idle = SubResource( 7 )
+anims/idle_weapon = SubResource( 8 )
+anims/jumping = SubResource( 9 )
+anims/jumping_weapon = SubResource( 10 )
+anims/run = SubResource( 11 )
+anims/run_weapon = SubResource( 12 )
+anims/standing_weapon_ready = SubResource( 13 )
+playback/active = true
+playback/speed = 2.0
+blend_times = [  ]
+autoplay = ""
+
+[node name="camera" type="Camera2D" parent="."]
+
+anchor_mode = 1
+rotating = false
+current = true
+zoom = Vector2( 1, 1 )
+limit/left = 0
+limit/top = 0
+limit/right = 10000000
+limit/bottom = 10000000
+drag_margin/h_enabled = true
+drag_margin/v_enabled = true
+smoothing/enable = false
+smoothing/speed = 5.0
+drag_margin/left = 0.2
+drag_margin/top = 0.2
+drag_margin/right = 0.2
+drag_margin/bottom = 0.2
+
+[node name="bullet_shoot" type="Position2D" parent="."]
+
+transform/pos = Vector2( 31.2428, 4.08784 )
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+
+transform/pos = Vector2( 0.291992, -12.1587 )
+transform/scale = Vector2( 1, 1.76469 )
+shape = SubResource( 1 )
+trigger = false
+_update_shape_index = -1
+
+[node name="sound" type="SamplePlayer" parent="."]
+
+config/polyphony = 1
+config/samples = SubResource( 14 )
+default/volume_db = 0.0
+default/pitch_scale = 1.0
+default/pan = 0.0
+default/depth = 0.0
+default/height = 0.0
+default/filter/type = 0
+default/filter/cutoff = 0.0
+default/filter/resonance = 0.0
+default/filter/gain = 0.0
+default/reverb_room = 2
+default/reverb_send = 0.0
+default/chorus_send = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
+
+build_mode = 0
+polygon = Vector2Array( -0.138023, 16.5036, -19.902, -24.8691, 19.3625, -24.6056 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="ui" type="CanvasLayer" parent="."]
+
+layer = 0
+offset = Vector2( 0, 0 )
+rotation = 0.0
+scale = Vector2( 1, 1 )
+
+[node name="left" type="TouchScreenButton" parent="ui"]
+
+transform/pos = Vector2( 27.7593, 360.87 )
+transform/scale = Vector2( 1.49157, 1.46265 )
+normal = ExtResource( 7 )
+pressed = null
+bitmask = null
+passby_press = true
+action = "move_left"
+visibility_mode = 1
+
+[node name="right" type="TouchScreenButton" parent="ui"]
+
+transform/pos = Vector2( 121.542, 361.415 )
+transform/scale = Vector2( 1.49157, 1.46265 )
+normal = ExtResource( 8 )
+pressed = null
+bitmask = null
+passby_press = true
+action = "move_right"
+visibility_mode = 1
+
+[node name="jump" type="TouchScreenButton" parent="ui"]
+
+transform/pos = Vector2( 666.224, 359.02 )
+transform/scale = Vector2( 1.49157, 1.46265 )
+normal = ExtResource( 9 )
+pressed = null
+bitmask = null
+passby_press = false
+action = "jump"
+visibility_mode = 1
+
+[node name="fire" type="TouchScreenButton" parent="ui"]
+
+transform/pos = Vector2( 668.073, 262.788 )
+transform/scale = Vector2( 1.49157, 1.46265 )
+normal = ExtResource( 10 )
+pressed = null
+bitmask = null
+passby_press = false
+action = "shoot"
+visibility_mode = 1
+
+

BIN
2d/platformer_dcc/robot_demo.png


BIN
2d/platformer_dcc/scroll_bg_cloud_1.png


BIN
2d/platformer_dcc/scroll_bg_cloud_2.png


BIN
2d/platformer_dcc/scroll_bg_cloud_3.png


BIN
2d/platformer_dcc/scroll_bg_fg_1.png


BIN
2d/platformer_dcc/scroll_bg_fg_2.png


BIN
2d/platformer_dcc/scroll_bg_sky.png


+ 0 - 0
2d/platformer/seesaw.tscn → 2d/platformer_dcc/seesaw.tscn


BIN
2d/platformer_dcc/sound_coin.wav


BIN
2d/platformer_dcc/sound_explode.wav


BIN
2d/platformer_dcc/sound_hit.wav


BIN
2d/platformer_dcc/sound_jump.wav


BIN
2d/platformer_dcc/sound_shoot.wav


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 30 - 0
2d/platformer_dcc/stage.tscn


BIN
2d/platformer_dcc/tiles_demo.png


+ 1 - 0
2d/platformer_dcc/tiles_demo.png.flags

@@ -0,0 +1 @@
+filter=false

+ 195 - 0
2d/platformer_dcc/tileset.tres

@@ -0,0 +1,195 @@
+[gd_resource type="TileSet" load_steps=14 format=1]
+
+[ext_resource path="res://tiles_demo.png" type="Texture" id=1]
+
+[sub_resource type="ConvexPolygonShape2D" id=1]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -24, 32, -24, 32, 32, -32, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=2]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -24, 24, -24, 24, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=3]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -32, 32, -32, 32, 32, -32, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=4]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -56, 32, 8, 32, 64, -32, 64 )
+
+[sub_resource type="ConvexPolygonShape2D" id=5]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -32, 24, -32, 24, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=6]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -24, 32, -24, 32, 24, -32, 24 )
+
+[sub_resource type="ConvexPolygonShape2D" id=7]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -24, 24, -24, 24, 24, -32, 24 )
+
+[sub_resource type="ConvexPolygonShape2D" id=8]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -32, 24, -32, 24, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=9]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -64, 32, -64, -32, -8, -32, -8, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=10]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -32, 24, -32, 32, -24, 32, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=11]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -24, 32, -24, 32, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=12]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -24, 32, -24, 32, 32 )
+
+[resource]
+
+0/name = "floor"
+0/texture = ExtResource( 1 )
+0/tex_offset = Vector2( 0, 0 )
+0/region = Rect2( 0, 0, 64, 64 )
+0/occluder_offset = Vector2( 32, 32 )
+0/navigation_offset = Vector2( 32, 32 )
+0/shape_offset = Vector2( 32, 32 )
+0/shapes = [ SubResource( 1 ) ]
+1/name = "edge"
+1/texture = ExtResource( 1 )
+1/tex_offset = Vector2( 0, 0 )
+1/region = Rect2( 64, 0, 64, 64 )
+1/occluder_offset = Vector2( 32, 32 )
+1/navigation_offset = Vector2( 32, 32 )
+1/shape_offset = Vector2( 32, 32 )
+1/shapes = [ SubResource( 2 ) ]
+2/name = "wall"
+2/texture = ExtResource( 1 )
+2/tex_offset = Vector2( 0, 0 )
+2/region = Rect2( 64, 64, 64, 64 )
+2/occluder_offset = Vector2( 32, 32 )
+2/navigation_offset = Vector2( 32, 32 )
+2/shape_offset = Vector2( 32, 32 )
+2/shapes = [ SubResource( 8 ) ]
+3/name = "wall_deco"
+3/texture = ExtResource( 1 )
+3/tex_offset = Vector2( 0, 0 )
+3/region = Rect2( 320, 128, 128, 64 )
+3/occluder_offset = Vector2( 64, 32 )
+3/navigation_offset = Vector2( 64, 32 )
+3/shape_offset = Vector2( 64, 32 )
+3/shapes = [ SubResource( 9 ) ]
+4/name = "corner"
+4/texture = ExtResource( 1 )
+4/tex_offset = Vector2( 0, 0 )
+4/region = Rect2( 64, 128, 64, 64 )
+4/occluder_offset = Vector2( 32, 32 )
+4/navigation_offset = Vector2( 32, 32 )
+4/shape_offset = Vector2( 32, 32 )
+4/shapes = [ SubResource( 10 ) ]
+5/name = "flowers"
+5/texture = ExtResource( 1 )
+5/tex_offset = Vector2( 0, 0 )
+5/region = Rect2( 192, 192, 64, 64 )
+5/occluder_offset = Vector2( 32, 32 )
+5/navigation_offset = Vector2( 32, 32 )
+5/shape_offset = Vector2( 32, 32 )
+5/shapes = [ SubResource( 11 ) ]
+6/name = "tree_base"
+6/texture = ExtResource( 1 )
+6/tex_offset = Vector2( 0, 0 )
+6/region = Rect2( 256, 192, 64, 64 )
+6/occluder_offset = Vector2( 32, 32 )
+6/navigation_offset = Vector2( 32, 32 )
+6/shape_offset = Vector2( 32, 32 )
+6/shapes = [ SubResource( 12 ) ]
+7/name = "tree_mid"
+7/texture = ExtResource( 1 )
+7/tex_offset = Vector2( 0, 0 )
+7/region = Rect2( 256, 128, 64, 64 )
+7/occluder_offset = Vector2( 32, 32 )
+7/navigation_offset = Vector2( 32, 32 )
+7/shape_offset = Vector2( 0, 0 )
+7/shapes = [  ]
+8/name = "tree_mid 2"
+8/texture = ExtResource( 1 )
+8/tex_offset = Vector2( 0, 0 )
+8/region = Rect2( 256, 64, 64, 64 )
+8/occluder_offset = Vector2( 32, 32 )
+8/navigation_offset = Vector2( 32, 32 )
+8/shape_offset = Vector2( 0, 0 )
+8/shapes = [  ]
+9/name = "tree_top"
+9/texture = ExtResource( 1 )
+9/tex_offset = Vector2( 0, 0 )
+9/region = Rect2( 256, 0, 64, 64 )
+9/occluder_offset = Vector2( 32, 32 )
+9/navigation_offset = Vector2( 32, 32 )
+9/shape_offset = Vector2( 0, 0 )
+9/shapes = [  ]
+10/name = "solid"
+10/texture = ExtResource( 1 )
+10/tex_offset = Vector2( 0, 0 )
+10/region = Rect2( 0, 64, 64, 64 )
+10/occluder_offset = Vector2( 32, 32 )
+10/navigation_offset = Vector2( 32, 32 )
+10/shape_offset = Vector2( 0, 0 )
+10/shapes = [  ]
+11/name = "ceiling"
+11/texture = ExtResource( 1 )
+11/tex_offset = Vector2( 0, 0 )
+11/region = Rect2( 384, 64, 64, 64 )
+11/occluder_offset = Vector2( 32, 32 )
+11/navigation_offset = Vector2( 32, 32 )
+11/shape_offset = Vector2( 32, 32 )
+11/shapes = [ SubResource( 3 ) ]
+12/name = "ramp"
+12/texture = ExtResource( 1 )
+12/tex_offset = Vector2( 0, 0 )
+12/region = Rect2( 128, 128, 64, 128 )
+12/occluder_offset = Vector2( 32, 64 )
+12/navigation_offset = Vector2( 32, 64 )
+12/shape_offset = Vector2( 32, 64 )
+12/shapes = [ SubResource( 4 ) ]
+13/name = "ceiling2wall"
+13/texture = ExtResource( 1 )
+13/tex_offset = Vector2( 0, 0 )
+13/region = Rect2( 448, 64, 64, 64 )
+13/occluder_offset = Vector2( 32, 32 )
+13/navigation_offset = Vector2( 32, 32 )
+13/shape_offset = Vector2( 32, 32 )
+13/shapes = [ SubResource( 5 ) ]
+14/name = "platform_floor"
+14/texture = ExtResource( 1 )
+14/tex_offset = Vector2( 0, 0 )
+14/region = Rect2( 128, 0, 64, 64 )
+14/occluder_offset = Vector2( 32, 32 )
+14/navigation_offset = Vector2( 32, 32 )
+14/shape_offset = Vector2( 32, 32 )
+14/shapes = [ SubResource( 6 ) ]
+15/name = "platform_edge"
+15/texture = ExtResource( 1 )
+15/tex_offset = Vector2( 0, 0 )
+15/region = Rect2( 192, 0, 64, 64 )
+15/occluder_offset = Vector2( 32, 32 )
+15/navigation_offset = Vector2( 32, 32 )
+15/shape_offset = Vector2( 32, 32 )
+15/shapes = [ SubResource( 7 ) ]
+

+ 432 - 0
2d/platformer_dcc/tileset_edit.tscn

@@ -0,0 +1,432 @@
+[gd_scene load_steps=14 format=1]
+
+[ext_resource path="res://tiles_demo.png" type="Texture" id=1]
+
+[sub_resource type="ConvexPolygonShape2D" id=1]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -24, 32, -24, 32, 32, -32, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=2]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -24, 24, -24, 24, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=3]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -32, 24, -32, 24, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=4]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -64, 32, -64, -32, -8, -32, -8, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=5]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -32, 24, -32, 32, -24, 32, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=6]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -24, 32, -24, 32, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=7]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -24, 32, -24, 32, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=8]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -32, 32, -32, 32, 32, -32, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=9]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -56, 32, 8, 32, 64, -32, 64 )
+
+[sub_resource type="ConvexPolygonShape2D" id=10]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, 32, -32, -32, 24, -32, 24, 32 )
+
+[sub_resource type="ConvexPolygonShape2D" id=11]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -24, 32, -24, 32, 24, -32, 24 )
+
+[sub_resource type="ConvexPolygonShape2D" id=12]
+
+custom_solver_bias = 0.0
+points = Vector2Array( -32, -24, 24, -24, 24, 24, -32, 24 )
+
+[node name="Node" type="Node"]
+
+[node name="floor" type="Sprite" parent="."]
+
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 0, 0, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="floor"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 1 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="floor/collision"]
+
+build_mode = 0
+polygon = Vector2Array( 32, -24, 32, 32, -32, 32, -32, -24 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="edge" type="Sprite" parent="."]
+
+transform/pos = Vector2( 64, 0 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 64, 0, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="edge"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 2 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="edge/collision"]
+
+build_mode = 0
+polygon = Vector2Array( -32, -24, 24, -24, 24, 32, -32, 32 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="wall" type="Sprite" parent="."]
+
+transform/pos = Vector2( 64, 64 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 64, 64, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="wall"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 3 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="wall/collision"]
+
+build_mode = 0
+polygon = Vector2Array( -32, -32, 24, -32, 24, 32, -32, 32 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="wall_deco" type="Sprite" parent="."]
+
+transform/pos = Vector2( 96, 128 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 320, 128, 128, 64 )
+
+[node name="collision" type="StaticBody2D" parent="wall_deco"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 4 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="wall_deco/collision"]
+
+build_mode = 0
+polygon = Vector2Array( -64, -32, -8, -32, -8, 32, -64, 32 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="corner" type="Sprite" parent="."]
+
+transform/pos = Vector2( 64, 192 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 64, 128, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="corner"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 5 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="corner/collision"]
+
+build_mode = 0
+polygon = Vector2Array( -32, -32, 24, -32, 32, -24, 32, 32, -32, 32 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="flowers" type="Sprite" parent="."]
+
+transform/pos = Vector2( 128, 192 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 192, 192, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="flowers"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 6 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="flowers/collision"]
+
+build_mode = 0
+polygon = Vector2Array( -32, 32, 32, 32, 32, -24, -32, -24 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="tree_base" type="Sprite" parent="."]
+
+transform/pos = Vector2( 192, 192 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 256, 192, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="tree_base"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 7 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="tree_base/collision"]
+
+build_mode = 0
+polygon = Vector2Array( -32, 32, 32, 32, 32, -24, -32, -24 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="tree_mid" type="Sprite" parent="."]
+
+transform/pos = Vector2( 192, 128 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 256, 128, 64, 64 )
+
+[node name="tree_mid 2" type="Sprite" parent="."]
+
+transform/pos = Vector2( 192, 64 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 256, 64, 64, 64 )
+
+[node name="tree_top" type="Sprite" parent="."]
+
+transform/pos = Vector2( 192, 0 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 256, 0, 64, 64 )
+
+[node name="solid" type="Sprite" parent="."]
+
+transform/pos = Vector2( 0, 64 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 0, 64, 64, 64 )
+
+[node name="ceiling" type="Sprite" parent="."]
+
+transform/pos = Vector2( 0, 128 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 384, 64, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="ceiling"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 8 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="ceiling/collision"]
+
+build_mode = 0
+polygon = Vector2Array( 32, -32, 32, 32, -32, 32, -32, -32 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="ramp" type="Sprite" parent="."]
+
+transform/pos = Vector2( 256, 224 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 128, 128, 64, 128 )
+
+[node name="collision" type="StaticBody2D" parent="ramp"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 9 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="ramp/collision"]
+
+build_mode = 0
+polygon = Vector2Array( -32, -56, 32, 8, 32, 64, -32, 64 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="ceiling2wall" type="Sprite" parent="."]
+
+transform/pos = Vector2( 0, 192 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 448, 64, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="ceiling2wall"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 10 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="ceiling2wall/collision"]
+
+build_mode = 0
+polygon = Vector2Array( -32, -32, 24, -32, 24, 32, -32, 32 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="platform_floor" type="Sprite" parent="."]
+
+transform/pos = Vector2( 0, 256 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 128, 0, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="platform_floor"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 11 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="platform_floor/collision"]
+
+build_mode = 0
+polygon = Vector2Array( 32, -24, 32, 24, -32, 24, -32, -24 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="platform_edge" type="Sprite" parent="."]
+
+transform/pos = Vector2( 64, 256 )
+texture = ExtResource( 1 )
+region = true
+region_rect = Rect2( 192, 0, 64, 64 )
+
+[node name="collision" type="StaticBody2D" parent="platform_edge"]
+
+input/pickable = false
+shapes/0/shape = SubResource( 12 )
+shapes/0/transform = Matrix32( 1, 0, 0, 1, 0, 0 )
+shapes/0/trigger = false
+collision/layers = 1
+collision/mask = 1
+constant_linear_velocity = Vector2( 0, 0 )
+constant_angular_velocity = 0.0
+friction = 1.0
+bounce = 0.0
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="platform_edge/collision"]
+
+build_mode = 0
+polygon = Vector2Array( 24, -24, 24, 24, -32, 24, -32, -24 )
+shape_range = Vector2( -1, -1 )
+trigger = false
+
+[node name="help" type="Label" parent="."]
+
+focus/ignore_mouse = true
+focus/stop_mouse = true
+size_flags/horizontal = 2
+margin/left = 1.0
+margin/top = 331.0
+margin/right = 727.0
+margin/bottom = 422.0
+text = "This scene serves as a tool for editing the tileset.\nNodes (sprites) and their respective collisionsare edited here.\n\nTo create a tileset from this, a \"TileSet\" resoucre must be created. Use the helper in: Scene -> Convert To -> TileSet.\nThis will save a tileset. Saving over it will merge your changes.\n\nFinally, the saved tileset resource (tileset.tres in this case), can be opened to be used into a TileMap node for editing a tile map."
+percent_visible = 1.0
+lines_skipped = 0
+max_lines_visible = -1
+
+

BIN
visual_script/platformer/moving_platform.vs


BIN
visual_script/platformer/player.vs


+ 12 - 8
visual_script/platformer/stage.tscn

@@ -207,38 +207,42 @@ transform/pos = Vector2( 4172.75, 541.058 )
 [node name="moving_platform" parent="props" instance=ExtResource( 3 )]
 
 transform/pos = Vector2( 1451.86, 742.969 )
-script_variables/motion = Vector2( 0, 1 )
-script_variables/cycle = 5.0
+motion = Vector2( 0, 0 )
+cycle = 1.0
 
 [node name="moving_platform 2" parent="props" instance=ExtResource( 3 )]
 
 transform/pos = Vector2( 719.199, 1123.81 )
-script_variables/motion = Vector2( 200, 0 )
-script_variables/cycle = 5.0
+motion = Vector2( 100, 0 )
+cycle = 4.0
 
 [node name="still" parent="props" instance=ExtResource( 3 )]
 
 transform/pos = Vector2( 1231.37, 1105.18 )
 transform/rot = 9.3572
-script_variables/cycle = 1.0
+motion = Vector2( 0, 0 )
+cycle = 1.0
 
 [node name="still1" parent="props" instance=ExtResource( 3 )]
 
 transform/pos = Vector2( 1384.28, 1066.4 )
 transform/rot = 18.4436
-script_variables/cycle = 1.0
+motion = Vector2( 0, 0 )
+cycle = 1.0
 
 [node name="still2" parent="props" instance=ExtResource( 3 )]
 
 transform/pos = Vector2( 1552.7, 1032.05 )
 transform/rot = 4.73782
-script_variables/cycle = 1.0
+motion = Vector2( 0, 0 )
+cycle = 1.0
 
 [node name="still3" parent="props" instance=ExtResource( 3 )]
 
 transform/pos = Vector2( 1700.06, 1066.92 )
 transform/rot = -31.3979
-script_variables/cycle = 1.0
+motion = Vector2( 0, 0 )
+cycle = 1.0
 
 [node name="one_way_platform" parent="props" instance=ExtResource( 4 )]
 

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно