首页 文章

screen.get_at():运行代码pygame时图像颜色发生变化

提问于
浏览
1

我正在制作世界 Map 的修订游戏,但我正在努力编写这个 .

每个大陆都是不同的颜色(红色,绿色,深蓝色,黄色,橙色,紫色),背景是浅蓝色 .

当光标悬停在一个大陆上时,它应该对该大陆的白色版本进行blit以表示用户将鼠标悬停在该大陆上 . 当光标在'water'上时,它应该只有世界 Map blitted .

当我运行它时,每个大陆的颜色与GIMP中的颜色稍有变化,然后一旦光标移过它就会在它运行时发生变化 .

这是我的代码:

import pygame
pygame.init()
import time

running = False

display_width = 800
display_height = 600
screen = pygame.display.set_mode((display_width,display_height))
blue = (69,200,209)
screen.fill(blue)

africaw = pygame.image.load("africaw.png")
asiaw = pygame.image.load("asiaw.png")
australiaw = pygame.image.load("australiaw.png")
europew = pygame.image.load("europew.png")
northamericaw = pygame.image.load("northamericaw.png")
southamericaw = pygame.image.load("southamericaw.png")

这些图像是白色的大陆,具有透明背景 .

worldmap = pygame.image.load("worldmap.png")

screen.blit(worldmap,(0,0))
pygame.display.update()

while not running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = True
        if event.type == pygame.MOUSEMOTION:
            mousemove = pygame.mouse.get_pos()
            color = screen.get_at(mousemove)

            if color == (209,79,70,255) or color == (255,255,255,255):
                screen.blit(africaw,(0,0))
                pygame.display.update()                

            elif color == (130,209,70,255) or color == (255,255,255,255):
                screen.blit(asiaw,(0,0))
                pygame.display.update()

            elif color == (227,134,58,255) or color == (255,255,255,255):
                screen.blit(australiaw,(0,0))
                pygame.display.update()

            elif color == (148,70,209,255) or color == (255,255,255,255):
                screen.blit(europew,(0,0))
                pygame.display.update()

            elif color == (227,216,58,255) or color == (255,255,255,255):
                screen.blit(northamericaw,(0,0))
                pygame.display.update()

            elif color == (58,69,227,255) or color == (255,255,255,255):
                screen.blit(southamericaw,(0,0))
                pygame.display.update()

            elif color != (255,255,255,255):
                screen.blit(worldmap,(0,0))
                pygame.display.update()        


pygame.quit()

另外,如果我将 or color == (new colour rbga) 添加到每个 elif ,当我将鼠标悬停在任何一个大陆上时,非洲也总是会对自身的白色版本进行点击 .

此外,当我在欧洲和亚洲之间移动光标时,它们大多数时间都保持白色 . 我也会做国家,所以这是一个很大的问题 .

1 回答

  • 0

    我建议以不同的方式构建游戏 . 每帧都显示 worldmap ,然后获取 worldmap 的活动像素的颜色,查看颜色是否与其中一个大陆相匹配,然后将该大陆的白色图像blit . 我还建议将颜色分配给变量,以便更容易区分 .

    import sys
    import pygame
    
    
    pygame.init()
    
    display_width = 800
    display_height = 600
    screen = pygame.display.set_mode((display_width, display_height))
    
    WHITE = pygame.Color('white')
    
    worldmap = pygame.Surface((display_width, display_height))
    worldmap.fill((20, 60, 100))
    # I draw these rects as a replacement for the colored continents.
    pygame.draw.rect(worldmap, (209, 79, 70, 255), (300, 300, 200, 200))
    pygame.draw.rect(worldmap, (130, 209, 70, 255), (500, 200, 200, 200))
    pygame.draw.rect(worldmap, (227, 134, 58, 255), (500, 400, 200, 200))
    pygame.draw.rect(worldmap, (148, 70, 209, 255), (300, 100, 200, 200))
    pygame.draw.rect(worldmap, (227, 216, 58, 255), (30, 50, 200, 200))
    pygame.draw.rect(worldmap, (58, 69, 227, 255), (30, 300, 200, 200))
    
    africaw = pygame.Surface((200, 200))
    africaw.fill(WHITE)
    asiaw = pygame.Surface((200, 200))
    asiaw.fill(WHITE)
    australiaw = pygame.Surface((200, 200))
    australiaw.fill(WHITE)
    europew = pygame.Surface((200, 200))
    europew.fill(WHITE)
    northamericaw = pygame.Surface((200, 200))
    northamericaw.fill(WHITE)
    southamericaw = pygame.Surface((200, 200))
    southamericaw.fill(WHITE)
    
    clock = pygame.time.Clock()
    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
    
        color = worldmap.get_at(pygame.mouse.get_pos())
        screen.blit(worldmap, (0, 0))
        if color == (209, 79, 70, 255):
            screen.blit(africaw, (300, 300))
        elif color == (130, 209, 70, 255):
            screen.blit(asiaw, (500, 200))
        elif color == (227, 134, 58, 255):
            screen.blit(australiaw, (500, 400))
        elif color == (148, 70, 209, 255):
            screen.blit(europew, (300, 100))
        elif color == (227, 216, 58, 255):
            screen.blit(northamericaw, (30, 50))
        elif color == (58, 69, 227, 255):
            screen.blit(southamericaw, (30, 300))
    
        pygame.display.update()
        clock.tick(30)
    
    pygame.quit()
    sys.exit()
    

相关问题