2016-01-17 2 views
0

Я пробовал все, чтобы попытаться сделать свой спринт, но я решил начать с нуля и попытаться найти способ сделать это снова. В любом случае вы, ребята, можете помочь. Мое обнаружение столкновений зависит от vspeed, поэтому я не думаю, что смогу установить vspeed в 0, когда я попаду на свою платформу. Я застрял на этом целую вечность. Прямо сейчас мой персонаж просто движется вверх и вниз. Простой прыжок - это все, что мне нужно. Любая помощь будет оценена!Действительно борется с прыжками

class Player(pygame.sprite.Sprite): 
def __init__(self,x,y,width = 65, height = 35): 
    pygame.sprite.Sprite.__init__(self) 
    self.x = x 
    self.y = y 
    self.hspeed,self.vspeed = 2,4 

    self.images=[] 
    r0 = pygame.image.load("Images\Player\i1.png") 
    r1 = pygame.image.load("Images\Player\i2.png") 
    r2 = pygame.image.load("Images\Player\i3.png") 
    r3 = pygame.image.load("Images\Player\i4.png") 
    self.hurt = pygame.image.load("Images\Player\Hurt.png") 
    self.images.append(r0) 
    self.images.append(r1) 
    self.images.append(r2) 
    self.images.append(r3) 

    self.rotatedimages = [] 
    rr0 = pygame.transform.flip(r0 ,True, False) 
    rr1 = pygame.transform.flip(r1 ,True, False) 
    rr2 = pygame.transform.flip(r2 ,True, False) 
    rr3 = pygame.transform.flip(r3 ,True, False) 
    self.rotatedimages.append(rr0) 
    self.rotatedimages.append(rr1) 
    self.rotatedimages.append(rr2) 
    self.rotatedimages.append(rr3) 

    self.gravity = 0.5 
    self.index = 0 
    self.image = self.images[self.index] 
    self.rect = pygame.Rect(self.x,self.y,width,height) 

    self.TimeNum=0 
    self.TimeTarget=10 
    self.Timer = 0 
    self.collision = False 

def Level1PlatColl(self, BlockListGrass, TrapList, enemygroup, PowerUps): 
    PlatformCollision = pygame.sprite.spritecollide(self, BlockListGrass, False) 
    for each_object in PlatformCollision: 
     self.collision = True 
     if self.collision == True: 
      self.OnGround = True 
      if self.vspeed > 0: 
       self.rect.bottom = each_object.rect.top 

      if self.vspeed <0: 
       self.rect.top = each_object.rect.bottom 

def move(self): 

    key = pygame.key.get_pressed() 

    if key[pygame.K_LEFT]: 
     self.rect.move_ip(-self.hspeed,0) 

    if key[pygame.K_RIGHT]: 
     self.rect.move_ip(self.hspeed,0) 

    if key[pygame.K_UP]: 
     self.rect.y -= self.vspeed 

    if key[pygame.K_DOWN]: 
     self.rect.y += self.vspeed 
+0

использовать 'gravity' для изменения' vspeed' в каждом кадре/контуре. – furas

ответ

1
  1. При нажатии K_UP вы установите vchange = vspeedself.OnGround = False)

  2. В каждой рамке/петли вы используете y -= vchange прыгать

  3. В каждой рамке/петли вы используете vchange -= gravity для замедлить скачок.

Сначала он будет перемещать игрока вверх, но сила тяжести замедляет ход игрока и перемещает игрока вниз.

(когда я говорю «пресс» Я имею в виду единственный момент, когда ключ изменения состояния от pygame.KEYUP до pygame.KEYDOWN - не тогда, когда вы держите нажатой его - так что вам придется использовать for event in pygame.event.get() вместо pygame.key.get_pressed() или проверить onGround с K_UP)

+0

ok Спасибо alot, я попробую его, и каждый кадр/цикл будет означать под значком K_UP if? – Jim

+0

Под «каждый кадр/цикл» я подразумеваю каждый раз в цикле 'while True' (« mainloop »). Это нужно делать в любом цикле, даже если вы не нажимаете какую-либо клавишу. – furas

+0

, но 'vchange = vspeed' (и' self.OnGround = False') должно выполняться под оператором K_UP if – furas

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