extends Node2D
var speed = 50.0 # 移动速度
var vel = Vector2.ZERO # 速度向量
var g = 9.8 # 重力加速度
var is_dd_flying = false # 子弹在飞:)
var max_points = 200
onready var dd= $"dd" # 子弹
onready var pos2d= $"base/body/Position2D"
onready var pao_body= $"base/body"
onready var line= $"Line2D"
func _unhandled_input(event):
if event is InputEventMouseButton:
if event.button_index == BUTTON_LEFT:
if event.is_pressed():
if not is_dd_flying:
is_dd_flying = true
func _process(delta):
if is_dd_flying:
vel = Vector2.RIGHT.rotated(deg2rad(dd.rotation_degrees))
vel.y += g * delta # 每帧加上重力影响
dd.rotation_degrees = rad2deg(vel.angle()) # 更新子弹朝向
dd.global_position += vel * speed# 移动
else:
# 炮塔朝向鼠标位置
pao_body.look_at(get_global_mouse_position())
# 炮弹跟随旋转和移动
dd.global_position= pos2d.global_position # 子弹跟随炮筒的尖端位置
dd.rotation_degrees = pos2d.global_rotation_degrees # 朝向与炮筒一致
#
# 绘制炮弹抛物线轨迹
var pos = dd.global_position
vel = Vector2.RIGHT.rotated(deg2rad(dd.rotation_degrees))
line.clear_points()
line.add_point(pos)
for i in max_points:
pos += vel * speed
vel.y += g * delta
line.add_point(pos)
func _on_VisibilityNotifier2D_screen_exited():
is_dd_flying = false
pass
折腾半天也没有折腾成功。
不过已经很有成就感了。
如果炮弹换成刚体,再弄几个箱子,就可以做一个简单的小游戏了。
还有两个有趣的问题是:
- 如何实现定点攻击?
- 如何实现45度视角或近似视角的全方位抛物线?
两个思路
1.用Path2D和PathFllow2D
这种形式,可以实现精确的定点射击抛物线。
子弹或箭矢直接沿着路径曲线走就行。
2.用数学公式
之前KidsCanCode的思路,只是给了一个模拟的思路,但是在数学和物理上并不精确。
我们可以使用更精确的公式来计算,也可以更精确的控制。