繁体   English   中英

Pygame连续运动

[英]Continuous Movement in Pygame

我试图让水面上的船在屏幕上连续移动,但它一次只接受一个按键。 我已经尝试了所有在线解决方案,但它们都不起作用。

import pygame

#initialize the pygame module
pygame.init()
#set the window size 
screen =  pygame.display.set_mode((1280, 720))

#change the title of the window
pygame.display.set_caption("Space Invaders")

#change the icon of the window
icon = pygame.image.load("alien.png")
pygame.display.set_icon(icon)

#add the ship to the window
shipx = 608
shipy = 620

def ship(x, y):
    ship = pygame.image.load("spaceship.png").convert()
    screen.blit(ship, (x,y))
   
running = True
while running:
    #background screen color
    screen.fill((0, 0, 0))

    #render the ship on the window
    ship(shipx,shipy)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            shipx -= 30
        if keys[pygame.K_RIGHT]:
            shipx += 30

    pygame.display.update()

我还是 Pygame 的新手。 我怎样才能解决这个问题?

它是缩进的问题。 pygame.key.get_pressed()必须在应用程序循环而不是事件循环中完成。 注意,事件循环仅在事件发生时执行,但应用程序循环在每一帧中执行:

running = True
while running:
    # [...]

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        
    #<--| INDENTATION
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        shipx -= 30
    if keys[pygame.K_RIGHT]:
        shipx += 30

    # [...]

我发现的问题是您的应用程序只在按下一个键时回复,而不是在连续移动时回复。 当您像下面的示例一样设置pygame.key.set_repeat function 时,一切都应该运行顺利。

import sys
import pygame

#initialize the pygame module
pygame.init()
#set the window size 
screen =  pygame.display.set_mode((1280, 720))

# Images
ship_img = pygame.image.load("spaceship.png")
ship_rect = ship_img.get_rect()

def draw():
    screen.blit(ship_img, ship_rect)
   
pygame.key.set_repeat(10)

while True:
    #background screen color
    screen.fill((0, 0, 0))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            ship_rect = ship_rect.move((-30, 0))
        if keys[pygame.K_RIGHT]:
            ship_rect = ship_rect.move((30, 0))

    #render the ship on the window
    draw()

    pygame.display.update()

对我来说,如果我需要在 Pygame 中连续移动 object,可以分配一个速度变量来控制速度。

以下是我在 game_on 循环中的机器人运动程序的部分代码:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False

    # Detect keyboard input on your computer check if it is the direction keys
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            print("Left arrow is pressed")
            robotX_speed = -60
            
        if event.key == pygame.K_RIGHT:
            print("Right arrow is pressed")
            robotX_speed = 60
            
        if event.key == pygame.K_UP:
            print("Up arrow is pressed")
            robotY_speed = -60
            
        if event.key == pygame.K_DOWN:
            print("Down arrow is pressed")
            robotY_speed = 60
    
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                print("Keystoke L/R has been released")
                robotX_speed = 0
        
            if event.type == pygame.K_DOWN or event.key == pygame.K_UP:
                print("Keystoke Up/Down has been released")
                robotY_speed = 0

# update the coordinates in the while loop
robotX += robotX_speed
robotY += robotY_speed

希望这些代码可以帮到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM