在pygame中调整窗口大小后如何调整表面元素的大小?

问题描述

我希望能够调整扫雷游戏的表面尺寸。 我已经读过this,但只能使用50%。 我确实使用event.dict['size']得到了新的宽度和高度(在调整大小之后),但是图像放置不正确,我也不知道为什么,因为代码在逻辑上看起来是正确的。

这是正常窗口:

当我向右扩展窗口时,它看起来像这样:

当我将其缩小时,它看起来像这样:

那是为什么?这是我编写的代码

if event.type == pg.VIDEORESIZE:

        new_w,new_h = event.dict['size']

        if state.current_state == "Game":
            game.cell_width = new_w//game.COLUMNS
            game.cell_height = new_h//game.ROWS
            game_handler.render()

game_handler函数

def render(self):

    for cell in self.game.cells:
        img = pg.image.load(cell.cell_img_path)
        img = pg.transform.scale(img,(self.game.cell_width,self.game.cell_height))
        self.display.blit(img,(cell.column*self.game.cell_width,cell.row*self.game.cell_height))
        
    pg.display.update()

解决方法

如果您希望瓷砖为正方形,则必须计算瓷砖的宽度和高度的最小值。您必须四舍五入窗口大小和瓦片数的商,以确保所有瓦片都适合窗口:

def div_round_up(a,b):
    return a // b + (a % b > 0)

tile_width  = div_round_up(new_w,game.COLUMNS)
tile_height = div_round_up(new_h,game.ROWS)
square_size = min(tile_width,tile_height)

game.cell_width  = square_size 
game.cell_height = square_size 
,

答案是检查所有瓷砖是否都可以装入窗户。由于图块的位置必须是整数(每个像素为1),因此在调整大小后,很可能发生第一行的(例如)20个图块无法容纳到例如调整大小后的宽度为900像素。但是,如果将窗口大小调整为1000像素宽,则20块图块将再次适合,因为1000%20 == 0。

因此,解决方案是:

if event.type == pg.VIDEORESIZE:
        

        new_w,new_h = event.dict['size']   

        if new_w % game.COLUMNS != 0 or new_h % game.ROWS != 0:
            delta_width = new_w % game.COLUMNS
            delta_height = new_h % game.ROWS
            SCREEN = pg.display.set_mode((new_w - delta_width,new_h - delta_height),pg.RESIZABLE)
        else:
            SCREEN = pg.display.set_mode((new_w,new_h),pg.RESIZABLE)

我所做的是: 用户使用鼠标调整窗口大小后,如果瓷砖无法完美地适合窗口,我便调整了窗口大小。