Browse Source

Improve the 3D platformer demo

- Increase gravity, player speed and air acceleration for a less floaty
  feeling.
- Clean up the code to use constants when relevant and remove unused enums.
Hugo Locurcio 4 years ago
parent
commit
3d6ba65cfc

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

@@ -1,19 +1,17 @@
 extends RigidBody
 
-const STATE_WALKING = 0
-const STATE_DYING = 1
+const ACCEL = 5.0
+const DEACCEL = 20.0
+const MAX_SPEED = 2.0
+const ROT_SPEED = 1.0
 
 var prev_advance = false
-var deaccel = 20.0
-var accel = 5
-var max_speed = 2
-var rot_dir = 4
-var rot_speed = 1
-
 var dying = false
+var rot_dir = 4
 
 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()
@@ -53,18 +51,18 @@ func _integrate_forces(state):
 	var deaccel_dir = dir
 
 	if advance:
-		if dir.dot(lv) < max_speed:
-			lv += dir * accel * delta
+		if dir.dot(lv) < MAX_SPEED:
+			lv += dir * ACCEL * delta
 		deaccel_dir = dir.cross(g).normalized()
 	else:
 		if prev_advance:
 			rot_dir = 1
 
-		dir = Basis(up, rot_dir * rot_speed * delta).xform(dir)
+		dir = Basis(up, rot_dir * ROT_SPEED * delta).xform(dir)
 		get_node("Armature").set_transform(Transform().looking_at(-dir, up))
 
 	var dspeed = deaccel_dir.dot(lv)
-	dspeed -= deaccel * delta
+	dspeed -= DEACCEL * delta
 	if dspeed < 0:
 		dspeed = 0
 

+ 4 - 6
3d/platformer/player/follow_camera.gd

@@ -1,5 +1,8 @@
 extends Camera
 
+const MAX_HEIGHT = 2.0
+const MIN_HEIGHT = 0
+
 export var min_distance = 0.5
 export var max_distance = 3.5
 export var angle_v_adjust = 0.0
@@ -7,8 +10,6 @@ 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.
@@ -39,10 +40,7 @@ func _physics_process(dt):
 		delta = delta.normalized() * max_distance
 
 	# Check upper and lower height.
-	if delta.y > max_height:
-		delta.y = max_height
-	if delta.y < min_height:
-		delta.y = min_height
+	delta.y = clamp(delta.y, MIN_HEIGHT, MAX_HEIGHT)
 
 	# Check autoturn.
 	var ds = PhysicsServer.space_get_direct_state(get_world().get_space())

+ 30 - 28
3d/platformer/player/player.gd

@@ -1,29 +1,32 @@
 extends KinematicBody
 
-const ANIM_FLOOR = 0
-const ANIM_AIR = 1
+enum Anim {
+	FLOOR,
+	AIR,
+}
 
 const SHOOT_TIME = 1.5
 const SHOOT_SCALE = 2
 const CHAR_SCALE = Vector3(0.3, 0.3, 0.3)
+const MAX_SPEED = 4.5
 const TURN_SPEED = 40
+const JUMP_VELOCITY = 8.5
+const BULLET_SPEED = 20
+const AIR_IDLE_DEACCEL = false
+const ACCEL = 14.0
+const DEACCEL = 14.0
+const AIR_ACCEL_FACTOR = 0.4
+const SHARP_TURN_THRESHOLD = 140
 
 var movement_dir = Vector3()
 var linear_velocity = Vector3()
-
 var jumping = false
-
-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 shoot_blend = 0
 
 onready var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") * ProjectSettings.get_setting("physics/3d/default_gravity_vector")
 
+
 func _ready():
 	get_node("AnimationTree").set_active(true)
 
@@ -31,7 +34,7 @@ func _ready():
 func _physics_process(delta):
 	linear_velocity += gravity * delta
 
-	var anim = ANIM_FLOOR
+	var anim = Anim.FLOOR
 
 	var vv = linear_velocity.y # Vertical velocity.
 	var hv = Vector3(linear_velocity.x, 0, linear_velocity.z) # Horizontal velocity.
@@ -51,7 +54,7 @@ func _physics_process(delta):
 	var shoot_attempt = Input.is_action_pressed("shoot")
 
 	if is_on_floor():
-		var sharp_turn = hspeed > 0.1 and rad2deg(acos(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:
@@ -59,10 +62,10 @@ func _physics_process(delta):
 			else:
 				hdir = dir
 
-			if hspeed < max_speed:
-				hspeed += accel * delta
+			if hspeed < MAX_SPEED:
+				hspeed += ACCEL * delta
 		else:
-			hspeed -= deaccel * delta
+			hspeed -= DEACCEL * delta
 			if hspeed < 0:
 				hspeed = 0
 
@@ -79,22 +82,21 @@ func _physics_process(delta):
 		get_node("Armature").set_transform(Transform(m3, mesh_xform.origin))
 
 		if not jumping and jump_attempt:
-			vv = 7.0
+			vv = JUMP_VELOCITY
 			jumping = true
 			get_node("SoundJump").play()
 	else:
-		anim = ANIM_AIR
+		anim = Anim.AIR
 
 		if dir.length() > 0.1:
-			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)
-				if hspeed < 0:
-					hspeed = 0
-				hv = hdir * hspeed
+			hv += dir * (ACCEL * AIR_ACCEL_FACTOR * delta)
+			if hv.length() > MAX_SPEED:
+				hv = hv.normalized() * MAX_SPEED
+		elif AIR_IDLE_DEACCEL:
+			hspeed = hspeed - (DEACCEL * AIR_ACCEL_FACTOR * delta)
+			if hspeed < 0:
+				hspeed = 0
+			hv = hdir * hspeed
 
 	if jumping and vv < 0:
 		jumping = false
@@ -116,14 +118,14 @@ func _physics_process(delta):
 		var bullet = preload("res://player/bullet/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.set_linear_velocity(get_node("Armature/Bullet").get_global_transform().basis[2].normalized() * BULLET_SPEED)
 		bullet.add_collision_exception_with(self) # Add it to bullet.
 		get_node("SoundShoot").play()
 
 	prev_shoot = shoot_attempt
 
 	if is_on_floor():
-		$AnimationTree["parameters/walk/blend_amount"] = hspeed / max_speed
+		$AnimationTree["parameters/walk/blend_amount"] = hspeed / MAX_SPEED
 
 	$AnimationTree["parameters/state/current"] = anim
 	$AnimationTree["parameters/air_dir/blend_amount"] = clamp(-linear_velocity.y / 4 + 0.5, 0, 1)

+ 2 - 2
3d/platformer/player/player.tscn

@@ -1634,7 +1634,7 @@ input_1/auto_advance = false
 [sub_resource type="AnimationNodeBlend2" id=22]
 
 [sub_resource type="AnimationNodeBlendTree" id=23]
-graph_offset = Vector2( -294.243, -77.71 )
+graph_offset = Vector2( -680, -166 )
 nodes/Animation/node = SubResource( 17 )
 nodes/Animation/position = Vector2( -260, -280 )
 "nodes/Animation 2/node" = SubResource( 13 )
@@ -1841,7 +1841,7 @@ tree_root = SubResource( 23 )
 anim_player = NodePath("../AnimationPlayer")
 parameters/air_dir/blend_amount = 0.0
 parameters/gun/blend_amount = 0
-parameters/scale/scale = 1.2
+parameters/scale/scale = 1.5
 parameters/state/current = 0
 parameters/walk/blend_amount = 0.0
 

+ 4 - 0
3d/platformer/project.godot

@@ -139,6 +139,10 @@ shoot={
 
 multithread/thread_rid_pool_prealloc=60
 
+[physics]
+
+3d/default_gravity=14.0
+
 [rendering]
 
 quality/intended_usage/framebuffer_allocation=3

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


+ 4 - 6
3d/platformer/stage/texturemr.png.import

@@ -2,21 +2,19 @@
 
 importer="texture"
 type="StreamTexture"
-path.s3tc="res://.import/texturemr.png-93ff7bda7acbc5334b4181300007df27.s3tc.stex"
-path.etc2="res://.import/texturemr.png-93ff7bda7acbc5334b4181300007df27.etc2.stex"
+path="res://.import/texturemr.png-93ff7bda7acbc5334b4181300007df27.stex"
 metadata={
-"imported_formats": [ "s3tc", "etc2" ],
-"vram_texture": true
+"vram_texture": false
 }
 
 [deps]
 
 source_file="res://stage/texturemr.png"
-dest_files=[ "res://.import/texturemr.png-93ff7bda7acbc5334b4181300007df27.s3tc.stex", "res://.import/texturemr.png-93ff7bda7acbc5334b4181300007df27.etc2.stex" ]
+dest_files=[ "res://.import/texturemr.png-93ff7bda7acbc5334b4181300007df27.stex" ]
 
 [params]
 
-compress/mode=2
+compress/mode=0
 compress/lossy_quality=0.7
 compress/hdr_mode=0
 compress/bptc_ldr=0

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