2016-07-19 12 views
0

私はPythonで基本的なSpace Invadersゲームを作成しようとしています。私が苦労している部分は、プレイヤーが発射した弾丸が敵のターゲットに当たったときを検出することです。私はSprite classの両方の弾丸と敵のスプライトの境界の矩形を指定する属性を持って、私はintersect methodcolliderectメソッドを使用して銃弾が敵に当たるかどうかをチェックしている。しかし、どういうわけかintersect methodは、弾丸が実際に敵に当たったかどうかにかかわらず常に1を返します(その意味がわかりません)。Python Pygame:弾丸と敵の衝突検出エラー(Space Invaders)

from pygame import * 
import random 
import sys 

class Sprite: 
    ''' 
     A Sprite class that can initialize a sprite based on an image, and display it. 

     Parameters: 
      filename -> the path of the image to be used 
      xpos -> the x position of the sprite 
      ypos -> the y position of the sprite 
    ''' 
    def __init__(self, filename, xpos, ypos): 
     self.xpos = xpos 
     self.ypos = ypos 
     self.sprite_image, self.rect = load_image(filename, (0, 0, 0)) 
     self.sprite_image.set_colorkey((0, 0, 0)) 

    def display(self, screen): 
     ''' 
      Displays the sprite onto the screen. 

      Parameters: 
       screen -> the PyGame display to draw onto. 
     ''' 
     screen.blit(self.sprite_image, (self.xpos, self.ypos)) 

    def intersect(self, sprite_2): 
     ''' 
      Returns whether a sprite intersects with another sprite. 

      Parameters: 
       sprite_2 -> the sprite to compare intersection with 

      Returns: 
       Whether the sprite intersects with sprite_2 
     ''' 
     return self.rect.colliderect(sprite_2.rect) 

def load_image(path, colorkey): 
    ''' 
     Returns an image and its bounding rectangle based on a filename. 

     Parameters: 
      path -> the path of the picture 
      colorkey -> the color defined to be transparent 

     Returns: 
      the loaded image 
      the bounding rectangle of the image 
    ''' 
    try: 
     sprite_image = image.load(path) 
    except error, message: 
     print("Cannot load image: {0}".format(path)) 

    sprite_image = sprite_image.convert() 

    if colorkey is not None: 
     if colorkey is -1: 
      colorkey = sprite_image.get_at((0, 0)) 
     sprite_image.set_colorkey(colorkey, RLEACCEL) 

    return sprite_image, sprite_image.get_rect() 

def main(): 
    ''' 
     The main function runs the Space Invader game, implementing all the logic, calculation, 
     and user interaction. 
    ''' 
    init() 
    screen = display.set_mode((800, 600)) 
    display.set_caption("Space Invaders") 

    fighter = Sprite("spaceship.png", 357, 520) 

    enemies = [] 
    bullets_good = [] # List of all of the bullets fired by the hero/fighter 

    for i in range(8): # Add the enemies into the enemies list 
     new_enemy = Sprite("enemy.png", 55 * i + 10, 50) 
     enemies.append(new_enemy) 

    while True: 
     screen.fill((0, 0, 0)) # Continiously refresh the background of the screen 

     for enemy in enemies: # Draw the enemies onto the screen 
      enemy.display(screen) 

     for bullet in bullets_good: # Draw the bullets onto the screen 
      bullet.ypos -= 10 

      for enemy in enemies: 
       if bullet.intersect(enemy) == 0: 
        print("MISSILE HIT ENEMY") 

      bullet.display(screen) 

     for keyevent in event.get(): # Go through key press events 
      if keyevent.type == QUIT: 
       quit() 
       sys.exit() 
      if keyevent.type == KEYDOWN: 
       if keyevent.key == K_LEFT: 
        fighter.xpos -= 5 
       if keyevent.key == K_RIGHT: 
        fighter.xpos += 5 
       if keyevent.key == K_UP: 
        # Create a new bullet and add it to the list of bullets fired by the hero 
        bullet = Sprite("bullet.png", fighter.xpos + 34, fighter.ypos - 20) 
        bullets_good.append(bullet) 

     fighter.display(screen) 
     display.update() 
     pass 

main() # Run the game! 

答えて

2

敵ごとにスプライトの四角形の属性を設定する必要があります。それでは、関数の衝突を呼び出すことができます。ここで

は、私が何を意味するかです:

enemy.rect.top = some y-value 
enemy.rect.left = some x-value 
enemy.rect.bottom = some-height 
enemy.rect.right = some-width