【问题标题】:I want to blit an image on key press in pygame我想在 pygame 的按键上对图像进行 blit
【发布时间】:2020-09-26 09:39:18
【问题描述】:

我正在尝试在 pygame 中创建井字游戏。我想在按下键时在屏幕上显示图像。按下退出键可以让我退出游戏,但是当我按下键 1 对图像进行 blit 时,什么也没有发生。这是代码

import pygame
from pygame.locals import (
    K_1,
    K_2,
    K_3,
    K_4,
    K_5,
    K_6,
    K_7,
    K_8,
    K_9,
    K_ESCAPE,
    K_UP,
    KEYDOWN,
    QUIT
)
clock = pygame.time.Clock()
pygame.init()

# Constants
display_width = 300
display_height = 300
white = (255, 255, 255)
black = (0, 0, 0)
run = True

# Creating game screen
display = pygame.display.set_mode((300, 300))
pygame.display.set_caption("Tic Tac Toe Game")
display.fill(white)

# importing images to pygame
circle_image = pygame.image.load("resizedimage1.png")
cross_image = pygame.image.load("resizedimage2.png")

# main game loop
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                run = False
            elif event.key == K_1:
                display.blit(cross_image, (10, 10))
                clock.tick(30)

    display.fill(white)
    pygame.draw.line(display, black, (100, 0), (100, 300))
    pygame.draw.line(display, black, (200, 0), (200, 300))
    pygame.draw.line(display, black, (0, 100), (300, 100))
    pygame.draw.line(display, black, (0, 200), (300, 200))
    pygame.display.update()

pygame.quit()

【问题讨论】:

标签: python pygame


【解决方案1】:

你必须放线

display.fill(white)

在你的 while run 的顶部。因为现在您正在渲染图片,并且在下一帧中您将所有内容都涂成白色。所以你看不到图像。

您还应该使用事件 KEYUP。因为KEYDOWN会被触发多次,所以会导致闪烁效果。

【讨论】:

    【解决方案2】:

    当然,display.fill() 之后的所有对象都必须绘制 blit,因为 pygame.Surface.fill 用纯色填充 Surface。
    无论如何,我建议为游戏的九个领域创建一个图像列表。通过None初始化列表:

    field = [None] * 9
    

    如果按下按钮,则在列表中设置相应的字段。笔记列表索引从 0 开始:

    elif event.key == K_1:
        field[0] = cross_image
    

    在循环中绘制列表的字段。使用enumerate() 遍历列表。字段的行可以由//(地板除法)运算符计算,列由%(模)运算符计算(参见Binary arithmetic operations):

    for i, img in enumerate(field):
        if img:
            column = i % 3
            row = i // 3
            display.blit(img, (column * 100 + 10, row * 100 + 10))
    

    示例代码:

    import pygame
    from pygame.locals import (
        K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9,
        K_ESCAPE, K_UP, KEYDOWN,
        QUIT
    )
    clock = pygame.time.Clock()
    pygame.init()
    
    # Constants
    display_width = 300
    display_height = 300
    white = (255, 255, 255)
    black = (0, 0, 0)
    run = True
    
    # Creating game screen
    display = pygame.display.set_mode((300, 300))
    pygame.display.set_caption("Tic Tac Toe Game")
    display.fill(white)
    
    # importing images to pygame
    circle_image = pygame.image.load("resizedimage1.png")
    cross_image = pygame.image.load("resizedimage2.png")
    
    field = [None] * 9
    
    # main game loop
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    run = False
                elif event.key == K_1:
                    field[0] = cross_image
    
        display.fill(white)
        pygame.draw.line(display, black, (100, 0), (100, 300))
        pygame.draw.line(display, black, (200, 0), (200, 300))
        pygame.draw.line(display, black, (0, 100), (300, 100))
        pygame.draw.line(display, black, (0, 200), (300, 200))
    
        for i, img in enumerate(field):
            if img:
                column = i % 3
                row = i // 3
                display.blit(img, (column * 100 + 10, row * 100 + 10))
    
        pygame.display.update()
    
    pygame.quit()
    

    【讨论】:

    • 试过了,它肯定比我做的更好
    • @SheesHunain 请注意,只能接受 1 个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2019-06-28
    • 1970-01-01
    • 2016-01-23
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多