簡體   English   中英

pygame左右移動問題

[英]pygame moving left and right issue

我已經開始在 pygame 上制作一些東西,但是在向左或向右移動時遇到了問題。 如果我快速地從按右箭頭鍵更改為按左箭頭鍵並放開右箭頭鍵,則塊就會停止移動。 這是我的代碼

bg = "sky.jpg"
ms = "ms.png"
import pygame, sys
from pygame.locals import *
x,y = 0,0
movex,movey=0,0
pygame.init()
screen=pygame.display.set_mode((664,385),0,32)
background=pygame.image.load(bg).convert()
mouse_c=pygame.image.load(ms).convert_alpha()
m = 0
pygame.event.pump() 
while 1:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_LEFT:
                movex =-0.5
                m = m + 1
            if event.key==K_RIGHT:
                movex=+0.5
                m = m + 1
        elif event.type == KEYUP:
            if event.key==K_LEFT and not event.key==K_RIGHT:
                    movex = 0
            if event.key==K_RIGHT and not event.key==K_LEFT:
                    movex =0

    x+=movex
    y=200
    screen.blit(background, (0,0))
    screen.blit(mouse_c,(x,y))
    pygame.display.update()

有沒有辦法改變這個,所以如果按下右箭頭鍵並釋放左箭頭鍵,它會向右移動而不是停止? PS 我仍在學習 pygame 並且對模塊非常陌生。 如果這似乎是一個愚蠢的問題,我很抱歉,但我找不到任何答案。

你的問題是,當你測試 KEYDOWN 事件時

if event.key==K_LEFT and not event.key==K_RIGHT:

你總是得到 True,因為當event.key==K_LEFT為 True 時,它​​也總是not event.key==K_RIGHT (因為事件的鍵畢竟是K_LEFT )。

我解決這類問題的方法是將意圖與行動分開。 因此,對於關鍵事件,我只會跟蹤應該發生的操作,如下所示:

moveLeft = False
moveRight = False

while True:
  for event in pygame.event.get():
    if event.type == QUIT:
      pygame.quit()
      sys.exit()
    if event.type == KEYDOWN:
      if event.key == K_LEFT:  moveLeft  = True
      if event.key == K_RIGHT: moveRight = True
    elif event.type == KEYUP:
      if event.key == K_LEFT:  moveLeft  = False
      if event.key == K_RIGHT: moveRight = False

然后,在循環的“主要”部分,您可以根據輸入采取行動,例如:

while True:
  for event in pygame.event.get():
    ...
  if moveLeft  : x -= 0.5
  if moveRight : x += 0.5

一種方法是創建一個隊列來跟蹤最后按下的按鈕。 如果我們按右箭頭鍵,我們會將速度放在列表中的第一個,然后如果我們按下左箭頭鍵,我們將新的速度放在列表中的第一個。 所以最后按下的按鈕將始終在列表中的第一個。 然后,當我們釋放它時,我們只需從列表中刪除該按鈕。

import pygame
pygame.init()

screen = pygame.display.set_mode((720, 480))
clock = pygame.time.Clock()
FPS = 30

rect = pygame.Rect((350, 220), (32, 32))  # Often used to track the position of an object in pygame.
image = pygame.Surface((32, 32))  # Images are Surfaces, so here I create an 'image' from scratch since I don't have your image.
image.fill(pygame.Color('white'))  # I fill the image with a white color.
velocity = [0, 0]  # This is the current velocity.
speed = 200  # This is the speed the player will move in (pixels per second).
dx = []  # This will be our queue. It'll keep track of the horizontal movement.

while True:
    dt = clock.tick(FPS) / 1000.0  # This will give me the time in seconds between each loop.

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            raise SystemExit
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                dx.insert(0, -speed)
            elif event.key == pygame.K_RIGHT:
                dx.insert(0, speed)
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                dx.remove(-speed)
            elif event.key == pygame.K_RIGHT:
                dx.remove(speed)

    if dx:  # If there are elements in the list.
        rect.x += dx[0] * dt

    screen.fill((0, 0, 0))
    screen.blit(image, rect)
    pygame.display.update()

    # print dx  # Uncomment to see what's happening.

你當然應該把所有東西都放在整潔的函數中,也許可以創建一個 Player 類。

問題是你有重疊的關鍵特征; 如果您先按住右后左,則 xmove 首先設置為 1,然后更改為 -1。 但是隨后您松開其中一個鍵,即使您仍然按住另一個鍵,它也會將 xmove 重置為 0。 您要做的是為每個鍵創建布爾值。 下面是一個例子:

演示.py:

import pygame

window = pygame.display.set_mode((800, 600))

rightPressed = False
leftPressed = False

white = 255, 255, 255
black = 0, 0, 0

x = 250
xmove = 0

while True:
    window.fill(white)
    pygame.draw.rect(window, black, (x, 300, 100, 100))
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                rightPressed = True
            if event.key == pygame.K_LEFT:
                leftPressed = True
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT:
                rightPressed = False
            if event.key == pygame.K_LEFT:
                leftPressed = False
    xmove = 0
    if rightPressed:
        xmove = 1
    if leftPressed:
        xmove = -1
    x += xmove
    pygame.display.flip()

我知道我的答案已經很晚了,但我是 Pygame 的新手,對於像我這樣的初學者來說,像我這樣的代碼很容易理解,但我有一個解決方案。我沒有使用 keydown 行代碼,而是我只是把移動嵌套在主游戲while循環中的事件代碼,我英語不好所以我給你一個示例代碼。

enter code here

while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT or event.type == pygame.K_ESCAPE:
        run = False
    win.blit(bg, (0, 0))
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_LEFT]:
        x -= 5
    if pressed[pygame.K_RIGHT]:
        x += 5
    if pressed[pygame.K_UP]:
        y -= 5
    if pressed[pygame.K_DOWN]:
        y += 5
    win.blit(image,(x,y))
    pygame.display.update()
pygame.quit()

這將使圖像快速移動而無需重復按下鍵,代碼就在主 while 循環中,而沒有在任何其他循環中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM