微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。