![](/img/trans.png)
[英]why am i moving faster to the left and very slow to the right in 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.