在pygame中创建一个“框架”,隐藏除其内容以外的所有内容

2024-04-20 08:14:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始玩pyGame,我想创建一个框架来裁剪屏幕上显示的任何内容。 i、 独立于我的世界所包含的东西,这个框架应该涵盖除它所包含的以外的一切。你知道吗

把它想象成iphone上用来裁剪图像的框架(见下图)。最后,我想让这个框架具有交互性,这样我就可以移动它或者改变它的大小,但目前静态框架就可以了。 我不知道从哪里开始。。感谢您的帮助!你知道吗

[example of cropping frame[1]


Tags: 图像框架内容屏幕世界静态pygameiphone
1条回答
网友
1楼 · 发布于 2024-04-20 08:14:19

有多种方法可以做到这一点;一种方法是在整个屏幕上绘制一个黑色Surface,但在该黑色Surface中有一个“洞”。你知道吗

创建这个“洞”的一个简单方法是用右边的colorkey画一个矩形。什么是^{}?你知道吗

When blitting this Surface onto a destination, any pixels that have the same color as the colorkey will be transparent

听起来很有用,让我们试试:

import random
import pygame as pg

IMAGE = pg.Surface((50, 50), pg.SRCALPHA)
pg.draw.polygon(IMAGE, (240, 120, 0), [(0, 50), (25, 0), (50, 50)])

class Actor(pg.sprite.Sprite):

    def __init__(self, grp, bounds, pos):
        self._layer = 0
        pg.sprite.Sprite.__init__(self, grp)
        self.image = IMAGE
        self.rect = self.image.get_rect(center=pos)
        self.vec = pg.math.Vector2()
        # just a random directon for movement
        self.vec.from_polar((10, random.randrange(0, 360)))
        self.bounds = bounds

    def update(self):
        self.rect.move_ip(*self.vec)
        # try staying on screen
        if not self.bounds.contains(self.rect):
            self.vec.from_polar((10, random.randrange(0, 360)))

class Cursor(pg.sprite.Sprite):
    def __init__(self, grp, bounds):
        self._layer = 1000
        pg.sprite.Sprite.__init__(self, grp)
        self.image = pg.Surface((bounds.width, bounds.height))
        self.image.set_colorkey(pg.Color('yellow'))
        # we start with the entire screen black
        # if the screen should be fully visible at the start, we could use yellow instead
        self.image.fill(pg.Color('black'))
        self.rect = self.image.get_rect()
        # here we store the position of the mouse when we start drawing the hole
        self.start = None
        # here we store the entire rect of the hole so we can later move it around
        self.inner_rect = None

    def mousedown(self):
        self.start = pg.mouse.get_pos()

    def mouseup(self):
        self.start = None

    def move(self, rel):
        self.inner_rect.move_ip(rel)
        self.recreate()

    def update(self):
        if not self.start:
            return
        pos = pg.mouse.get_pos()
        p = pos[0] - self.start[0], pos[1] - self.start[1]
        self.inner_rect = pg.Rect(self.start, p)
        self.recreate()

    def recreate(self):
        # here we update our hole
        self.image.fill(pg.Color('black'))
        pg.draw.rect(self.image, pg.Color('yellow'), self.inner_rect)
        pg.draw.rect(self.image, pg.Color('white'), self.inner_rect, 2)

def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    all_sprites = pg.sprite.LayeredUpdates()
    cursor = Cursor(all_sprites, screen.get_rect())
    for _ in range(20):
        Actor(all_sprites, screen.get_rect(), (random.randrange(600), random.randrange(440)))

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            if event.type == pg.MOUSEBUTTONDOWN:
                if event.button == 1:
                    cursor.mousedown()
            if event.type == pg.MOUSEBUTTONUP:
                if event.button == 1:
                    cursor.mouseup()    
            if event.type == pg.MOUSEMOTION:
                if pg.mouse.get_pressed()[2]:
                    cursor.move(event.rel)

        all_sprites.update()
        screen.fill(pg.Color('darkblue'))
        all_sprites.draw(screen)

        pg.display.flip()
        clock.tick(60)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()

enter image description here

使用鼠标左键开始绘制框架,然后使用鼠标右键移动框架。你知道吗

正如您所看到的,我们有一个黑色的Surface,黄色作为颜色键。当我们想使屏幕的一部分可见时,我们画一个黄色的矩形,这个矩形将是透明的,使它下面的场景可见。你知道吗

相关问题 更多 >