我们用InkScape或其他矢量绘图软件快速绘制一个俯视角的简单炮塔素材。
image.png
然后将素材按部件拆分成如下形式:
image.png
注意各个部件的矩形区域不要重合。
导出PNG图片,导入到我们的项目中。
image.png
image.png
image.png
image.png
Ctrl+D复制一个Sprite,
image.png
image.pngimage.png
image.png

image.png
image.png
image.png
image.png
image.png

image.pngimage.png
由于我们设定Position2D为body也就是炮塔的子节点,所以Position2D会随着炮塔的旋转而旋转。
image.png
为了模拟真实的效果,我们为炮塔基座base和炮塔的炮筒部分分别设置碰撞形状。
image.png
image.png
我们为炮塔根节点turret添加脚本如下:

  1. extends StaticBody2D
  2. onready var body = $base/body
  3. func _process(delta):
  4. body.look_at(get_global_mouse_position())

可以看到熟悉的代码,使我们 之前用过的look_at()方法。
这里我们只实现简单的炮塔跟随鼠标旋转,并在点击后,向其所在位置发射炮弹。

  1. extends StaticBody2D
  2. const bullet = preload("res://bullet.tscn")
  3. onready var body = $base/body
  4. onready var bullet_start_pos = $base/body/body/Position2D
  5. func _process(delta):
  6. body.look_at(get_global_mouse_position())
  7. func shoot():
  8. var b= bullet.instance()
  9. add_child(b)
  10. b.dir = global_position.direction_to(get_global_mouse_position())
  11. b.global_position = bullet_start_pos.global_position
  12. b.global_rotation = b.dir.angle()
  13. func _input(event):
  14. if event is InputEventMouseButton:
  15. if event.button_index == BUTTON_LEFT:
  16. if event.pressed:
  17. shoot()

为子弹添加脚本:

  1. extends Area2D
  2. var speed = 20.0
  3. var dir
  4. func _physics_process(delta):
  5. global_position += dir.normalized() * speed
  6. pass

创建一个main场景,拖入一个turret实例。
image.png
image.png

运行效果

2222.gif