2014-09-09 2 views
1

У меня проблема с моим платформером, на данный момент я просто делаю игровой движок, а не игру. Однако, когда я нажимаю на шпору, чтобы идти вверх или вниз, чтобы спуститься, я поднимаюсь один раз и когда я выпущу ключ, я вернусь в свое первоначальное местоположение. пожалуйста, помогите, у меня нет сообщения об ошибке. Я хотел бы непрерывное движение, пока я не отпустите клавишуПроблема с вертикальным перемещением Pygame platformer

import pygame 

white = (255, 255, 255) 
black = ( 0, 0, 0) 
gray = ( 90, 90, 90) 
silver = (200, 200, 200) 
red = (255, 0, 0) 
green = ( 0, 255, 0) 
blue = ( 0, 0, 255) 

class Block (pygame.sprite.Sprite): 

    def __init__(self, colour = blue, width = 64, height = 64): 

     super (Block, self).__init__() 

     self.image = pygame.Surface((width, height)) 
     self.image.fill(colour) 
     self.set_properties() 
     self.sound = pygame.mixer.Sound("Rain_Inside_House-Mark_DiAngelo-323934112.wav") 

     self.hspeed = 0 
     self.vspeed = 0 

    def set_properties(self): 

     self.rect = self.image.get_rect() 

     self.origin_x = self.rect.centerx 
     self.origin_y = self.rect.centery 

    def change_speed(self, hspeed, vspeed): 
     self.hspeed += hspeed 
     self.vspeed += vspeed 

    def set_position(self, x, y): 
     self.rect.x = x - self.origin_x 
     self.rect.y = y - self.origin_y 

    def set_image(self, filename = None): 
     if (filename != None): 

      self.image = pygame.image.load (filename) 
      self.set_properties() 


    def play_sound(self): 
     self.sound.play 

    def update(self): 

     self.rect.x += self.hspeed 
     self.rect.y =+ self.vspeed 

    if (__name__ == "__main__"): 
     pygame.init() 

    window_size = window_width, window_height = 640, 480 
    window = pygame.display.set_mode(window_size, pygame.RESIZABLE) 

    pygame.display.set_caption("The Legend of Tetsuo") 


    window.fill(white) 

    clock = pygame.time.Clock() 
    frames_per_second = 40 

    block_group = pygame.sprite.Group() 

    a_block = Block() 
    a_block.set_image("beaten_brick_tiled.png") 
    a_block.set_position(window_width/2, window_height/2) 
    block_group.add(a_block) 
    another_block = Block(red) 
    another_block.set_position(window_width/2, window_height/2) 
    block_group.add(a_block, another_block) 

    font = pygame.font.SysFont("Times New Roman, Arial", 30) 

    message = previous_message = None 
    message = ("") 

    running = True 

    while (running) : 
     for event in pygame.event.get(): 
      if (event.type == pygame.QUIT)or \ 
      (event.type == pygame.KEYDOWN and \ 
      (event.key == pygame.K_ESCAPE or event.key == pygame.K_q)): 
       running = False 

      if (event.type == pygame.KEYDOWN): 
       if (event.key == pygame.K_LEFT): 
        a_block.change_speed(-5, 0) 
       if (event.key == pygame.K_RIGHT): 
        a_block.change_speed(5, 0) 
       if (event.key == pygame.K_SPACE): 
        a_block.change_speed(0, -5) 
       if (event.key == pygame.K_DOWN): 
        a_block.change_speed(0, 5) 
      if (event.type == pygame.KEYUP): 
       if (event.key == pygame.K_LEFT): 
        a_block.change_speed(5, 0) 
       if (event.key == pygame.K_RIGHT): 
        a_block.change_speed(-5, 0) 
       if (event.key == pygame.K_SPACE): 
        a_block.change_speed(0, 5) 
       if (event.key == pygame.K_DOWN): 
        a_block.change_speed(0, -5) 
        print a_block.hspeed, a_block.vspeed 
     clock.tick(frames_per_second) 
     window.fill(white) 
     a_block.update() 
     block_group.draw(window) 
     pygame.display.update() 

    pygame.quit() 
+1

Ваш код делает именно то, что вы объяснили: он называет 'a_block.change_speed (0, -5)' двигаться вверх, когда пробел нажата, и 'a_block.change_speed (0, 5) ', чтобы вернуться назад при освобождении пробела. Что ты пытаешься сделать? – Celeo

+0

он не перемещает спрайт непрерывно. он заставляет спрайт перемещаться вверх или вниз на пять пикселей, а затем останавливается, и когда он отпускается, он возвращается в исходное положение – user3921501

+0

. Я использовал тот же самый код для горизонтального перемещения, и он перемещается непрерывно (кроме как с vspeed, а не hspeed). – user3921501

ответ

2

Я думаю, у вас есть опечатка в обновлении:

self.rect.y =+ self.vspeed 

shoudn't это было?

self.rect.y += self.vspeed 
+0

СПАСИБО ВАМ ТАК МОЖНО. Меня это очень беспокоило :) – user3921501

Смежные вопросы