2017-01-28 32 views
1

Я начал делать что-то на pygame, но я столкнулся с проблемой при перемещении влево или вправо. если я быстро перейду от нажатия клавиши со стрелкой вправо, чтобы нажать левую, а также отпустить правую, блок просто перестанет двигаться. это мой кодpygame moving left and right issue

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() 

есть способ, которым я могу изменить это так, если клавиша стрелка вправо нажать и клавишу со стрелкой влево отпускается, что он будет идти прямо вместо остановки? P.S Я все еще изучаю pygame и очень новичок в модуле. Мне жаль, если это кажется глупым вопросом, но я не могу найти ответы на него.

+0

ms.png является блок – 1234USSR4321

+0

'event.key' может сохранить только одно значение, поэтому нет никакого смысла проверять' не event.key == K_RIGHT: 'когда это уже' event.key == K_LEFT' – furas

ответ

0

Ваша проблема заключается в том, что, когда вы испытываете KeyDown события с

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

вы всегда получите Правда, потому что, когда event.key==K_LEFT истинно, также всегда 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 
0

Одним из способов может быть создание очереди, в которой отслеживается кнопка, которая была нажата последним. Если мы нажмем клавишу со стрелкой вправо, мы сначала поместим скорость в список, и если мы затем нажмем клавишу со стрелкой влево, мы сначала поместим новую скорость в список. Таким образом, кнопка, которая была нажата последним, всегда будет первой в списке. Затем мы просто удаляем кнопку из списка, когда мы ее отпускаем.

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. 

Вы должны, конечно, положить все в аккуратные функции и, возможно, создать класс игрока.

0

проблема в том, что у вас есть перекрывающиеся ключевые функции; Если вы удерживаете нажатой вправо, а затем слева, xmove сначала устанавливается в 1, а затем изменяется на -1. Но затем вы отпускаете один из ключей, и он сбрасывает xmove до 0, даже если вы все еще держите другой ключ. То, что вы хотите сделать, это создать булевы для каждого ключа. Вот пример:

demo.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() 
+0

Это довольно точно копия моего ответа. – Meyer

+0

Эй, Майер, я не видел твой ответ. Я могу пообещать, что не украл у вас какой-либо код или вообще не пытался вас скопировать. – XCode

+0

Не беспокойтесь, это довольно очевидный подход. Просто не забудьте прочитать другие ответы, прежде чем отправлять один и тот же дважды. – Meyer