2015-08-25 29 views
-2

希望你能幫助我,我 已經與這個問題掙扎的最後幾天。 我想爲我的2D平臺遊戲的遊戲「固體」塊我工作的,但是當我進入那個「實」塊i瞬移到另一側或塊的底部,我不知道爲什麼,希望你知道爲什麼 所以這裏是我的代碼:試圖在pygame的「固體」塊,但它不工作

class Block(pygame.sprite.Sprite): 

    def __init__(self, color = blue,widht = 64, height = 64): 

     super(Block, self).__init__() 

     self.image = pygame.Surface((widht, height)) 
     self.image.fill(color) 
     self.rect = self.image.get_rect() 

     self.sound = pygame.mixer.Sound("2dSounds/Walk.wav") 

     self.hspeed = 0 
     self.vspeed = 0 
    def update(self, collidable): 
     self.rect.x += self.hspeed 

     collision_list = pygame.sprite.spritecollide(self, collidable, False) 
     for collided_object in collision_list: 
      if (self.hspeed > 0): 
       # right direction 
       self.rect.right = collided_object.rect.left 

      elif (self.hspeed < 0): 
       # left direction 
       self.rect.left = collided_object.rect.right 

     self.rect.y += self.vspeed 

     collision_list = pygame.sprite.spritecollide(self, collidable, False) 
     for collided_object in collision_list: 
      if (self.vspeed > 0): 
      # down direction 
       self.rect.bottom = collided_object.rect.top 

      elif (self.vspeed < 0): 
       # up direction 
       self.rect.top = collided_object.rect.bottom 
    def change_speed(self, hspeed, vspeed): 
     self.hspeed += hspeed 
     self.vspeed += vspeed 
    def set_position(self, x, y): 
     self.rect.x = x 
     self.rect.y = y 

非常感謝! :)

+1

對不起 - 這不是這個網站的工作原理 - 你應該詢問關於你的代碼的具體問題 - 否則你的問題將被關閉 – scytale

+0

好吧對不起,編輯我的問題 –

+1

[試圖在pygame中創建一個「固體」 (http://stackoverflow.com/questions/32189978/trying-to-make-a-solid-block-in-pygame) – DJMcMayhem

回答

0

很抱歉的是,我的代碼是不是基於把你的,我真的只是把它扔在一起,在過去的5分鐘,這是不是很漂亮,但在這裏它是:

from pygame.locals import * 

import pygame 
import sys 

GRAVITY = 1.2 

class Player: 
    def __init__(self, x, y): 
     self.rect = pygame.Rect(x, y, 25, 25) 
     self.yvel = 0 

    def tick(self): 
     self.yvel += GRAVITY 

     self.rect.y += int(self.yvel) 

     if self.rect.y >= 475: 
      self.rect.y = 475 
      self.yvel = 0 

    def set(self, y): 
     if y: 
      self.yvel = y 

class Block: 
    def __init__(self, x, y, w, h): 
     self.rect = pygame.Rect(x, y, w, h) 

class Game: 
    def __init__(self): 
     pygame.init() 
     self.screen = pygame.display.set_mode((500, 500)) 
     self.player = Player(0, 0) 
     self.block = Block(225, 400, 50, 50) 

    def main(self): 
     right = left = False 
     while True: 
      self.screen.fill((230, 230, 230)) 
      pygame.draw.rect(self.screen, (40, 40, 40), self.block.rect) 
      pygame.draw.rect(self.screen, (100, 200, 100), self.player.rect) 

      pygame.display.flip() 
      for event in pygame.event.get(): 
       if event.type == QUIT: 
        pygame.quit() 
        sys.exit(0) 
       elif event.type == KEYDOWN: 
        if event.key == K_SPACE: 
         self.player.set(-20) 
        elif event.key == K_RIGHT: 
         right = True 
        elif event.key == K_LEFT: 
         left = True 
       elif event.type == KEYUP: 
        if event.key == K_RIGHT: 
         right = False 
        elif event.key == K_LEFT: 
         left = False 

      if right: 
       self.player.rect.x += 5 
       while self.player.rect.colliderect(self.block.rect): 
        self.player.rect.x -= 1 
      if left: 
       self.player.rect.x -= 5 
       while self.player.rect.colliderect(self.block.rect): 
        self.player.rect.x += 1 
      self.player.tick() 
      if self.player.yvel > 0: 
       while self.player.rect.colliderect(self.block.rect): 
        self.player.rect.y -= 1 
        self.player.yvel = 0 
      elif self.player.yvel < 0: 
       while self.player.rect.colliderect(self.block.rect): 
        self.player.rect.y += 1 
        self.player.yvel = 0 

game = Game() 
game.main() 

球員的速度是相當快的,但可以在線路進行更改:

self.player.rect.x -= 5 

self.player.rect.x += 5 

NE底部。

它的工作方式是,只要你去移動,其移動播放器,然後查看是否是否相撞塊。如果確實如此,玩家就會朝相反的方向移動,直到確認它不再碰撞爲止。 使用速度完成跳躍,因此Player.yvelGRAVITYGRAVITY可以更改,但是如果它更高,跳躍將更短,反之亦然。

有代碼和實驗用的東西像塊位置(self.block = Block(225, 400, 50, 50))和玩家的凝視位置(self.player = Player(0, 0)

圍繞發揮。如果你發現代碼中的任何錯誤,只是讓我知道,我我會盡力解決它們。

+0

一切都很好關於你的代碼改變了一些東西在這裏和那裏,即時通訊嘗試實現它我的原創遊戲:)謝謝你的幫助! = D –

+0

如果它有效,你可以接受它作爲選擇的答案。 – Bottersnike

相關問題