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

3
我有一个pygame菜单,其中我画了一些按钮,这些按钮代表我的游戏的难度级别。为了方便用户,我制作了一个精灵,用于指示选择的级别按钮(将其视为围绕按钮的浅绿色框架)。现在,如果我有一个纯色背景,我可以用背景颜色填充框架。但是,我想要自定义图像。然而,我不确定如何使用此图像进行删除操作。我不想在每个while循环中执行surface.blit(bgImage, surface.get_rect())。是否有任何方法告诉pygame仅绘制图像的一部分?因此,最终结果看起来仍然很好。这是我在背景为颜色时的代码。
(请注意,我的问题不仅适用于此场景,更多地是关于绘制图像的一部分的一般方法,而无需依赖于使用第三方软件(如paint(net),photoshop等)裁剪图像:)
#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

最后,这是最终结果的图像:hl按钮的最终结果 附注:在上面的代码片段中,我没有包括按钮类和全局变量(如颜色、宽度、高度等),因为我认为它们与我想要实现的内容无关。欢迎纠正我的代码并提出改进意见。

1
你看过在 blit 中使用 area 参数吗?http://www.pygame.org/docs/ref/surface.html#pygame.Surface.blit - cmd
非常感谢你!你的回答和 @Cplusplusplus 的一致,正是我需要做的。干杯! - M.Achilles
2个回答

3

0

请尝试以下代码:

pygame.init()

size = width, height = 1200, 800
screen = pygame.display.set_mode(size)
image = pygame.image.load("example.png")
rect = image.get_rect()
cropx,cropy = 100,10 #Change value to crop different rect areas
cropRect = (cropx, cropy, rect.w,rect.h)

while(True):
    for event in pygame.event.get():
        if(event.type == pygame.QUIT):
            pygame.quit()
            sys.exit()
    screen.blit(image,cropRect,cropRect)
    pygame.display.update()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接