rotation_ Degrees 90 并不总是整数

问题描述 投票:0回答:1

我决定学习 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值。

rotation godot4
1个回答
0
投票

因为它有助于解决问题,所以我将我的想法添加为答案,而不知道 godot 底层数学的确切问题。

即使您从当前旋转中减去一个整数,似乎也存在舍入问题。

一种解决方案可以是:

  1. 添加一个包含所有可能旋转的数组(例如 [0,90,180,270] )以及每个元素的索引。
  2. 在旋转时,从索引中加或减 1,并使用模数保持在该数组的范围之间,然后将旋转设置为固定值,而不是直接从当前旋转中减去。

这可能看起来像这样:

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]
© www.soinside.com 2019 - 2024. All rights reserved.