我希望能够调整扫雷游戏的表面尺寸。
我已经读过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()
答案 0 :(得分:0)
如果您希望瓷砖为正方形,则必须计算瓷砖的宽度和高度的最小值。您必须四舍五入窗口大小和瓦片数的商,以确保所有瓦片都适合窗口:
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 :(得分:0)
答案是检查所有瓷砖是否都可以装入窗户。由于图块的位置必须是整数(每个像素为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)
我所做的是: 用户使用鼠标调整窗口大小后,如果瓷砖无法完美地适合窗口,我便调整了窗口大小。