image.png

  1. extends Node2D
  2. var speed = 50.0 # 移动速度
  3. var vel = Vector2.ZERO # 速度向量
  4. var g = 9.8 # 重力加速度
  5. var is_dd_flying = false # 子弹在飞:)
  6. var max_points = 200
  7. onready var dd= $"dd" # 子弹
  8. onready var pos2d= $"base/body/Position2D"
  9. onready var pao_body= $"base/body"
  10. onready var line= $"Line2D"
  11. func _unhandled_input(event):
  12. if event is InputEventMouseButton:
  13. if event.button_index == BUTTON_LEFT:
  14. if event.is_pressed():
  15. if not is_dd_flying:
  16. is_dd_flying = true
  17. func _process(delta):
  18. if is_dd_flying:
  19. vel = Vector2.RIGHT.rotated(deg2rad(dd.rotation_degrees))
  20. vel.y += g * delta # 每帧加上重力影响
  21. dd.rotation_degrees = rad2deg(vel.angle()) # 更新子弹朝向
  22. dd.global_position += vel * speed# 移动
  23. else:
  24. # 炮塔朝向鼠标位置
  25. pao_body.look_at(get_global_mouse_position())
  26. # 炮弹跟随旋转和移动
  27. dd.global_position= pos2d.global_position # 子弹跟随炮筒的尖端位置
  28. dd.rotation_degrees = pos2d.global_rotation_degrees # 朝向与炮筒一致
  29. #
  30. # 绘制炮弹抛物线轨迹
  31. var pos = dd.global_position
  32. vel = Vector2.RIGHT.rotated(deg2rad(dd.rotation_degrees))
  33. line.clear_points()
  34. line.add_point(pos)
  35. for i in max_points:
  36. pos += vel * speed
  37. vel.y += g * delta
  38. line.add_point(pos)
  39. func _on_VisibilityNotifier2D_screen_exited():
  40. is_dd_flying = false
  41. pass

2222992.gif
折腾半天也没有折腾成功。
不过已经很有成就感了。
如果炮弹换成刚体,再弄几个箱子,就可以做一个简单的小游戏了。
还有两个有趣的问题是:

  • 如何实现定点攻击?
  • 如何实现45度视角或近似视角的全方位抛物线?

扫描全能王 2022-05-21 01.42.jpg
王国保卫战很值得学习。
image.png

两个思路

1.用Path2D和PathFllow2D
这种形式,可以实现精确的定点射击抛物线。
子弹或箭矢直接沿着路径曲线走就行。
2.用数学公式
之前KidsCanCode的思路,只是给了一个模拟的思路,但是在数学和物理上并不精确。
我们可以使用更精确的公式来计算,也可以更精确的控制。

实现导弹轨迹的绘制 - 图5