generated from krampus/template-godot4
	Compare commits
	
		
			2 Commits
		
	
	
		
			cf185592d6
			...
			115b31568f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 115b31568f | |||
| 2b4495bbc9 | 
| @ -15,6 +15,7 @@ enum Type { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const MAGNUS_SQ_EPSILON := 1e-3 | const MAGNUS_SQ_EPSILON := 1e-3 | ||||||
|  | const SURFACE_SNAP_DISTANCE := 2.0 | ||||||
| 
 | 
 | ||||||
| ## If enabled, ball ability cooldown is only reset at end of shot. | ## If enabled, ball ability cooldown is only reset at end of shot. | ||||||
| @export var once_per_shot_ability := false | @export var once_per_shot_ability := false | ||||||
| @ -117,6 +118,22 @@ func get_damage() -> float: | |||||||
| 	return base_damage + linear_velocity.length_squared() * damage_force_scale | 	return base_damage + linear_velocity.length_squared() * damage_force_scale | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | ## Get the surface position immediately under the ball. | ||||||
|  | ## This will typically be the surface the ball is laying on. | ||||||
|  | ## If the ball is not on a surface, this will be the position of the ball itself. | ||||||
|  | func get_surface_snap_point() -> Vector3: | ||||||
|  | 	var params := PhysicsRayQueryParameters3D.create( | ||||||
|  | 		global_position, | ||||||
|  | 		global_position - get_reoriented_basis().y * SURFACE_SNAP_DISTANCE, | ||||||
|  | 		collision_mask, | ||||||
|  | 		[get_rid()] | ||||||
|  | 	) | ||||||
|  | 	var collisions := get_world_3d().direct_space_state.intersect_ray(params) | ||||||
|  | 	if collisions: | ||||||
|  | 		return collisions["position"] as Vector3 | ||||||
|  | 	return global_position | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| func _magnus_force() -> Vector3: | func _magnus_force() -> Vector3: | ||||||
| 	return magnus_coefficient * radius * angular_velocity.cross(linear_velocity) | 	return magnus_coefficient * radius * angular_velocity.cross(linear_velocity) | ||||||
| 
 | 
 | ||||||
| @ -133,13 +150,14 @@ func _integrate_forces(state: PhysicsDirectBodyState3D) -> void: | |||||||
| 		_surface_time_s = 0.0 | 		_surface_time_s = 0.0 | ||||||
| 		# TODO something's fucky here... I think this gets called once after the ball sleeps | 		# TODO something's fucky here... I think this gets called once after the ball sleeps | ||||||
| 
 | 
 | ||||||
| 	if state.get_contact_count(): | 	var contacts := state.get_contact_count() | ||||||
|  | 	if contacts: | ||||||
| 		# Ball is in contact with a surface | 		# Ball is in contact with a surface | ||||||
| 
 | 
 | ||||||
| 		# We want the contact normal which minimizes the angle to the up vector | 		# We want the contact normal which minimizes the angle to the up vector | ||||||
| 		var min_dot := -1.0 | 		var min_dot := -2.0 | ||||||
| 		var primary_body: Node | 		var primary_body: Node | ||||||
| 		for i: int in range(state.get_contact_count()): | 		for i: int in range(contacts): | ||||||
| 			var norm := state.get_contact_local_normal(i) | 			var norm := state.get_contact_local_normal(i) | ||||||
| 			var dot := norm.dot(Vector3.UP) | 			var dot := norm.dot(Vector3.UP) | ||||||
| 			if dot > min_dot: | 			if dot > min_dot: | ||||||
| @ -175,8 +193,6 @@ func _physics_process(delta: float) -> void: | |||||||
| 	_shot_time_s += delta | 	_shot_time_s += delta | ||||||
| 	_surface_time_s += delta | 	_surface_time_s += delta | ||||||
| 
 | 
 | ||||||
| 	physics_material_override.bounce = terrain_physics.get_params(_surface_terrain).bounce |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| func enter_zone(zone: BallZone) -> void: | func enter_zone(zone: BallZone) -> void: | ||||||
| 	_zones.push_back(zone) | 	_zones.push_back(zone) | ||||||
| @ -225,6 +241,8 @@ func _on_collision(body: Node) -> void: | |||||||
| 		sfx.play_sfx(terrain) | 		sfx.play_sfx(terrain) | ||||||
| 		effects.play_effect(terrain) | 		effects.play_effect(terrain) | ||||||
| 
 | 
 | ||||||
|  | 	linear_velocity *= clampf(1 - terrain_physics.get_params(terrain).impact_damp, 0, 1) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| func _fire_sleep_signal() -> void: | func _fire_sleep_signal() -> void: | ||||||
| 	sleeping = true | 	sleeping = true | ||||||
|  | |||||||
| @ -5,63 +5,63 @@ | |||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_casfi"] | [sub_resource type="Resource" id="Resource_casfi"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 1.15 | linear_damp = 1.05 | ||||||
| angular_damp = 3.0 | angular_damp = 3.0 | ||||||
| bounce = 0.9 | impact_damp = 0.05 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_3k63c"] | [sub_resource type="Resource" id="Resource_3k63c"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 0.0 | linear_damp = 0.0 | ||||||
| angular_damp = 0.0 | angular_damp = 0.01 | ||||||
| bounce = 0.5 | impact_damp = 0.0 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_xf73q"] | [sub_resource type="Resource" id="Resource_xf73q"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 4.4 | linear_damp = 2.8 | ||||||
| angular_damp = 4.0 | angular_damp = 4.0 | ||||||
| bounce = 0.4 | impact_damp = 0.3 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_nhn3l"] | [sub_resource type="Resource" id="Resource_nhn3l"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 0.86 | linear_damp = 0.86 | ||||||
| angular_damp = 1.0 | angular_damp = 1.0 | ||||||
| bounce = 0.9 | impact_damp = 0.0 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_m3wjo"] | [sub_resource type="Resource" id="Resource_m3wjo"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 2.3 | linear_damp = 1.25 | ||||||
| angular_damp = 4.0 | angular_damp = 4.0 | ||||||
| bounce = 0.4 | impact_damp = 0.3 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_h4rld"] | [sub_resource type="Resource" id="Resource_h4rld"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 1.62 | linear_damp = 1.62 | ||||||
| angular_damp = 1.0 | angular_damp = 1.0 | ||||||
| bounce = 0.9 | impact_damp = 0.0 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_j6lib"] | [sub_resource type="Resource" id="Resource_j6lib"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 4.7 | linear_damp = 4.0 | ||||||
| angular_damp = 2.0 | angular_damp = 2.0 | ||||||
| bounce = 0.6 | impact_damp = 0.15 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_7f7ql"] | [sub_resource type="Resource" id="Resource_7f7ql"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 7.6 | linear_damp = 3.0 | ||||||
| angular_damp = 4.0 | angular_damp = 8.0 | ||||||
| bounce = 0.3 | impact_damp = 0.5 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_pusmf"] | [sub_resource type="Resource" id="Resource_pusmf"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 12.0 | linear_damp = 4.0 | ||||||
| angular_damp = 32.0 | angular_damp = 4.0 | ||||||
| bounce = 0.0 | impact_damp = 0.7 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="Resource" id="Resource_edkxb"] | [sub_resource type="Resource" id="Resource_edkxb"] | ||||||
| script = ExtResource("1_45pis") | script = ExtResource("1_45pis") | ||||||
| linear_damp = 1.55 | linear_damp = 1.25 | ||||||
| angular_damp = 1.3 | angular_damp = 1.3 | ||||||
| bounce = 0.8 | impact_damp = 0.15 | ||||||
| 
 | 
 | ||||||
| [resource] | [resource] | ||||||
| script = ExtResource("2_yuehx") | script = ExtResource("2_yuehx") | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ | |||||||
| [ext_resource type="PackedScene" uid="uid://cm4bb3lg4mfd2" path="res://src/world/effects/splash/splash_effect.tscn" id="12_qlrvx"] | [ext_resource type="PackedScene" uid="uid://cm4bb3lg4mfd2" path="res://src/world/effects/splash/splash_effect.tscn" id="12_qlrvx"] | ||||||
| 
 | 
 | ||||||
| [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_u134x"] | [sub_resource type="PhysicsMaterial" id="PhysicsMaterial_u134x"] | ||||||
| bounce = 0.4 | bounce = 0.8 | ||||||
| 
 | 
 | ||||||
| [sub_resource type="SphereMesh" id="SphereMesh_y0d13"] | [sub_resource type="SphereMesh" id="SphereMesh_y0d13"] | ||||||
| material = ExtResource("3_rc7m1") | material = ExtResource("3_rc7m1") | ||||||
|  | |||||||
| @ -5,6 +5,6 @@ class_name TerrainParameters extends Resource | |||||||
| @export var linear_damp := 0.0 | @export var linear_damp := 0.0 | ||||||
| ## Angular damping applied while in contact with the terrain surface. | ## Angular damping applied while in contact with the terrain surface. | ||||||
| @export var angular_damp := 0.0 | @export var angular_damp := 0.0 | ||||||
| 
 | ## Linear damping applied the frame the ball makes contact with the surface. | ||||||
| ## Physical bounciness of the terrain. Use this instead of the physics material override. | ## This is applied in addition `linear_damp`. | ||||||
| @export var bounce := 0.0 | @export var impact_damp := 0.0 | ||||||
|  | |||||||
| @ -393,7 +393,7 @@ func travel_to_ball() -> void: | |||||||
| 		return | 		return | ||||||
| 
 | 
 | ||||||
| 	game_ball.freeze = true | 	game_ball.freeze = true | ||||||
| 	global_position = game_ball.global_position | 	global_position = game_ball.get_surface_snap_point() | ||||||
| 
 | 
 | ||||||
| 	# Re-orient to the ball's last contact normal if there is one. | 	# Re-orient to the ball's last contact normal if there is one. | ||||||
| 	# Normally this will just be Vector3.UP or something close to it. | 	# Normally this will just be Vector3.UP or something close to it. | ||||||
| @ -401,9 +401,6 @@ func travel_to_ball() -> void: | |||||||
| 	_target_rotation.y = 0 | 	_target_rotation.y = 0 | ||||||
| 	global_basis = game_ball.get_reoriented_basis() | 	global_basis = game_ball.get_reoriented_basis() | ||||||
| 
 | 
 | ||||||
| 	# Adjust position downward to account for ball radius |  | ||||||
| 	global_position -= global_basis.y.normalized() * game_ball.radius |  | ||||||
| 
 |  | ||||||
| 	ball_point.snap() | 	ball_point.snap() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user