【问题标题】:how to zoom in and out of a surface inside another surface pygame如何放大和缩小另一个表面pygame内的表面
【发布时间】:2022-11-09 06:01:16
【问题描述】:

我正在制作一个棋盘游戏,其中棋盘是 100x100,非常大,我注意到我只能显示大约 10x10,然后它变得太小而看不到,所以为了解决这个问题,我想实现一个放大/缩小功能,因此您可以看到整个电路板。

首先,我有一个 screen 变量。它是这样定义的:


    screen_width = 750
    screen_height = 550
    screen = p.display.set_mode((screen_width, screen_height))
    # -- and in the main game loop:
    screen.fill((255, 255, 255))
    all_sprites.draw(screen)
    buttons_group.draw(screen)
    options_group.draw(screen)

为了能够只调整电路板的大小而不调整它周围的任何东西,我创建了一个board 表面,以便我可以随意调整它的大小。我这样创建它:

board_width = 420
board_height = 420
board = p.Surface((board_width, board_height))
# -- and in the main game loop:
board.fill((255, 255, 255))
p.transform.scale(board, (board.get_width()+zoom, board.get_height()+zoom))
zoom = 0
grid_slots.draw(board)
available_slots_group.draw(board)
items_group.draw(board)
screen.blit(board, ((280, 90), (700, 510)))

zoom 变量是我根据鼠标滚轮递增和递减的变量。

但是现在缩放不起作用。即使缩放值发生变化,板也不会变大或变小。

我让表面完全“调整大小”,如下所示:它被切断了,没有任何东西变大或变小,而是表面的“窗口”正在缩小。我不记得我是怎么做到的,但这仍然不是我想做的。

所以问题是:如何放大表面中的内容,并且该表面位于screen 表面中?所以表面并没有变大并超过整个屏幕,而是它里面的东西会变大或变小。

【问题讨论】:

    标签: python pygame zooming surface


    【解决方案1】:

    您在已经调整大小的表面上绘图。所以你应该先绘制然后调整表面的大小。


    另一种方法是根本不调整表面大小,而是更改您绘制的坐标。为了实现这一点,我不会将缩放变量添加到坐标中,而是将矩形、图像的 x、y、宽度和高度相乘......正常缩放将是 1 而不是 0。

    坐标转换函数:

    zoom = 0.5 # zoom out
    
    # input: (x, y) or (x, y, w, h)
    def zoom_coord(coord):
        out = []
        for i in coord:
            out.append(i*zoom)
        return out
    
    zoom_coord((5, 10))
    # -> (2.5, 5)
    

    您可以只用缩放来将其转换回来,即。转换鼠标位置。

    所以你将p.draw.rect(board, (0, 0, 0), player_rect) 更改为p.draw.rect(board, (0, 0, 0), zoom_coord(player_rect))

    【讨论】:

    • 每次用户想要放大或缩小时调整数百张图像的大小会不会有点要求?我尝试将所有内容绘制到board 表面,然后调整其大小,但这没有用
    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2014-09-09
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    相关资源
    最近更新 更多