2017-02-04 15 views
0

私はゲームで作業しています。このゲームでは、オブジェクトはゲーム画面の上から落ち、画面の下部にあるプレーヤーは落下したオブジェクトに当たります。プレイヤーが落下物に当たると、プレイヤーの幅と高さが増加する必要があります。私がコードをテストしたときに、プレーヤーが側から落下したオブジェクトに当たったときに衝突が働いたが、プレーヤーが途中で落下したオブジェクトに当たったときに衝突が働かなかった。誰か助けてくれますか?私は、オブジェクトのXということを忘れて衝突検出が機能しない - PyGame

if self.y >= player.y - player.h and self.y <= player.y + player.h and self.x >= player.x - player.w and self.x <= player.x + player.w: 
      player.w += player.increase 
      player.h += player.increase 
      player.y - player.increase 

:後

if self.y >= player.y and self.y <= player.y + player.h and self.x >= player.x and self.x <= player.x + player.w: 
      player.w += player.increase 
      player.h += player.increase 
      player.y - player.increase 

PYTHON

# IMPORTS 
import pygame, random 

# GLOBALS 
global screen, displayW, displayH 
global clock, FPS 
global end, food, player 

# SETGLOBALVALUES 
def setGlobalValues(): 
    global screen, displayW, displayH 
    global clock, FPS 
    global end, food, player 

    displayW = 800 
    displayH = 600 
    screen = pygame.display.set_mode((displayW, displayH)) 

    clock = pygame.time.Clock() 
    FPS = 60 

    end = False 
    food = Food() 
    player = Player() 

# MAIN 
def main(): 
    pygame.init() 

    setGlobalValues() 
    setup() 
    gameLoop() 
    quitGame() 

# GAMELOOP 
def gameLoop(): 
    global end, player 

    while not end: 
     for event in pygame.event.get(): 
      # ONCLICK QUIT 
      if event.type == pygame.QUIT: 
       end = True; 

      # KEYDOWN 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 
        player.velX -= 10 
       if event.key == pygame.K_RIGHT: 
        player.velX += 10 

      # KEYUP 
      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT: 
        player.velX = 0 
       if event.key == pygame.K_RIGHT: 
        player.velX = 0 

     draw() 
     animate() 
     collision() 
     setFPS() 


# DRAW 
def draw(): 
    global screen, food, player 

    # fill background 
    screen.fill((255, 255, 255)) 

    player.draw() 
    food.draw() 

    # update 
    pygame.display.update() 

# ANIMATE 
def animate(): 
    global food, player 

    food.animate() 
    player.animate() 

# COLLISION 
def collision(): 
    global player, food; 

    player.collision() 
    food.collision(); 

# SETFPS 
def setFPS(): 
    global clock, FPS 

    clock.tick(FPS); 

# CLASSES 
class Food(): 
    def __init__(self, img="", x=0, h=0, w=0, velY=0, color=()): 
     global displayW 

     self.img = pygame.image.load("assets/img/rsz_burger.png") 
     self.w = 30 
     self.h = 30 
     self.x = random.randrange(0, displayW - self.w) 
     self.y = -100 
     self.velY = 3 
     self.color = (255, 0, 0) 

    def draw(self): 
     global screen 

     screen.blit(self.img, (self.x, self.y)) 

    def animate(self): 
     self.y += self.velY 

     if self.y >= displayW: 
      self.reset() 

    def collision(self): 
     global displayW, displayH 

     # collision with player 
     if self.y >= player.y and self.y <= player.y + player.h and self.x >= player.x and self.x <= player.x + player.w: 
      player.w += player.increase 
      player.h += player.increase 
      player.y - player.increase 

      print(player.w) 
      self.reset() 

    def reset(self): 
     self.y = -100 
     self.x = random.randrange(0, displayW - self.w) 
     self.velY += 1 
     screen.blit(self.img, (self.x, self.y)) 

class Player(): 
    def __init__(self, x=0, y=0, velX=0, velY=0, w=0, h=0, increase=0, color=()): 
     global displayW, displayH 

     self.w = 20 
     self.h = 20 
     self.x = displayW/2 - self.w/2 
     self.y = displayH - 100 
     self.velX = 0 
     self.velY = 0 
     self.increase = 2 
     self.color = (0, 0, 0) 

    def draw(self): 
     global screen 

     pygame.draw.ellipse(screen, self.color, (self.x, self.y, self.w, self.h)) 

    def animate(self): 
     self.x += self.velX 
     self.y += self.velY 

    def collision(self): 
     global displayW 

     # collision to walls 
     if self.x <= 0: 
      self.velX = 0 
     elif self.x + self.h >= displayW: 
      self.velX = 0 


# SETUP 
def setup(): 
    pygame.display.set_caption("Food Catcher") 

# QUIT GAME 
def quitGame(): 
    pygame.quit() 
    quit() 

# CALL MAIN 
if __name__ == "__main__": 
    main() 
+3

両方のクラスで 'pygame.Rect'オブジェクトを作成し、[' rect.colliderect']を使うことができます(http://www.pygame.org/docs/ref/rect.html#pygame.Rect.colliderect) 。これにより、衝突検出が大幅に簡素化されます。 rectはpos(x、y)とsize(width、height)の2つの引数をとります。オブジェクトを移動するときは、rectオブジェクトを移動する必要があります(たとえば、['rect.move_ip'](http://www.pygame.org/docs/ref/rect.html#pygame.Rect.move_ipを使用します)。 ))。 –

+0

'player.y - player.increase' ??? –

+0

'player.y - player.increase'は、幅と高さが変化したときにプレーヤーの位置が変わらないようにします。 –

答えて

0

は問題が前に持っていたということでしたマイナスプレイヤーの幅

そしてyは左上から始まります。

+0

私のコメントをチェックしてください:あなたのコードに他の問題があります... –

関連する問題