python - 我无法在 pygame 中移动我的玩家,你知道为什么吗?

标签 python pygame

我正在尝试制作一个小游戏,但遇到了一个我似乎无法解决的问题。问题是,在创建游戏循环和带有 keyupif 语句以及其他内容后,我的 Sprite 没有移动。你们能弄清楚并告诉我为什么它不起作用吗?

这是我到目前为止的代码:

import pygame, sys, random
from pygame.locals import *

pygame.init()
mainClock = pygame.time.Clock()
windowWidth = 600
windowHeight = 400
windowSize = (600, 400)
windowSurface = pygame.display.set_mode((windowWidth, windowHeight), 0, 32)
display = pygame.Surface((300, 200))
black = (0, 0, 0)
white = (225, 225, 255)
green = (0, 255, 0)
moveRight = False
moveLeft = False
moveSpeed = 6

level=   [['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
    ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
    ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
    ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
    ['0','0','0','0','0','0','0','2','2','2','2','2','0','0','0','0','0','0','0'],
    ['0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'],
    ['2','2','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','2','2'],
    ['1','1','2','2','2','2','2','2','2','2','2','2','0','0','2','2','2','1','1'],
    ['1','1','1','1','1','1','1','1','1','1','1','1','0','0','1','1','1','1','1'],
    ['1','1','1','1','1','1','1','1','1','1','1','1','0','0','1','1','1','1','1'],
    ['1','1','1','1','1','1','1','1','1','1','1','1','0','0','1','1','1','1','1'],
    ['1','1','1','1','1','1','1','1','1','1','1','1','0','0','1','1','1','1','1'],
    ['1','1','1','1','1','1','1','1','1','1','1','1','0','0','1','1','1','1','1']]

grass = pygame.image.load('grass.png')
dirt = pygame.image.load('dirt.png')
player = pygame.image.load('player.png').convert()
playerRect = pygame.Rect(100, 100, 5, 13)
player.set_colorkey((255,255,255))

while True:
    display.fill((214, 42, 78))
    #display.blit(player,(playerRect.x,playerRect.y))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.type == pygame.K_RIGHT or event.key == pygame.K_d:
                moveRight = True
            if event.type == pygame.K_LEFT or event.key == pygame.K_a:
                moveLeft = False
        if event.type == pygame.KEYUP:
            if event.type == pygame.K_RIGHT or event.key == pygame.K_d:
                moveRight = False
            if event.type == pygame.K_LEFT or event.key == pygame.K_a:
                moveLeft = False
    display.blit(player,(playerRect.x,playerRect.y))



    playerMovement = [0, 0]
    if moveRight == True:
        playerMovement[0] += 2
    if moveLeft == True:
        playerMovement[0] -= 2


    tileRect = []
    y = 0
    for row in level:
        x = 0
        for col in row:
            if col == '2':
                display.blit(grass, (x*16, y*16))
            if col == '1':
                display.blit(dirt, (x*16, y*16))
            if col != '0':
                tileRect.append(pygame.Rect(x*16,y*16,16,16))
            x += 1
        y += 1


    #pygame.draw.rect(windowSurface, black, player)
    windowSurface.blit(pygame.transform.scale(display, windowSize),(0,0))
    pygame.display.update()
    mainClock.tick(60)

最佳答案

我已经重组了你的主循环来解决问题。我现在更改事件循环中的 playerMovement (速度),并用它来更新主循环中的 playerRect pygame.Rect.move_ip方法。

顺便说一句,您可以将 playerRect 传递给 blit 以将图像复制到 topleft (x, y) 坐标。

# The player's velocity. Define it outside of the main loop.
playerMovement = [0, 0]

while True:
    # Handle events.
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.type == pygame.K_RIGHT or event.key == pygame.K_d:
                playerMovement[0] = 2  # Set the x-velocity to the desired value.
            if event.type == pygame.K_LEFT or event.key == pygame.K_a:
                playerMovement[0] = -2
        if event.type == pygame.KEYUP:
            if event.type == pygame.K_RIGHT or event.key == pygame.K_d:
                playerMovement[0] = 0  # Stop the player when the button is released.
            if event.type == pygame.K_LEFT or event.key == pygame.K_a:
                playerMovement[0] = 0

    # Game logic.
    playerRect.move_ip(playerMovement)

    # Draw everything.
    display.fill((214, 42, 78))

    tileRect = []
    y = 0
    for row in level:
        x = 0
        for col in row:
            if col == '2':
                display.blit(grass, (x*16, y*16))
            if col == '1':
                display.blit(dirt, (x*16, y*16))
            if col != '0':
                tileRect.append(pygame.Rect(x*16,y*16,16,16))
            x += 1
        y += 1

    display.blit(player, playerRect)
    windowSurface.blit(pygame.transform.scale(display, windowSize), (0, 0))
    pygame.draw.rect(windowSurface, black, playerRect)
    pygame.display.update()
    mainClock.tick(60)

关于python - 我无法在 pygame 中移动我的玩家,你知道为什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53108423/

相关文章:

python - mysql一次插入多条记录

Python套接字不发送主机名

python - 如何在Python中检测staticmethod/classmethod的被调用者类?

python - 使用pygame让子弹移动到你的光标

python - 在命令行中粘贴格式化的 Python 代码

python bdist_rpm 不使用 install_requires?

pygame - 如何在pygame表面窗口中切换全屏

python - 如何将pygame中的3d数组转换为opencv python中的有效输入?

python - 如何指定pygame创建游戏窗口的位置

python - 如何让 VBO 与 Python 和 PyOpenGL 一起工作