Browse Source

Merge pull request #383 from aaronfranke/platformer-3d

Update Platformer 3D demo to Godot 3.1.2
Aaron Franke 5 years ago
parent
commit
9e197b8c20

+ 2 - 3
3d/platformer/bullet.gd

@@ -1,5 +1,4 @@
-
 extends RigidBody
 
-# Member variables
-var disabled = false
+#warning-ignore:unused_class_variable
+var enabled = true

BIN
3d/platformer/bullet.scn


+ 120 - 0
3d/platformer/bullet.tscn

@@ -0,0 +1,120 @@
+[gd_scene load_steps=10 format=2]
+
+[ext_resource path="res://bullet.gd" type="Script" id=1]
+
+[sub_resource type="SpatialMaterial" id=1]
+flags_transparent = true
+flags_unshaded = true
+vertex_color_use_as_albedo = true
+vertex_color_is_srgb = true
+params_blend_mode = 1
+albedo_color = Color( 0.822, 0.795804, 0.513098, 1 )
+
+[sub_resource type="ArrayMesh" id=2]
+resource_name = "Sphere.001"
+surfaces/0 = {
+"aabb": AABB( -0.951057, -1, -0.951057, 1.90211, 2, 1.90211 ),
+"array_data": PoolByteArray( 155, 187, 241, 52, 0, 0, 0, 60, 135, 36, 0, 0, 179, 184, 120, 58, 0, 0, 0, 60, 176, 98, 0, 0, 166, 182, 120, 58, 166, 182, 0, 60, 200, 98, 200, 0, 97, 185, 241, 52, 97, 185, 0, 60, 171, 36, 171, 0, 155, 187, 241, 180, 0, 0, 0, 60, 135, 220, 0, 0, 97, 185, 241, 180, 97, 185, 0, 60, 171, 220, 171, 0, 179, 184, 120, 186, 0, 0, 0, 60, 176, 158, 0, 0, 166, 182, 120, 186, 166, 182, 0, 60, 200, 158, 200, 0, 0, 0, 241, 52, 155, 187, 0, 60, 0, 36, 135, 0, 0, 0, 241, 180, 155, 187, 0, 60, 0, 220, 135, 0, 0, 0, 120, 186, 179, 184, 0, 60, 0, 158, 176, 0, 0, 0, 120, 58, 179, 184, 0, 60, 0, 98, 176, 0, 97, 57, 241, 52, 97, 185, 0, 60, 85, 36, 171, 0, 97, 57, 241, 180, 97, 185, 0, 60, 85, 220, 171, 0, 166, 54, 120, 186, 166, 182, 0, 60, 56, 158, 200, 0, 166, 54, 120, 58, 166, 182, 0, 60, 56, 98, 200, 0, 155, 59, 241, 52, 0, 0, 0, 60, 121, 36, 0, 0, 155, 59, 241, 180, 0, 0, 0, 60, 121, 220, 0, 0, 179, 56, 120, 186, 0, 0, 0, 60, 80, 158, 0, 0, 179, 56, 120, 58, 0, 0, 0, 60, 80, 98, 0, 0, 97, 57, 241, 52, 97, 57, 0, 60, 85, 36, 85, 0, 97, 57, 241, 180, 97, 57, 0, 60, 85, 220, 85, 0, 166, 54, 120, 186, 166, 54, 0, 60, 56, 158, 56, 0, 166, 54, 120, 58, 166, 54, 0, 60, 56, 98, 56, 0, 0, 0, 241, 52, 155, 59, 0, 60, 0, 36, 121, 0, 0, 0, 241, 180, 155, 59, 0, 60, 0, 220, 121, 0, 0, 0, 120, 186, 179, 56, 0, 60, 0, 158, 80, 0, 0, 0, 120, 58, 179, 56, 0, 60, 0, 98, 80, 0, 97, 185, 241, 52, 97, 57, 0, 60, 171, 36, 85, 0, 97, 185, 241, 180, 97, 57, 0, 60, 171, 220, 85, 0, 166, 182, 120, 186, 166, 54, 0, 60, 200, 158, 56, 0, 166, 182, 120, 58, 166, 54, 0, 60, 200, 98, 56, 0, 0, 0, 0, 60, 0, 0, 0, 60, 0, 127, 0, 0, 0, 0, 0, 188, 0, 0, 0, 60, 0, 130, 0, 0 ),
+"array_index_data": PoolByteArray( 0, 0, 2, 0, 1, 0, 0, 0, 3, 0, 2, 0, 4, 0, 3, 0, 0, 0, 4, 0, 5, 0, 3, 0, 6, 0, 5, 0, 4, 0, 6, 0, 7, 0, 5, 0, 5, 0, 8, 0, 3, 0, 5, 0, 9, 0, 8, 0, 7, 0, 9, 0, 5, 0, 7, 0, 10, 0, 9, 0, 3, 0, 11, 0, 2, 0, 3, 0, 8, 0, 11, 0, 9, 0, 12, 0, 8, 0, 9, 0, 13, 0, 12, 0, 10, 0, 13, 0, 9, 0, 10, 0, 14, 0, 13, 0, 8, 0, 15, 0, 11, 0, 8, 0, 12, 0, 15, 0, 13, 0, 16, 0, 12, 0, 13, 0, 17, 0, 16, 0, 14, 0, 17, 0, 13, 0, 14, 0, 18, 0, 17, 0, 12, 0, 19, 0, 15, 0, 12, 0, 16, 0, 19, 0, 17, 0, 20, 0, 16, 0, 17, 0, 21, 0, 20, 0, 18, 0, 21, 0, 17, 0, 18, 0, 22, 0, 21, 0, 16, 0, 23, 0, 19, 0, 16, 0, 20, 0, 23, 0, 21, 0, 24, 0, 20, 0, 21, 0, 25, 0, 24, 0, 22, 0, 25, 0, 21, 0, 22, 0, 26, 0, 25, 0, 20, 0, 27, 0, 23, 0, 20, 0, 24, 0, 27, 0, 25, 0, 28, 0, 24, 0, 25, 0, 29, 0, 28, 0, 26, 0, 29, 0, 25, 0, 26, 0, 30, 0, 29, 0, 24, 0, 31, 0, 27, 0, 24, 0, 28, 0, 31, 0, 1, 0, 2, 0, 32, 0, 33, 0, 7, 0, 6, 0, 2, 0, 11, 0, 32, 0, 33, 0, 10, 0, 7, 0, 11, 0, 15, 0, 32, 0, 33, 0, 14, 0, 10, 0, 15, 0, 19, 0, 32, 0, 33, 0, 18, 0, 14, 0, 19, 0, 23, 0, 32, 0, 33, 0, 22, 0, 18, 0, 23, 0, 27, 0, 32, 0, 33, 0, 26, 0, 22, 0, 27, 0, 31, 0, 32, 0, 33, 0, 30, 0, 26, 0, 29, 0, 0, 0, 28, 0, 29, 0, 4, 0, 0, 0, 30, 0, 4, 0, 29, 0, 30, 0, 6, 0, 4, 0, 32, 0, 31, 0, 1, 0, 33, 0, 6, 0, 30, 0, 1, 0, 28, 0, 0, 0, 1, 0, 31, 0, 28, 0 ),
+"blend_shape_data": [  ],
+"format": 98051,
+"index_count": 192,
+"material": SubResource( 1 ),
+"primitive": 4,
+"skeleton_aabb": [  ],
+"vertex_count": 34
+}
+
+[sub_resource type="SpatialMaterial" id=3]
+albedo_color = Color( 0.7, 0.7, 0.7, 1 )
+metallic = 0.1
+roughness = 0.0
+emission_enabled = true
+emission = Color( 1, 0.884824, 0.513098, 1 )
+emission_energy = 3.71
+emission_operator = 0
+emission_on_uv2 = false
+
+[sub_resource type="Animation" id=4]
+length = 2.0
+tracks/0/type = "value"
+tracks/0/path = NodePath("Sphere:visible")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/keys = {
+"times": PoolRealArray( 0, 1.5 ),
+"transitions": PoolRealArray( 1, 1 ),
+"update": 1,
+"values": [ true, false ]
+}
+tracks/1/type = "value"
+tracks/1/path = NodePath("Particles:emitting")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/keys = {
+"times": PoolRealArray( 0, 1.5 ),
+"transitions": PoolRealArray( 1, 1 ),
+"update": 1,
+"values": [ true, false ]
+}
+tracks/2/type = "method"
+tracks/2/path = NodePath(".")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/keys = {
+"times": PoolRealArray( 2 ),
+"transitions": PoolRealArray( 1 ),
+"values": [ {
+"args": [  ],
+"method": "queue_free"
+} ]
+}
+
+[sub_resource type="Gradient" id=5]
+colors = PoolColorArray( 1, 1, 1, 1, 1, 1, 1, 0 )
+
+[sub_resource type="GradientTexture" id=6]
+gradient = SubResource( 5 )
+
+[sub_resource type="ParticlesMaterial" id=7]
+spread = 0.0
+gravity = Vector3( 0, 0, 0 )
+scale = 0.3
+color_ramp = SubResource( 6 )
+
+[sub_resource type="SphereShape" id=8]
+radius = 0.27
+
+[node name="Bullet" type="RigidBody"]
+mass = 0.4
+script = ExtResource( 1 )
+__meta__ = {
+"__editor_plugin_screen__": "3D"
+}
+
+[node name="Sphere" type="MeshInstance" parent="."]
+transform = Transform( 0.24972, 0, 0, 0, 0.24972, 0, 0, 0, 0.24972, 0.00159812, 0.0110106, 0.0045104 )
+mesh = SubResource( 2 )
+material/0 = SubResource( 3 )
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+autoplay = "life"
+anims/life = SubResource( 4 )
+
+[node name="Particles" type="Particles" parent="."]
+amount = 16
+lifetime = 0.4
+fixed_fps = 60
+fract_delta = false
+local_coords = false
+process_material = SubResource( 7 )
+draw_pass_1 = SubResource( 2 )
+
+[node name="CollisionShape" type="CollisionShape" parent="."]
+shape = SubResource( 8 )

+ 1 - 4
3d/platformer/coin.gd

@@ -1,11 +1,8 @@
-
 extends Area
 
-# Member variables
 var taken = false
 
-
 func _on_coin_body_enter(body):
 	if not taken and body is preload("res://player.gd"):
-		get_node("anim").play("take")
+		get_node("Animation").play("take")
 		taken = true

BIN
3d/platformer/coin.scn


File diff suppressed because it is too large
+ 20 - 0
3d/platformer/coin.tscn


+ 0 - 1
3d/platformer/default_bus_layout.tres

@@ -40,4 +40,3 @@ bus/2/volume_db = 0.0
 bus/2/send = "Master"
 bus/2/effect/0/effect = SubResource( 3 )
 bus/2/effect/0/enabled = true
-

+ 12 - 14
3d/platformer/enemy.gd

@@ -1,7 +1,5 @@
-
 extends RigidBody
 
-# Member variables
 const STATE_WALKING = 0
 const STATE_DYING = 1
 
@@ -14,15 +12,17 @@ var rot_speed = 1
 
 var dying = false
 
+onready var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") * ProjectSettings.get_setting("physics/3d/default_gravity_vector")
 
 func _integrate_forces(state):
 	var delta = state.get_step()
 	var lv = state.get_linear_velocity()
 	var g = state.get_total_gravity()
-	# get_total_gravity returns zero for the first few frames, leading to errors
-	if g == Vector3.ZERO: g = Vector3 (0, -9.8, 0)
+	# get_total_gravity returns zero for the first few frames, leading to errors.
+	if g == Vector3.ZERO:
+		g = gravity
 
-	lv += g * delta # Apply gravity
+	lv += g * delta # Apply gravity.
 	var up = -g.normalized()
 	
 	if dying:
@@ -34,22 +34,20 @@ func _integrate_forces(state):
 		var dp = state.get_contact_local_normal(i)
 		
 		if cc:
-			if cc is preload("res://bullet.gd") and not cc.disabled:
+			if cc is preload("res://bullet.gd") and cc.enabled:
 				set_mode(MODE_RIGID)
 				dying = true
-				#lv = s.get_contact_local_normal(i)*400
 				state.set_angular_velocity(-dp.cross(up).normalized() * 33.0)
 				get_node("AnimationPlayer").play("impact")
 				get_node("AnimationPlayer").queue("explode")
-				set_friction(1)
-				cc.disabled = true
-				get_node("sound_hit").play()
+				cc.enabled = false
+				get_node("SoundHit").play()
 				return
 	
-	var col_floor = get_node("Armature/ray_floor").is_colliding()
-	var col_wall = get_node("Armature/ray_wall").is_colliding()
+	var col_floor = get_node("Armature/RayFloor").is_colliding()
+	var col_wall = get_node("Armature/RayWall").is_colliding()
 	
-	var advance = not col_wall and col_floor
+	var advance = col_floor and not col_wall
 	
 	var dir = get_node("Armature").get_transform().basis[2].normalized()
 	var deaccel_dir = dir
@@ -60,7 +58,7 @@ func _integrate_forces(state):
 		deaccel_dir = dir.cross(g).normalized()
 	else:
 		if prev_advance:
-			rot_dir = 1 # randf()*2.0 - 1.0
+			rot_dir = 1
 		
 		dir = Basis(up, rot_dir * rot_speed * delta).xform(dir)
 		get_node("Armature").set_transform(Transform().looking_at(-dir, up))

BIN
3d/platformer/enemy.scn


File diff suppressed because it is too large
+ 34 - 0
3d/platformer/enemy.tscn


+ 32 - 36
3d/platformer/follow_camera.gd

@@ -1,80 +1,76 @@
-
 extends Camera
 
-# Member variables
-var collision_exception = []
 export var min_distance = 0.5
 export var max_distance = 3.5
 export var angle_v_adjust = 0.0
 export var autoturn_ray_aperture = 25
 export var autoturn_speed = 50
+
+var collision_exception = []
 var max_height = 2.0
 var min_height = 0
 
+func _ready():
+	# Find collision exceptions for ray.
+	var node = self
+	while node:
+		if node is RigidBody:
+			collision_exception.append(node.get_rid())
+			break
+		else:
+			node = node.get_parent()
+	set_physics_process(true)
+	# This detaches the camera transform from the parent spatial node.
+	set_as_toplevel(true)
+
+
 func _physics_process(dt):
 	var target = get_parent().get_global_transform().origin
 	var pos = get_global_transform().origin
-	var up = Vector3(0, 1, 0)
 
 	var delta = pos - target
 
-	# Regular delta follow
+	# Regular delta follow.
 
-	# Check ranges
-	if  delta.length() < min_distance:
+	# Check ranges.
+	if delta.length() < min_distance:
 		delta = delta.normalized() * min_distance
 	elif  delta.length() > max_distance:
 		delta = delta.normalized() * max_distance
 
-	# Check upper and lower height
+	# Check upper and lower height.
 	if delta.y > max_height:
 		delta.y = max_height
 	if delta.y < min_height:
 		delta.y = min_height
 
-	# Check autoturn
+	# Check autoturn.
 	var ds = PhysicsServer.space_get_direct_state(get_world().get_space())
 
-	var col_left = ds.intersect_ray(target, target + Basis(up, deg2rad(autoturn_ray_aperture)).xform(delta), collision_exception)
+	var col_left = ds.intersect_ray(target, target + Basis(Vector3.UP, deg2rad(autoturn_ray_aperture)).xform(delta), collision_exception)
 	var col = ds.intersect_ray(target, target + delta, collision_exception)
-	var col_right = ds.intersect_ray(target, target + Basis(up, deg2rad(-autoturn_ray_aperture)).xform(delta), collision_exception)
+	var col_right = ds.intersect_ray(target, target + Basis(Vector3.UP, deg2rad(-autoturn_ray_aperture)).xform(delta), collision_exception)
 
 	if !col.empty():
-		# If main ray was occluded, get camera closer, this is the worst case scenario
+		# If main ray was occluded, get camera closer, this is the worst case scenario.
 		delta = col.position - target
 	elif !col_left.empty() and col_right.empty():
-		# If only left ray is occluded, turn the camera around to the right
-		delta = Basis(up, deg2rad(-dt * autoturn_speed)).xform(delta)
+		# If only left ray is occluded, turn the camera around to the right.
+		delta = Basis(Vector3.UP, deg2rad(-dt * autoturn_speed)).xform(delta)
 	elif col_left.empty() and !col_right.empty():
-		# If only right ray is occluded, turn the camera around to the left
-		delta = Basis(up, deg2rad(dt  *autoturn_speed)).xform(delta)
-	else:
-		# Do nothing otherwise, left and right are occluded but center is not, so do not autoturn
-		pass
+		# If only right ray is occluded, turn the camera around to the left.
+		delta = Basis(Vector3.UP, deg2rad(dt  *autoturn_speed)).xform(delta)
+	# Do nothing otherwise, left and right are occluded but center is not, so do not autoturn.
 
-	# Apply lookat
+	# Apply lookat.
 	if delta == Vector3():
 		delta = (pos - target).normalized() * 0.0001
 
 	pos = target + delta
 
-	look_at_from_position(pos, target, up)
+	look_at_from_position(pos, target, Vector3.UP)
 
-	# Turn a little up or down
+	# Turn a little up or down.
 	var t = get_transform()
 	t.basis = Basis(t.basis[0], deg2rad(angle_v_adjust)) * t.basis
 	set_transform(t)
-
-
-func _ready():
-	# Find collision exceptions for ray
-	var node = self
-	while node:
-		if node is RigidBody:
-			collision_exception.append(node.get_rid())
-			break
-		else:
-			node = node.get_parent()
-	set_physics_process(true)
-	# This detaches the camera transform from the parent spatial node
-	set_as_toplevel(true)

+ 64 - 87
3d/platformer/player.gd

@@ -1,110 +1,68 @@
-
 extends KinematicBody
 
-# Member variables
 const ANIM_FLOOR = 0
 const ANIM_AIR_UP = 1
 const ANIM_AIR_DOWN = 2
 
 const SHOOT_TIME = 1.5
 const SHOOT_SCALE = 2
-
 const CHAR_SCALE = Vector3(0.3, 0.3, 0.3)
+const TURN_SPEED = 40
 
-var facing_dir = Vector3(1, 0, 0)
+var facing_dir = Vector3.RIGHT
 var movement_dir = Vector3()
+var linear_velocity = Vector3()
 
 var jumping = false
 
-var turn_speed = 40
-var keep_jump_inertia = true
 var air_idle_deaccel = false
 var accel = 19.0
 var deaccel = 14.0
 var sharp_turn_threshold = 140
-
 var max_speed = 3.1
 
 var prev_shoot = false
-
-var linear_velocity=Vector3()
-
 var shoot_blend = 0
 
-func adjust_facing(p_facing, p_target, p_step, p_adjust_rate, current_gn):
-	var n = p_target # Normal
-	var t = n.cross(current_gn).normalized()
-	 
-	var x = n.dot(p_facing)
-	var y = t.dot(p_facing)
-	
-	var ang = atan2(y,x)
-	
-	if abs(ang) < 0.001: # Too small
-		return p_facing
-	
-	var s = sign(ang)
-	ang = ang * s
-	var turn = ang * p_adjust_rate * p_step
-	var a
-	if ang < turn:
-		a = ang
-	else:
-		a = turn
-	ang = (ang - a) * s
-	
-	return (n * cos(ang) + t * sin(ang)) * p_facing.length()
+onready var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") * ProjectSettings.get_setting("physics/3d/default_gravity_vector")
+
+func _ready():
+	get_node("AnimationTreePlayer").set_active(true)
 
 
 func _physics_process(delta):
-	
-	var lv = linear_velocity
-	var g = Vector3(0, -9.8, 0)
-
-#	var d = 1.0 - delta*state.get_total_density()
-#	if (d < 0):
-#		d = 0
-	lv += g * delta # Apply gravity
+	linear_velocity += gravity * delta
 	
 	var anim = ANIM_FLOOR
 	
-	var up = -g.normalized() # (up is against gravity)
-	var vv = up.dot(lv) # Vertical velocity
-	var hv = lv - up * vv # Horizontal velocity
-	
-	var hdir = hv.normalized() # Horizontal direction
-	var hspeed = hv.length() # Horizontal speed
+	var vv = linear_velocity.y # Vertical velocity.
+	var hv = Vector3(linear_velocity.x, 0, linear_velocity.z) # Horizontal velocity.
 	
-	var dir = Vector3() # Where does the player intend to walk to
-	var cam_xform = get_node("target/camera").get_global_transform()
+	var hdir = hv.normalized() # Horizontal direction.
+	var hspeed = hv.length() # Horizontal speed.
 	
-	if Input.is_action_pressed("move_forward"):
-		dir += -cam_xform.basis[2]
-	if Input.is_action_pressed("move_backwards"):
-		dir += cam_xform.basis[2]
-	if Input.is_action_pressed("move_left"):
-		dir += -cam_xform.basis[0]
-	if Input.is_action_pressed("move_right"):
-		dir += cam_xform.basis[0]
+	# Player input
+	var cam_basis = get_node("Target/Camera").get_global_transform().basis
+	var dir = Vector3() # Where does the player intend to walk to.
+	dir = Input.get_action_strength("move_right") * cam_basis[0]
+	dir -= Input.get_action_strength("move_left") * cam_basis[0]
+	dir += Input.get_action_strength("move_backwards") * cam_basis[2]
+	dir -= Input.get_action_strength("move_forward") * cam_basis[2]
+	dir.y = 0
+	dir = dir.normalized()
 	
 	var jump_attempt = Input.is_action_pressed("jump")
 	var shoot_attempt = Input.is_action_pressed("shoot")
 	
-	var target_dir = (dir - up * dir.dot(up)).normalized()
-	
 	if is_on_floor():
-		var sharp_turn = hspeed > 0.1 and rad2deg(acos(target_dir.dot(hdir))) > sharp_turn_threshold
+		var sharp_turn = hspeed > 0.1 and rad2deg(acos(dir.dot(hdir))) > sharp_turn_threshold
 		
 		if dir.length() > 0.1 and !sharp_turn:
 			if hspeed > 0.001:
-				#linear_dir = linear_h_velocity/linear_vel
-				#if (linear_vel > brake_velocity_limit and linear_dir.dot(ctarget_dir) < -cos(Math::deg2rad(brake_angular_limit)))
-				#	brake = true
-				#else
-				hdir = adjust_facing(hdir, target_dir, delta, 1.0 / hspeed * turn_speed, up)
+				hdir = adjust_facing(hdir, dir, delta, 1.0 / hspeed * TURN_SPEED, Vector3.UP)
 				facing_dir = hdir
 			else:
-				hdir = target_dir
+				hdir = dir
 			
 			if hspeed < max_speed:
 				hspeed += accel * delta
@@ -117,32 +75,31 @@ func _physics_process(delta):
 		
 		var mesh_xform = get_node("Armature").get_transform()
 		var facing_mesh = -mesh_xform.basis[0].normalized()
-		facing_mesh = (facing_mesh - up * facing_mesh.dot(up)).normalized()
+		facing_mesh = (facing_mesh - Vector3.UP * facing_mesh.dot(Vector3.UP)).normalized()
 		
-		if hspeed>0:
-			facing_mesh = adjust_facing(facing_mesh, target_dir, delta, 1.0/hspeed*turn_speed, up)
-		var m3 = Basis(-facing_mesh, up, -facing_mesh.cross(up).normalized()).scaled(CHAR_SCALE)
+		if hspeed > 0:
+			facing_mesh = adjust_facing(facing_mesh, dir, delta, 1.0 / hspeed * TURN_SPEED, Vector3.UP)
+		var m3 = Basis(-facing_mesh, Vector3.UP, -facing_mesh.cross(Vector3.UP).normalized()).scaled(CHAR_SCALE)
 		
 		get_node("Armature").set_transform(Transform(m3, mesh_xform.origin))
 		
 		if not jumping and jump_attempt:
 			vv = 7.0
 			jumping = true
-			get_node("sound_jump").play()
+			get_node("SoundJump").play()
 	else:
 		if vv > 0:
 			anim = ANIM_AIR_UP
 		else:
 			anim = ANIM_AIR_DOWN
 		
-		# var hs
 		if dir.length() > 0.1:
-			hv += target_dir * (accel * 0.2) * delta
-			if (hv.length() > max_speed):
-				hv = hv.normalized()*max_speed
+			hv += dir * (accel * 0.2 * delta)
+			if hv.length() > max_speed:
+				hv = hv.normalized() * max_speed
 		else:
 			if air_idle_deaccel:
-				hspeed = hspeed - (deaccel * 0.2) * delta
+				hspeed = hspeed - (deaccel * 0.2 * delta)
 				if hspeed < 0:
 					hspeed = 0
 				hv = hdir * hspeed
@@ -150,12 +107,12 @@ func _physics_process(delta):
 	if jumping and vv < 0:
 		jumping = false
 	
-	lv = hv + up*vv
+	linear_velocity = hv + Vector3.UP * vv
 	
 	if is_on_floor():
-		movement_dir = lv
+		movement_dir = linear_velocity
 		
-	linear_velocity = move_and_slide(lv,-g.normalized())
+	linear_velocity = move_and_slide(linear_velocity, -gravity.normalized())
 	
 	if shoot_blend > 0:
 		shoot_blend -= delta * SHOOT_SCALE
@@ -164,12 +121,12 @@ func _physics_process(delta):
 	
 	if shoot_attempt and not prev_shoot:
 		shoot_blend = SHOOT_TIME
-		var bullet = preload("res://bullet.scn").instance()
-		bullet.set_transform(get_node("Armature/bullet").get_global_transform().orthonormalized())
+		var bullet = preload("res://bullet.tscn").instance()
+		bullet.set_transform(get_node("Armature/Bullet").get_global_transform().orthonormalized())
 		get_parent().add_child(bullet)
-		bullet.set_linear_velocity(get_node("Armature/bullet").get_global_transform().basis[2].normalized() * 20)
-		bullet.add_collision_exception_with(self) # Add it to bullet
-		get_node("sound_shoot").play()
+		bullet.set_linear_velocity(get_node("Armature/Bullet").get_global_transform().basis[2].normalized() * 20)
+		bullet.add_collision_exception_with(self) # Add it to bullet.
+		get_node("SoundShoot").play()
 	
 	prev_shoot = shoot_attempt
 	
@@ -178,8 +135,28 @@ func _physics_process(delta):
 	
 	get_node("AnimationTreePlayer").transition_node_set_current("state", anim)
 	get_node("AnimationTreePlayer").blend2_node_set_amount("gun", min(shoot_blend, 1.0))
-#	state.set_angular_velocity(Vector3())
 
 
-func _ready():
-	get_node("AnimationTreePlayer").set_active(true)
+func adjust_facing(p_facing, p_target, p_step, p_adjust_rate, current_gn):
+	var n = p_target # Normal.
+	var t = n.cross(current_gn).normalized()
+	 
+	var x = n.dot(p_facing)
+	var y = t.dot(p_facing)
+	
+	var ang = atan2(y,x)
+	
+	if abs(ang) < 0.001: # Too small.
+		return p_facing
+	
+	var s = sign(ang)
+	ang = ang * s
+	var turn = ang * p_adjust_rate * p_step
+	var a
+	if ang < turn:
+		a = ang
+	else:
+		a = turn
+	ang = (ang - a) * s
+	
+	return (n * cos(ang) + t * sin(ang)) * p_facing.length()

BIN
3d/platformer/player.scn


File diff suppressed because it is too large
+ 34 - 0
3d/platformer/player.tscn


+ 13 - 1
3d/platformer/project.godot

@@ -16,7 +16,7 @@ _global_script_class_icons={
 [application]
 
 config/name="Platformer 3D"
-run/main_scene="res://stage.scn"
+run/main_scene="res://stage.tscn"
 config/icon="res://icon.png"
 
 [gdnative]
@@ -92,31 +92,43 @@ ui_page_down={
 move_forward={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
  ]
 }
 move_backwards={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
  ]
 }
 move_left={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
  ]
 }
 move_right={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
  ]
 }
 jump={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
  ]
 }
 shoot={
 "deadzone": 0.5,
 "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":90,"unicode":0,"echo":false,"script":null)
+, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null)
+, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":7,"pressure":0.0,"pressed":false,"script":null)
  ]
 }
 

BIN
3d/platformer/robotrigged.scn


BIN
3d/platformer/stage.scn


File diff suppressed because it is too large
+ 59 - 0
3d/platformer/stage.tscn


BIN
3d/platformer/tiles.res


BIN
3d/platformer/tiles.scn


File diff suppressed because it is too large
+ 28 - 0
3d/platformer/tiles.tres


File diff suppressed because it is too large
+ 11 - 0
3d/platformer/tiles.tscn


Some files were not shown because too many files changed in this diff