如何解决在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 举报,一经查实,本站将立刻删除。