我决定学习 godot,并从俄罗斯方块克隆开始学习。一切都很顺利,只是偶尔当我旋转 Node2d 对象时,它不会设置为整数。然后,当我检查组成四格骨牌的每个框时,我会得到一个交叉点,因为它只是......只是稍微倾斜。
寻找有关如何阻止这种行为的任何想法。我尝试通过只允许添加/减去整数来强制,但这不起作用
代码非常简单。变量: border => 传入一个定义游戏区域的 Rect2 Playblocks => 从之前的片段中设置的单个块的数组 get_boundary() => 根据组成四格板的各个块位置返回该块的 Rect2
func rotate_piece(boundary,playedblocks):
if(!movable):return
color_blocks(Color.RED)
self.rotation_degrees += int(90)
var isenclosed = boundary.encloses(get_boundary())
var doesintersect = IntersectsPlayedPieces(playedblocks)
if(!isenclosed || doesintersect):
self.rotation_degrees -= int(90)
func IntersectsPlayedPieces(playedblocks)-> bool:
var intersects = false
for setblock in playedblocks:
if(!setblock.is_deleted()):
var setrect = setblock.get_rect()
for currblock in blocks:
var currrect = currblock.get_rect()
if(setrect.intersects(currrect,false)):
intersects = true
return intersects
正如你从图片中看到的,如果我把它翻转过来,我就把它涂成红色。其他一切都是灰色的,所以我很容易诊断。我多次转动红色部件,直到看到非完整值并看到下一个部件停在设置的部件上方。
顶部是红色块的rotation_degs值。
因为它有助于解决问题,所以我将我的想法添加为答案,而不知道 godot 底层数学的确切问题。
即使您从当前旋转中减去一个整数,似乎也存在舍入问题。
一种解决方案可以是:
这可能看起来像这样:
var possible_rotations = [0,90,180,270]
var current_rotation = 0
func rotate_piece(boundary,playedblocks):
if(!movable):return
var last_rotation = current_rotation
color_blocks(Color.RED)
current_rotation = (current_rotation + 1) % possible_rotations.size()
self.rotation_degrees = possible_rotations[current_rotation]
var isenclosed = boundary.encloses(get_boundary())
var doesintersect = IntersectsPlayedPieces(playedblocks)
if(!isenclosed || doesintersect):
self.rotation_degrees = possible_rotations[last_rotation]