【问题标题】:Can't figure out why my image wont move in pygame无法弄清楚为什么我的图像不会在 pygame 中移动
【发布时间】:2017-11-15 09:42:23
【问题描述】:

我只是在玩 Pygame,我看不出我做错了什么来使红色圆圈用箭头键移动。我不知道它是否在我的主循环中。我也找不到很多关于精灵或使用 Pygame 循环动画的教程。例如,如果我想制作一个像移动平台一样摆动的正方形,我该怎么做?

import pygame import time ## event handling varibles player_x = 0 player_y = 0 x = 250 y = 250 ## screen display display_width = 500 display_height = 500 pygame.init() game_screen = pygame.display.set_mode((display_width,display_height)) pygame.display.set_caption("test") # player def player(): pygame.draw.circle(game_screen,red,(x,y),15) # colors white = (255,255,255) red = (255,0,0) black = (0,0,0) ### main loop dead = False while dead != True: for event in pygame.event.get(): if event.type == pygame.QUIT: dead = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: player_x = -1 elif event.key == pygame.K_RIGHT: player_x = +1 if event.key == pygame.K_UP: player_y = +1 elif event.key == pygame.K_DOWN: player_y = -1 if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or pygame.K_RIGHT: player_x = 0 if event.key == pygame.K_UP or pygame.K_DOWN: player_y = 0 game_screen.fill(black) player() pygame.display.update() x -= player_x y -= player_y pygame.quit() quit()

【问题讨论】:

  • 我试图做到这一点,所以当我得到一个 KEYUP 事件时,球会停在它所在的当前位置。我尝试更改这些值,但没有任何区别。
  • 嗯,你的缩进都搞砸了。除非事件为 QUIT,否则此代码不会执行任何操作。
  • 这也不是正确的语法event.key == pygame.K_UP or pygame.K_DOWN ...我想你的意思是:event.key == pygame.K_UP or vent.key == pygame.K_DOWN

标签: python pygame


【解决方案1】:
  1. 你的缩进都搞砸了。

你的代码不会做任何事情,除非事件是 QUIT... 然后让它退出。

  1. 您的布尔逻辑错误。

这不是正确的语法event.key == pygame.K_UP or pygame.K_DOWN。这里的优先顺序如下(event.key == pygame.K_UP) or (K_DOWN)。由于 K_DOWN 是真的,它总是真的,因此这整个陈述总是真的。

我想你的意思是:event.key == pygame.K_UP or event.key == pygame.K_DOWN

  1. 最后,它不会像你说的那样一直移动。

只有当队列中有事件时它才会移动。您可以通过生成事件使其继续移动。也许有一个事件计时器。

这是一个固定版本,希望对你有帮助:

import pygame
import time

## event handling varibles
player_x = 0
player_y = 0
x = 250
y = 250

## screen display
display_width = 500
display_height = 500
pygame.init()
game_screen = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("test")

# player
def player(game_screen, red, point):   # Use parameters not globals
    pygame.draw.circle(game_screen, red, point, 15)

# colors
white = (255,255,255)
red = (255,0,0)
black = (0,0,0)

### main loop
pygame.time.set_timer(pygame.USEREVENT, 1)  # 1 per second

dead = False
while not dead:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            dead = True
        elif event.type == pygame.USEREVENT:
            pygame.time.set_timer(pygame.USEREVENT, 1)  # Set another timer for another 1 second

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player_x = +10
            elif event.key == pygame.K_RIGHT:
                player_x = -10
            elif event.key == pygame.K_UP:
                player_y = +10
            elif event.key == pygame.K_DOWN:
                player_y = -10
        elif event.type == pygame.KEYUP:
            if event.key in [pygame.K_LEFT, pygame.K_RIGHT]:
                player_x = 0
            elif event.key in [pygame.K_UP, pygame.K_DOWN]:
                player_y = 0
        game_screen.fill(black)
        player(game_screen,red,(x,y))
        pygame.display.update()
        x -= player_x
        y -= player_y

pygame.quit()

【讨论】:

  • 哦,我把 step 改成了 10 让它更快 ;)
  • 这很棒。缩进有很大的不同,我现在明白了,谢谢。哦,对角线运动更好哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多