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


extends Node2Dexport 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 sizeplayer.position new_pos
参数化棋盘格(绘制边线)
边线可绘制,可不绘制,这里采用的是动态创建line2D节点再加点法
#绘制棋盘格边线func draw lines(-void:#绘制纵线for i in range(0,map_size.x 1):var vline Line2D.new()vline.width 1vline.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 1hline.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:Vector2match player.rotation_degrees0.0:direction Vector2.RIGHT90.0:direction Vector2.DOWN180.0:direction Vector2.LEFT270.0:direction Vector2.UPreturn direction
参数化棋盘格(实现移动过度)
其实在之前的例子中已经有了点到点移动的思路
func _process(delta):if icon.position.distance_to(end_positon)>0:icon.position icon.position.move_toward(end_positon,speed
参数化棋盘格-特殊使用-边缘排列(获取位置数组)
前几天受到群友启发想研究一下轮盘抽奖效果
其中想到了一种智能化边缘排列按钮(或其他节点)的想法
第一步首先计算出对应的边缘位置
extends Node2Dfunc _ready()print(postions(5))pass#获取棋盘格边缘的位置数组func postions(border_num:int)->PoolVector2Array:var n border_numvar poss:PoolVector2Arrayfor 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,nfor h in range(n,1,-1):poss.append(Vector2(1,h))return poss




