Forráskód Böngészése

-added kinematic body
-added kinematic body demos

Juan Linietsky 11 éve
szülő
commit
85d32dbf9f

+ 17 - 0
2d/kinematic_char/colworld.gd

@@ -0,0 +1,17 @@
+
+extends Node2D
+
+# member variables here, example:
+# var a=2
+# var b="textvar"
+
+func _ready():
+	# Initalization here
+	pass
+
+
+
+
+func _on_princess_body_enter( body ):
+	#the name of this editor-generated callback is unfortunate
+	get_node("youwin").show()

BIN
2d/kinematic_char/colworld.scn


+ 13 - 0
2d/kinematic_char/engine.cfg

@@ -0,0 +1,13 @@
+[application]
+
+name="Kinematic Collision"
+main_scene="res://colworld.scn"
+icon="res://icon.png"
+
+[input]
+
+move_up=[key(Up)]
+move_left=[key(Left)]
+move_right=[key(Right)]
+move_bottom=[key(Down)]
+jump=[key(Space)]

BIN
2d/kinematic_char/icon.png


BIN
2d/kinematic_char/obstacle.png


+ 116 - 0
2d/kinematic_char/player.gd

@@ -0,0 +1,116 @@
+
+extends KinematicBody2D
+
+# This is a simple collision demo showing how
+# the kinematic cotroller works.
+# move() will allow to move the node, and will
+# always move it to a non-colliding spot, 
+# as long as it starts from a non-colliding spot too.
+
+
+#pixels / second
+const GRAVITY = 500.0
+
+# Angle in degrees towards either side that the player can 
+# consider "floor".
+const FLOOR_ANGLE_TOLERANCE = 40
+const WALK_FORCE = 600
+const WALK_MAX_SPEED = 200
+const STOP_FORCE = 1300
+const JUMP_SPEED = 200
+const JUMP_MAX_AIRBORNE_TIME=0.2
+
+var velocity = Vector2()
+var on_air_time=100
+var jumping=false
+
+var prev_jump_pressed=false
+
+func _fixed_process(delta):
+
+	#create forces
+	var force = Vector2(0,GRAVITY)
+
+	var stop = velocity.x!=0.0
+	
+	var walk_left = Input.is_action_pressed("move_left")
+	var walk_right = Input.is_action_pressed("move_right")
+	var jump = Input.is_action_pressed("jump")
+
+	var stop=true
+	
+	if (walk_left):
+		if (velocity.x<=0 and velocity.x > -WALK_MAX_SPEED):
+			force.x-=WALK_FORCE			
+			stop=false
+		
+	elif (walk_right):
+		if (velocity.x>=0 and velocity.x < WALK_MAX_SPEED):
+			force.x+=WALK_FORCE
+			stop=false
+	
+	if (stop):
+		var vsign = sign(velocity.x)
+		var vlen = abs(velocity.x)
+		
+		vlen -= STOP_FORCE * delta
+		if (vlen<0):
+			vlen=0
+			
+		velocity.x=vlen*vsign
+		
+
+		
+	#integrate forces to velocity
+	velocity += force * delta
+	
+	#integrate velocity into motion and move
+	var motion = velocity * delta
+
+	#move and consume motion
+#
+	motion = move(motion)
+
+
+	var floor_velocity=Vector2()
+
+	if (is_colliding()):
+		#ran against something, is it the floor? get normal
+		var n = get_collision_normal()
+
+		if ( rad2deg(acos(n.dot( Vector2(0,-1)))) < FLOOR_ANGLE_TOLERANCE ):
+			#if angle to the "up" vectors is < angle tolerance
+			#char is on floor
+			on_air_time=0
+			floor_velocity=get_collider_velocity()
+			#velocity.y=0 
+			
+		# But we were moving and our motion was interrupted, 
+		# so try to complete the motion by "sliding"
+		# by the normal
+		motion = n.slide(motion)
+		velocity = n.slide(velocity)
+		
+		#then move again
+		move(motion)
+
+	if (floor_velocity!=Vector2()):
+		#if floor moves, move with floor
+		move(floor_velocity*delta)
+
+	if (jumping and velocity.y>0):
+		jumping=false
+		
+	if (on_air_time<JUMP_MAX_AIRBORNE_TIME and jump and not prev_jump_pressed and not jumping):	
+		velocity.y=-JUMP_SPEED	
+		jumping=true
+		
+	on_air_time+=delta
+	prev_jump_pressed=jump	
+
+func _ready():
+	# Initalization here
+	set_fixed_process(true)
+	pass
+
+

BIN
2d/kinematic_char/player.png


BIN
2d/kinematic_char/player.scn


BIN
2d/kinematic_char/princess.png


BIN
2d/kinematic_col/colworld.scn


+ 12 - 0
2d/kinematic_col/engine.cfg

@@ -0,0 +1,12 @@
+[application]
+
+name="Kinematic Collision"
+main_scene="res://colworld.scn"
+icon="res://icon.png"
+
+[input]
+
+move_up=[key(Up)]
+move_left=[key(Left)]
+move_right=[key(Right)]
+move_bottom=[key(Down)]

BIN
2d/kinematic_col/icon.png


BIN
2d/kinematic_col/obstacle.png


+ 36 - 0
2d/kinematic_col/player.gd

@@ -0,0 +1,36 @@
+
+extends KinematicBody2D
+
+# This is a simple collision demo showing how
+# the kinematic cotroller works.
+# move() will allow to move the node, and will
+# always move it to a non-colliding spot, 
+# as long as it starts from a non-colliding spot too.
+
+
+#pixels / second
+const MOTION_SPEED=160
+
+func _fixed_process(delta):
+
+	var motion = Vector2()
+	
+	if (Input.is_action_pressed("move_up")):
+		motion+=Vector2(0,-1)
+	if (Input.is_action_pressed("move_bottom")):
+		motion+=Vector2(0,1)
+	if (Input.is_action_pressed("move_left")):
+		motion+=Vector2(-1,0)
+	if (Input.is_action_pressed("move_right")):
+		motion+=Vector2(1,0)
+	
+	motion = motion.normalized() * MOTION_SPEED * delta
+	move(motion)
+	
+
+func _ready():
+	# Initalization here
+	set_fixed_process(true)
+	pass
+
+

BIN
2d/kinematic_col/player.png


BIN
2d/kinematic_col/player.scn