2017-04-11 5 views
1

내 코드에서 플레이어의 아바타가 특정 지점으로 점프 할 때 중력이 다시 내려옵니다. 그러나 이것은 특정 지점에 도달 할 때까지 위쪽 및 공간 버튼을 누르고있을 때만 작동합니다. 경우에 해제 버튼이 나는이 코드 조각을 사용하여 중력에 다시 아래로 오리를 보내 싶습니다키를 놓을 때 자동으로 중력을 구현하는 방법은 무엇입니까? 연속 점프를 허용하는 방법?

player.rect.move_ip(0, (player.speed) * -player.y_direction) 

나는 다음 자동으로 해제되어 있는지 확인을하는 방법을 모른다 그것을 구현하십시오.

또 내가 궁금해하는 또 다른 문제는 오리가 바닥에 떨어졌을 때 단추가 풀린 다음 다시 튀어 나와야한다는 것입니다. 단추를 누르는 동안 아바타가 땅에 떨어질 때까지 코드를 업데이트하고 공간과 위로 버튼을 누르고있는 상태로 점프로 자동 이동합니다. 클래스 플레이어 (pygame.sprite.Sprite) : "" "플레이어 제어 오리" ""

def __init__(self, x, y, width, height): 
     super(Player, self).__init__(x, y, width, height) 

     # How many pixels the Player duck should move on a given frame. 
     self.y_change = 0 
     # How many pixels the spaceship should move each frame a key is pressed. 
     self.y_dist = 150 
     self.x_change = 0 
     # How many pixels the spaceship should move each frame a key is pressed. 
     self.x_dist = 30 
     self.x_direction = 1 
     # Positive = down, negative = up 
     self.y_direction = -1 
     # Current speed. 
     self.speed = 13 

duck = pygame.image.load('walkingduck.png') 
player = Player(0, (window_height)-125, 120, 160) #Making player object(duck) 

all_sprites_list = pygame.sprite.Group() 
all_sprites_list.add(player) 
move = False 

while True: # the main game loop 
    if move: #Jumping process 
     key_pressed = pygame.key.get_pressed() 
     if key_pressed[pygame.K_UP] or key_pressed[pygame.K_SPACE]: 
      if player.rect.y<=320: 
       move=False 
      else: 
       player.rect.move_ip(0, player.speed * player.y_direction) 
    if move==False and player.rect.y<=(window_height)-115: 
     player.rect.move_ip(0, (player.speed) * -player.y_direction) 

    for event in pygame.event.get(): #Closes game 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     elif event.type == KEYDOWN: 
      move=True 

      #Adds images and text 
    screen.blit(BackGround.image, BackGround.rect) 

    all_sprites_list.draw(screen) 
    pygame.display.flip() 
    pygame.display.update() 
    clock.tick(FPS) 
+0

그래서 오리는 키를 누르면 위로 움직여야하고, 그렇지 않으면 아래쪽으로 날아가 야합니까? – skrx

+0

이미 그렇게하고 있습니다. 그러나 방출 될 때 오리는 내려올 때 어떤 지점까지 날아 가지 않으면 (키가 눌려진 채로) 대기 중에 머물러 있습니다. 그래서 언제든지 열쇠를 놓아서 땅으로 내려 보낼 수 있도록하고 싶습니다. – Unknownzdx

답변

0

나는이 방법으로 그것을 할 것 : 여기

전체 코드 플레이어의 경우 비행중인 경우 y_change을 음수로 설정하고, 그렇지 않으면 GRAVITY 값을 아래쪽으로 가속되도록 그 값에 추가합니다. 그런 다음 rect를 움직여 클램핑합니다. (I 실제로 Player 클래스의 update 방법으로 이동 코드를 넣어 것입니다.)

import sys 
import pygame 


class Player(pygame.sprite.Sprite): 

    def __init__(self, x, y, width, height): 
     super(Player, self).__init__() 
     self.image = pygame.Surface((width, height)) 
     self.image.fill((230, 200, 40)) 
     self.rect = self.image.get_rect(center=(x, y)) 
     self.y_change = 0 


pygame.init() 
GRAVITY = .9 
window_height = 600 
screen = pygame.display.set_mode((800, window_height)) 
player = Player(200, 50, 40, 30) 
all_sprites_list = pygame.sprite.Group(player) 
clock = pygame.time.Clock() 
move = False 
running = True 

while running: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     if event.type == pygame.KEYDOWN: 
      move = True 
     if event.type == pygame.KEYUP: 
      move = False 

    if move: # Fly upwards. 
     player.y_change = -9 
    else: # Add the gravity to the y-velocity. 
     player.y_change += GRAVITY 
    player.rect.move_ip(0, player.y_change) 
    # Clamp the rect.y value to the range 50 to 450-rect.h. 
    # You could also use rect.clamp_ip((0, 50, 800, 450)). 
    if player.rect.y < 50: 
     player.rect.y = 50 
     player.y_change = 0 
    elif player.rect.bottom >= window_height-150: 
     player.rect.bottom = window_height-150 
     player.y_change = 0 

    screen.fill((30, 100, 140)) 
    all_sprites_list.draw(screen) 
    pygame.display.flip() 
    pygame.display.update() 
    clock.tick(30) 

pygame.quit() 
sys.exit() 

다음은 update 방법 rect.clamp_ip와 변형입니다.

import sys 
import pygame 


class Player(pygame.sprite.Sprite): 

    def __init__(self, x, y, width, height): 
     super(Player, self).__init__() 
     self.image = pygame.Surface((width, height)) 
     self.image.fill((230, 200, 40)) 
     self.rect = self.image.get_rect(center=(x, y)) 
     self.y_change = 0 
     self.flying = False 

    def update(self): 
     if self.flying: 
      self.y_change = -9 
     self.y_change += GRAVITY 
     self.rect.move_ip(0, self.y_change) 
     self.rect.clamp_ip((0, 50, 800, 450)) 
     if self.rect.y <= 50: 
      self.y_change = 1 


pygame.init() 
GRAVITY = .5 
screen = pygame.display.set_mode((800, 600)) 
clock = pygame.time.Clock() 
player = Player(200, 50, 40, 30) 
all_sprites_list = pygame.sprite.Group(player) 
running = True 

while running: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     if event.type == pygame.KEYDOWN: 
      player.flying = True 
     if event.type == pygame.KEYUP: 
      player.flying = False 

    all_sprites_list.update() 
    screen.fill((30, 100, 140)) 
    all_sprites_list.draw(screen) 
    pygame.display.flip() 
    clock.tick(30) 

pygame.quit() 
sys.exit() 

편집 : 여기에 연속 점프 대신 부드러운 위쪽으로의 움직임 버전입니다.

import sys 
import pygame 


class Player(pygame.sprite.Sprite): 

    def __init__(self, x, y, width, height): 
     super(Player, self).__init__() 
     self.image = pygame.Surface((width, height)) 
     self.image.fill((230, 200, 40)) 
     self.rect = self.image.get_rect(center=(x, y)) 
     self.y_change = 0 
     self.flying = False 

    def update(self): 
     if self.flying: 
      # If the y_change is getting too big, 
      # reset it to -13 to fly upwards again. 
      if self.y_change > 5: 
       self.y_change = -13 
     # Accelerate downwards each frame. 
     self.y_change += GRAVITY 
     self.rect.move_ip(0, self.y_change) 
     self.rect.clamp_ip((0, 50, 800, 450)) 
     if self.rect.y <= 50: 
      self.y_change = 1 


pygame.init() 
GRAVITY = .9 
screen = pygame.display.set_mode((800, 600)) 
clock = pygame.time.Clock() 
player = Player(200, 50, 40, 30) 
all_sprites_list = pygame.sprite.Group(player) 
running = True 

while running: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     if event.type == pygame.KEYDOWN: 
      player.flying = True 
     if event.type == pygame.KEYUP: 
      player.flying = False 

    all_sprites_list.update() 
    screen.fill((30, 100, 140)) 
    all_sprites_list.draw(screen) 
    pygame.display.flip() 
    clock.tick(30) 

pygame.quit() 
sys.exit() 
+1

정말 고마워요. 이것은 내 모든 점프 문제로 나를 완벽하게 도왔습니다. – Unknownzdx

+0

버튼을 계속 누르고 있으면 공기 중에 머무를 수 없지만 중력에 의해 아래로 내려 오는 방법을 알고 있습니까? – Unknownzdx

+0

나는 당신이 무슨 뜻인지 정말로 모르겠다. 플레이어가 버튼을 눌렀을 때 한 번만 점프해서 상향으로 날아 가지 않아야합니까? – skrx