Rebond et friction
Trois balles lâchées de la même hauteur avec trois réglages de PhysicsMaterial. La valeur de bounce fait toute la différence.
L'éditeur ci-dessus fait tourner ce projet. Changez une ligne et il se recharge.
Classes Godot utilisées
PhysicsMaterialRigidBody2DStaticBody2D
Le code
scripts/main.gd
extends Node
const RADIUS: float = 34.0
const MATERIALS: Array = [
{bounce = 0.0, friction = 1.0, label = 'bounce 0.0', color = '#fc7f7f'},
{bounce = 0.5, friction = 0.5, label = 'bounce 0.5', color = '#8da5f3'},
{bounce = 0.95, friction = 0.1, label = 'bounce 0.95', color = '#8eef97'},
]
func _ready() -> void:
_add_background()
var view: Vector2 = get_viewport().get_visible_rect().size
_add_floor(Vector2(view.x * 0.5, view.y - 30), Vector2(view.x, 60))
for i in MATERIALS.size():
var entry: Dictionary = MATERIALS[i]
var at: Vector2 = Vector2(view.x * (i + 1) / (MATERIALS.size() + 1), view.y * 0.15)
_add_ball(at, entry)
_add_label(entry.label, at + Vector2(-46, -70))
print('same drop height, three PhysicsMaterial values')
func _add_ball(at: Vector2, entry: Dictionary) -> void:
var material: PhysicsMaterial = PhysicsMaterial.new()
material.bounce = entry.bounce
material.friction = entry.friction
var circle: CircleShape2D = CircleShape2D.new()
circle.radius = RADIUS
var collision: CollisionShape2D = CollisionShape2D.new()
collision.shape = circle
var ball: RigidBody2D = RigidBody2D.new()
ball.position = at
ball.physics_material_override = material
ball.add_child(_make_circle(RADIUS, Color(entry.color)))
ball.add_child(collision)
add_child(ball)
func _add_floor(center: Vector2, size: Vector2) -> void:
var material: PhysicsMaterial = PhysicsMaterial.new()
material.bounce = 0.4
var shape: RectangleShape2D = RectangleShape2D.new()
shape.size = size
var collision: CollisionShape2D = CollisionShape2D.new()
collision.shape = shape
var rect: Polygon2D = Polygon2D.new()
rect.polygon = PackedVector2Array([-size * 0.5, Vector2(size.x, -size.y) * 0.5, size * 0.5, Vector2(-size.x, size.y) * 0.5])
rect.color = Color('#2a2f3d')
var body: StaticBody2D = StaticBody2D.new()
body.position = center
body.physics_material_override = material
body.add_child(rect)
body.add_child(collision)
add_child(body)
func _add_label(text: String, at: Vector2) -> void:
var label: Label = Label.new()
label.text = text
label.position = at
label.add_theme_color_override('font_color', Color('#999999'))
add_child(label)
func _make_circle(radius: float, color: Color) -> Polygon2D:
var points: PackedVector2Array = PackedVector2Array()
for i in 24:
points.append(Vector2(cos(TAU * i / 24.0), sin(TAU * i / 24.0)) * radius)
var circle: Polygon2D = Polygon2D.new()
circle.polygon = points
circle.color = color
return circle
func _add_background() -> void:
var background: ColorRect = ColorRect.new()
background.color = Color('#12141a')
add_child(background)
background.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)