2016-07-19 3 views
0

파이썬으로 기본 우주 침략자 게임을 만들려고합니다. 내가 고군분투하고있는 부분은 플레이어가 발사 한 총알이 적 대상을 때릴 때를 감지하는 것입니다. 나는 Sprite class 총알과 적에 대한 스프라이트의 경계 사각형을 지정하는 특성을 가지고 있으며, intersect method은 총알이 colliderect 메서드를 사용하여 적중 여부를 확인합니다. 그러나 어쨌든 intersect method은 총알이 적에게 실제로 닿았는지 여부에 관계없이 항상 1을 반환합니다 (그 의미가 확실하지 않음).파이썬 파이 게임 : 총알과 적의 충돌 감지 오류 (우주 침략자)

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

각 적의 스프라이트 rect 속성을 설정해야만 콜리 전 기능을 호출 할 수 있습니다. 여기

내가 무슨 뜻입니다 :

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