
extends Node2Dvar speed = 50.0 # 移动速度var vel = Vector2.ZERO # 速度向量var g = 9.8 # 重力加速度var is_dd_flying = false # 子弹在飞:)var max_points = 200onready 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 = truefunc _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_positionvel = Vector2.RIGHT.rotated(deg2rad(dd.rotation_degrees))line.clear_points()line.add_point(pos)for i in max_points:pos += vel * speedvel.y += g * deltaline.add_point(pos)func _on_VisibilityNotifier2D_screen_exited():is_dd_flying = falsepass

折腾半天也没有折腾成功。
不过已经很有成就感了。
如果炮弹换成刚体,再弄几个箱子,就可以做一个简单的小游戏了。
还有两个有趣的问题是:
- 如何实现定点攻击?
- 如何实现45度视角或近似视角的全方位抛物线?
两个思路
1.用Path2D和PathFllow2D
这种形式,可以实现精确的定点射击抛物线。
子弹或箭矢直接沿着路径曲线走就行。
2.用数学公式
之前KidsCanCode的思路,只是给了一个模拟的思路,但是在数学和物理上并不精确。
我们可以使用更精确的公式来计算,也可以更精确的控制。


