Pygame blit 图像的一部分(背景图像)

标签 pygame sprite blit

我有一个 pygame 菜单,我在其中绘制了一些按钮,它们代表我的游戏的关卡难度。为了方便用户,我制作了一个 sprite 指示选择了哪个级别按钮(将其视为按钮周围的浅绿色框)。现在,如果我有一个纯色作为我的背景,我可以用 bg 颜色填充框架。但我想要一个自定义图像。但是我不确定如何用这张图片删除东西。我不想做 surface.blit(bgImage, surface.get_rect()) 在每个 while 循环中。有什么方法可以告诉 pygame 仅对图像的一部分进行 blit?所以最终的结果还是好看的。当我有一个颜色作为背景时,这是我的代码

(请注意,我的问题不仅仅适用于这种情况,它更像是一种通用的方式,用于对图像的一部分进行 blitting,而不必依赖于使用 paint(net)、photoshop 等第 3 方软件裁剪图像等):

#class for the highlight sprite that appears when a level button is clicked         
class HighLightImage(Sprite):

def __init__(self, spriteX, spriteY, width = 180, height =  60):
    Sprite.__init__(self)
    self.rect  = pygame.Rect(spriteX, spriteY, width, height)
    self.image =  pygame.image.load("highlight.png")

#function to draw the highlight sprite, after deleting its older position.
def draw(self, newSpriteX, newSpriteY):
    #due to technical issues the following method is using 4 dirty sprite deletions.
    surface.fill(bgCol, (self.rect.x, self.rect.y, self.rect.width, 10))
    surface.fill(bgCol, (self.rect.x, self.rect.y + self.rect.height-10, self.rect.width, 10))
    surface.fill(bgCol, (self.rect.x, self.rect.y, 10, self.rect.height))
    surface.fill(bgCol, ( self.rect.x + self.rect.width-10, self.rect.y, 10, self.rect.height))
    self.rect.x = newSpriteX
    self.rect.y = newSpriteY
    surface.blit(self.image, self.rect)

这是主要的 while 循环

def mainIntro():    

#snake image
snakeImg = pygame.image.load("snakeB.png")
snakeImg = pygame.transform.scale(snakeImg, (150,200))


#highlight obj
hlObj = HighLightImage(0, 0)
#starting level = 1
levels = 1
#initial fill
surface.fill(bgCol)

intro = True

#start button
startButton = StartButton(WIDTH/2-330, HEIGHT - 150)
startButton.draw("Start")
#Exit button
exitButton = ExitButton(WIDTH/2+110, HEIGHT - 150)
exitButton.draw("Exit")
#level buttons
easyLvl = EasyLevelButton( 65, HEIGHT/2 )
easyLvl.draw("Easy")
midLvl = MediumLevelButton( 320, HEIGHT/2 )
midLvl.draw("Medium")
hardLvl = HardLevelButton( 570, HEIGHT/2 )
hardLvl.draw("Hard")    

instructions()


surface.blit(snakeImg, (WIDTH/2-75, HEIGHT - 250))


while intro:
    for ev in pygame.event.get():
        # X exit event
        if ev.type == QUIT:
            pygame.quit()
            sys.exit()
        if ev.type == MOUSEMOTION:
            startButton.hover()
            exitButton.hover()
            easyLvl.hover()
            midLvl.hover()
            hardLvl.hover()
        if ev.type == MOUSEBUTTONDOWN:
            if easyLvl.clicked():
                levels = 1
            if midLvl.clicked():
                levels = 2
            if hardLvl.clicked():
                levels = 4              
            #button exit event
            elif exitButton.clicked():
                pygame.quit()
                sys.exit()
            elif startButton.clicked():
                intro = False

        #highlight frame, according to level-button chosen
        if levels == 1:
            hlObj.draw(easyLvl.x-10, easyLvl.y-10)
        elif levels == 2:
            hlObj.draw(midLvl.x-10, midLvl.y-10)
        elif levels == 4:
            hlObj.draw(hardLvl.x-10, hardLvl.y-10)



    update()

return levels

最后这是一张最终结果的图片:end result of hl button

P.s 在上面的代码片段中,我没有包括按钮类,以及颜色、宽度、高度等全局变量,因为我认为它们与我想要的帮助无关。请随时更正我的代码,和/或提出改进建议。

最佳答案

正如@cmd 上面所说,area 参数将是一个不错的选择,但有关更多信息,请尝试 pygame docs或者看看 this question或尝试 pygame.transform.chop()

关于Pygame blit 图像的一部分(背景图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32781858/

相关文章:

python - 在 Python 中重现随机生成关卡的最简单方法是什么?

Libgdx Sprite 不随视口(viewport)缩放

java - 分配给图 block 的 Sprite 图形不正确

python - Pygame 中的撤消步骤

python - Matplotlib:音频播放器光标(滑动垂直线)的动画,在 WxPython 上,位 block 传输看起来损坏

python - 如何使用 Pygame 使这个演示绘图游戏更新更快地绘制圆圈?

python - pygame Mixer 将音频保存到磁盘?

python - pygame 中仍然没有检测到碰撞

javascript - 将 div 悬停,通过 css sprite 更改其颜色,然后淡入另一个 div?

python - Pygame 文本表面不绘图