用脚本实现虚拟棋盘格是制作某些游戏的基础其实本质还是基础的positon赋值和通过二维向量运算来进行移动
image.png
image.png
image.png

  1. extends Node2D
  2. export var unit size=Vector2(100,100)#单元格大小(像素)
  3. export var map_size=Vector2(10,10)#棋盘尺寸(列数,行数)
  4. onready var player $player
  5. #
  6. 移动到指定的坐标位置
  7. func move to(pos:Vector2)->void:
  8. var new_pos unit_size /2 (pos Vector2.ONE)unit size
  9. player.position new_pos

参数化棋盘格(绘制边线)

边线可绘制,可不绘制,这里采用的是动态创建line2D节点再加点法
image.png

  1. #绘制棋盘格边线
  2. func draw lines(-void:
  3. #绘制纵线
  4. for i in range(0,map_size.x 1):
  5. var vline Line2D.new()
  6. vline.width 1
  7. vline.add_point(Vector:2.RIGHT*unit_size.x*i)#添加顶部点
  8. vline.add point(Vector:2.RIGHT*unit size.x*i+Vector2.D0WN*unit_size*map_siZe)#添加J顶部点
  9. add child(vline)
  10. #绘制横线
  11. for j in range(0,map_size.y 1):
  12. var hline Line2D.new()
  13. hline.width 1
  14. hline.add point(Vector2.D0WN*unit size.y*j)#添加J顶部点
  15. hline.add_point(Vector2.D0WN*unit_siZe.y*j+Vector:2.RIGH*unit_size*map_size)#添加J顶部点
  16. add_child(hline)

参数化棋盘格(相对移动和转向)

move_to实现的是棋盘格上绝对定位的移动;
有些时候我们更需要相对于当前位置进行移动或旋转
image.png

  1. #===============
  2. 相对于自己的当前位置和转向进行移动
  3. #向正前方移动(相对于玩家当前的转向)
  4. func move_forward(step:=1):
  5. player.position +get_direction()unit_size step
  6. #向左侧移动(相对于玩家当前的转向)
  7. func move_left(step:=1):
  8. player.position +get_direction()rotated(-PI/2)unit_size step
  9. #向右侧移动(相对于玩家当前的转向)
  10. func move_right(step:=1):
  11. player.position +get_direction()rotated(PI/2)*unit_size step
  12. #向后方移动(相对于玩家当前的转向)
  13. func move_backward(step:=1):
  14. player.position +get_direction()rotated(PI)*unit_size step
  15. #
  16. 转向
  17. #向左转(相对于玩家当前的转向)
  18. func turn_left()
  19. player.rotation degrees -90
  20. #向右转(相对于玩家当前的转向)
  21. func turn_right()
  22. player.rotation degrees +90
  23. #向后转(相对于玩家当前的转向)
  24. func turn_back()
  25. player.rotation degrees +180
  26. #获取玩家当前的正方向
  27. func get_direction()-Vector2:
  28. #获取玩家现在的正方向
  29. var direction:Vector2
  30. match player.rotation_degrees
  31. 0.0:
  32. direction Vector2.RIGHT
  33. 90.0:
  34. direction Vector2.DOWN
  35. 180.0:
  36. direction Vector2.LEFT
  37. 270.0:
  38. direction Vector2.UP
  39. return direction

参数化棋盘格(实现移动过度)
其实在之前的例子中已经有了点到点移动的思路
image.png

  1. func _process(delta):
  2. if icon.position.distance_to(end_positon)>0:
  3. icon.position icon.position.move_toward(end_positon,speed

配合角色简单的行走动画,效果就更好了

参数化棋盘格-特殊使用-边缘排列(获取位置数组)

前几天受到群友启发想研究一下轮盘抽奖效果
其中想到了一种智能化边缘排列按钮(或其他节点)的想法
第一步首先计算出对应的边缘位置
image.png

  1. extends Node2D
  2. func _ready()
  3. print(postions(5))
  4. pass
  5. #获取棋盘格边缘的位置数组
  6. func postions(border_num:int)->PoolVector2Array:
  7. var n border_num
  8. var poss:PoolVector2Array
  9. for i in range(1,n):
  10. poss.append(Vector2(i,1))
  11. for j in range(1,n):
  12. poss.append(Vector2(n,j))
  13. for k in range(n,1,-1):
  14. poss.append(Vector2(k,n
  15. for h in range(n,1,-1):
  16. poss.append(Vector2(1,h))
  17. return poss

image.pngimage.pngimage.pngimage.png