2013-05-18 2 views
0

WASD를 누르고있을 때 움직이는 "플레이어"- 검정색 사각형을 만들려고합니다. 나는 여기를 둘러 보았고, 구글과 유튜브에서이 작업을하는 법을 보았습니다. 그러나 제가 시도한 모든 해결책은 똑같은 문제를 가지고 있습니다 : 키를 누르고있는 동안 그것을 이동하는 대신, 계속해서 키를 눌러 만들어야합니다. 그것은 작은 비트로 움직입니다. 나는 내가 뭘 잘못하고 있는지 전혀 모른다. 여기에 (파이썬 3.3을 사용하여 - 파이 게임 1.9) 코드는 다음과 같습니다키를 누르고있는 동안 문자를 이동하는 방법

import pygame 
from pygame.locals import * 
from pygame.time import * 
import sys 
pygame.init() 

velX = 0 
velY = 0 


running = True 
clock = pygame.time.Clock() 

def draw(): 
    global velX 
    global velY 

    playerx = 20 
    playery = 20 

    screen = pygame.display.set_mode((700,300)) 
    pygame.display.set_caption('something') 

    background = pygame.Surface(screen.get_size()) 
    background = background.convert() 
    background.fill((255,255,255)) 
    screen.blit(background, (0,0)) 

    playerx = playerx + velX 
    playery = playery + velY 
    player_filename = 'player.png' 
    player = pygame.image.load(player_filename) 
    screen.blit(player, (playerx,playery)) 

    pygame.display.flip() 

def main(): 
    global velX 
    global velY 
    global running 

    while running: 

     keys_down = pygame.key.get_pressed() 
     pygame.key.set_repeat(1, 50) 
     time = 50/1000 

     for event in pygame.event.get(): 
      if event.type == QUIT: 
       pygame.quit() 
       sys.exit() 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_ESCAPE: 
        running=False 

     if keys_down[K_d]: 
      velX += 50*time 
     if keys_down[K_w]: 
      velY -= 50*time 
     if keys_down[K_s]: 
      velY += 50*time 
     if keys_down[K_a]: 
      velX -= 50*time 

     clock.tick(50) 
     draw() 

if __name__ == '__main__': 
    main() 

는 이미 설정된 반복 명령을했지만, 훨씬 아무것도 할 것 같지 않았다. 나는 또한 stackoverflow에서 찾은 몇 가지 솔루션에서 직접 복사를 시도했지만 그들 중 누구도 일하지 않았다. 코드에 뭔가 다른 것이 있다고 생각합니다.

+0

질문에 관련 코드를 입력하고 링크하지 마십시오. –

+0

네, 죄송합니다. – Arcticcu

답변

2

코드에 두 가지 문제점이 있습니다. 우선 귀하의 질문에. 그 이유는 플레이어가 결코 하나 이상의 단계는 당신이 draw() 기능 이상이 코드를 삽입해야합니다, 당신은

playerx = 20 
playery = 20 

대신 수행 할 때) (그릴 모든 호출에 플레이어의 위치를 ​​재설정하고 추가 할 것입니다 이동하지

global playerx 
global playery 

상단의 draw(). 이제 플레이어 위치가 모든 프레임으로 재설정되지 않습니다. 대신 당신이 draw() 위의 라인들을 이동해야 그냥 모든 무승부에 대해 동일한 화면을 사용

screen = pygame.display.set_mode((700,300)) 
pygame.display.set_caption('something') 

을 수행 할 때

두 번째 문제

draw() 모든 호출에 새로운 화면을 만들 수 있다는 것입니다.

또한, elyase가 지적한 것처럼 속도를 고정 값으로 설정하고 증가시키지 않아도됩니다. 좋아요

velX = 0 
velY = 0 
if keys_down[K_d]: 
    velX = 10 
if keys_down[K_w]: 
    velY = -10 
if keys_down[K_s]: 
    velY = 10 
if keys_down[K_a]: 
    velX = -10 

이렇게하면 플레이어가 조정하는 방향으로 일정한 속도로 움직입니다.

희망을 남겨주세요. :)

+0

그래, 그게 다야. 엄청 고마워! – Arcticcu

+0

죄송합니다. 답변으로 표시하는 데 오랜 시간이 걸렸습니다. 나는 힘을 잃었습니다. :) – Arcticcu

0

draw() 내에서 위치를 재설정하고 있습니다. 또한 event.type == pygame.KEYDOWN 조건 안에 방향을 변경하는 코드를 넣어야합니다. 다음과 같이 입력하십시오 :

if event.type == KEYDOWN: 
    if event.key == K_d: 
     velX += 50*time 
    elif event.key == K_w: 
     velY -= 50*time 
     ...   

if event.type == KEYUP: 
     # set velocity to 0 
+0

전혀 효과가없는 것 같습니다. 정확히 동일한 방법으로 함수를 호출하면 – Arcticcu

+0

에 draw() 내부의 위치가 재설정됩니다. 또한 나는 속도 벡터의 방향을 수정해야한다고 생각합니다. – elyase

관련 문제