用脚本实现虚拟棋盘格是制作某些游戏的基础其实本质还是基础的positon赋值和通过二维向量运算来进行移动
extends Node2D
export var unit size=Vector2(100,100)#单元格大小(像素)
export var map_size=Vector2(10,10)#棋盘尺寸(列数,行数)
onready var player $player
#
移动到指定的坐标位置
func move to(pos:Vector2)->void:
var new_pos unit_size /2 (pos Vector2.ONE)unit size
player.position new_pos
参数化棋盘格(绘制边线)
边线可绘制,可不绘制,这里采用的是动态创建line2D节点再加点法
#绘制棋盘格边线
func draw lines(-void:
#绘制纵线
for i in range(0,map_size.x 1):
var vline Line2D.new()
vline.width 1
vline.add_point(Vector:2.RIGHT*unit_size.x*i)#添加顶部点
vline.add point(Vector:2.RIGHT*unit size.x*i+Vector2.D0WN*unit_size*map_siZe)#添加J顶部点
add child(vline)
#绘制横线
for j in range(0,map_size.y 1):
var hline Line2D.new()
hline.width 1
hline.add point(Vector2.D0WN*unit size.y*j)#添加J顶部点
hline.add_point(Vector2.D0WN*unit_siZe.y*j+Vector:2.RIGH*unit_size*map_size)#添加J顶部点
add_child(hline)
参数化棋盘格(相对移动和转向)
move_to实现的是棋盘格上绝对定位的移动;
有些时候我们更需要相对于当前位置进行移动或旋转
#===============
相对于自己的当前位置和转向进行移动
#向正前方移动(相对于玩家当前的转向)
func move_forward(step:=1):
player.position +get_direction()unit_size step
#向左侧移动(相对于玩家当前的转向)
func move_left(step:=1):
player.position +get_direction()rotated(-PI/2)unit_size step
#向右侧移动(相对于玩家当前的转向)
func move_right(step:=1):
player.position +get_direction()rotated(PI/2)*unit_size step
#向后方移动(相对于玩家当前的转向)
func move_backward(step:=1):
player.position +get_direction()rotated(PI)*unit_size step
#
转向
#向左转(相对于玩家当前的转向)
func turn_left()
player.rotation degrees -90
#向右转(相对于玩家当前的转向)
func turn_right()
player.rotation degrees +90
#向后转(相对于玩家当前的转向)
func turn_back()
player.rotation degrees +180
#获取玩家当前的正方向
func get_direction()-Vector2:
#获取玩家现在的正方向
var direction:Vector2
match player.rotation_degrees
0.0:
direction Vector2.RIGHT
90.0:
direction Vector2.DOWN
180.0:
direction Vector2.LEFT
270.0:
direction Vector2.UP
return direction
参数化棋盘格(实现移动过度)
其实在之前的例子中已经有了点到点移动的思路
func _process(delta):
if icon.position.distance_to(end_positon)>0:
icon.position icon.position.move_toward(end_positon,speed
参数化棋盘格-特殊使用-边缘排列(获取位置数组)
前几天受到群友启发想研究一下轮盘抽奖效果
其中想到了一种智能化边缘排列按钮(或其他节点)的想法
第一步首先计算出对应的边缘位置
extends Node2D
func _ready()
print(postions(5))
pass
#获取棋盘格边缘的位置数组
func postions(border_num:int)->PoolVector2Array:
var n border_num
var poss:PoolVector2Array
for i in range(1,n):
poss.append(Vector2(i,1))
for j in range(1,n):
poss.append(Vector2(n,j))
for k in range(n,1,-1):
poss.append(Vector2(k,n
for h in range(n,1,-1):
poss.append(Vector2(1,h))
return poss