2014-12-21 4 views
1

У меня возникают проблемы с групповым столкновением. Я делаю игру с пистолетом, а мышь - это перекрестье. Когда я касаюсь enemy(group), столкновение не обнаружено, пока я не коснусь только врага в corner(0,0). Я хочу иметь возможность столкнуться со всеми врагами, движущимися по экрану. I с использованием pygame.sprite.spritecollideany() для кода столкновения, и я использую sys.exit() для вывода.Групповое обнаружение столкновений не работает должным образом

import pygame 
import random 
import sys 
import os 
from pygame.locals import * 

#Initialize pygame 
pygame.init() 

#Window properties 
window_width = 1366 
window_height = 768 
window = pygame.display.set_mode((window_width,window_height),pygame.FULLSCREEN) 
pygame.display.set_caption("Sniper") 

#Clock 
clock = pygame.time.Clock() 

#Movement 
moveX = 1 
moveY = 0 

#Colors 
black = (0,0,0) 
white = (255,255,255) 
blue = (0,0,64) 

#Sprite groups 
enemies = pygame.sprite.Group() 
cursors = pygame.sprite.Group() 

#Enemy 
class Enemy(pygame.sprite.Sprite): 
    def __init__(self,x,y): 
     pygame.sprite.Sprite.__init__(self) 
     self.x = x 
     self.y = y 
     self.width = 25 
     self.height = 100 
     self.image = pygame.image.load('graphic\\sprite\\spr_enemy.png').convert() 
     self.rect = self.image.get_rect() 
    def update(self): 
     window.blit(self.image,(self.x,self.y)) 

#Player 
class Player(pygame.sprite.Sprite): 
    def __init__(self,x,y): 
     pygame.sprite.Sprite.__init__(self) 
     self.x = x 
     self.y = y 
     self.width = 100 
     self.height = 25 
     self.image = pygame.image.load('graphic\\sprite\\spr_player.png').convert() 
     self.rect = self.image.get_rect() 
    def update(self): 
     window.blit(self.image,(self.x,self.y)) 

#Cursor 
class Cursor(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.mouse.set_visible(False) 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load('graphic\\cursor\\crosshair.png').convert() 
     self.rect = self.image.get_rect() 
    def update(self,enemies): 
     self.rect.center = pygame.mouse.get_pos() 
     if (pygame.sprite.spritecollideany(self,enemies)): 
      sys.exit() 

#Define sprites 
player = Player(500,100) 
cursor = Cursor() 
cursors.add(cursor) 
enemy = Enemy(0,0) 

#Gameloop 
gameLoop = True 
while gameLoop: 
    for event in pygame.event.get(): 
     if (event.type == pygame.QUIT): 
      gameLoop = False 
     #Keydown 
     if (event.type == pygame.KEYDOWN): 
      #Space key 
      if (event.key == pygame.K_SPACE): 
       x = random.randint(0,0) 
       y = random.randint(0,668)     
       enemies.add(Enemy(x,y)) 
      #Escape key 
      if (event.key == pygame.K_ESCAPE): 
       sys.exit()    

    #Window color 
    window.fill(blue) 

    #Updating player 
    player.update() 

    #Updating enemy 
    for enemy in enemies: 
     enemy.x += moveX 
    enemy.update() 
    enemies.update() 
    enemies.draw(window) 

    #Updating cursor 
    cursors.update(enemies) 
    cursors.draw(window) 

    #FPS 
    clock.tick(60) 

    pygame.display.flip() 
pygame.quit() 

ответ

0

Вы должны были бы изменить положение команды pygame.sprite.spritecollideany() из вашей функции обновления на время цикла, удалите круглые скобки вокруг команды, а также изменить команду pygame.sprite.spriteCollide() так это выглядит следующим образом:

import pygame 
import random 
import sys 
import os 
from pygame.locals import * 

#Initialize pygame 
pygame.init() 

#Window properties 
window_width = 1366 
window_height = 768 
window = pygame.display.set_mode((window_width,window_height),pygame.FULLSCREEN) 
pygame.display.set_caption("Sniper") 

#Clock 
clock = pygame.time.Clock() 

#Movement 
moveX = 1 
moveY = 0 

#Colors 
black = (0,0,0) 
white = (255,255,255) 
blue = (0,0,64) 

#Sprite groups 
enemies = pygame.sprite.Group() 
cursors = pygame.sprite.Group() 

#Enemy 
class Enemy(pygame.sprite.Sprite): 
    def __init__(self,x,y): 
     pygame.sprite.Sprite.__init__(self) 
     self.x = x 
     self.y = y 
     self.width = 25 
     self.height = 100 
     self.image = pygame.image.load('graphic\\sprite\\spr_enemy.png').convert() 
     self.rect = self.image.get_rect() 
    def update(self): 
     window.blit(self.image,(self.x,self.y)) 

#Player 
class Player(pygame.sprite.Sprite): 
    def __init__(self,x,y): 
     pygame.sprite.Sprite.__init__(self) 
     self.x = x 
     self.y = y 
     self.width = 100 
     self.height = 25 
     self.image = pygame.image.load('graphic\\sprite\\spr_player.png').convert() 
     self.rect = self.image.get_rect() 
    def update(self): 
     window.blit(self.image,(self.x,self.y)) 

#Cursor 
class Cursor(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.mouse.set_visible(False) 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load('graphic\\cursor\\crosshair.png').convert() 
     self.rect = self.image.get_rect() 
    def update(self): 
     self.rect.center = pygame.mouse.get_pos() 

#Define sprites 
player = Player(500,100) 
cursor = Cursor() 
cursors.add(cursor) 
enemy = Enemy(0,0) 

#Gameloop 
gameLoop = True 
while 1: 
    for event in pygame.event.get(): 
     if (event.type == pygame.QUIT): 
      gameLoop = False 
     #Keydown 
     if (event.type == pygame.KEYDOWN): 
      #Space key 
      if (event.key == pygame.K_SPACE): 
       x = random.randint(0,0) 
       y = random.randint(0,668) 
       enemies.add(Enemy(x,y)) 
      #Escape key 
      if (event.key == pygame.K_ESCAPE): 
       sys.exit() 

     if pygame.sprite.spritecollide(cursor, enemies, True): 
      sys.exit() 

    #Window color 
    window.fill(blue) 

    #Updating player 
    player.update() 

    #Updating enemy 
    for enemy in enemies: 
     enemy.x += moveX 
    enemy.update() 
    enemies.update() 
    enemies.draw(window) 

    #Updating cursor 
    cursors.update(enemies) 
    cursors.draw(window) 

    #FPS 
    clock.tick(60) 

    pygame.display.flip() 
pygame.quit() 

Объяснение этих изменений состоит в том, что, перемещая команду pygame.sprite.spritecollide() в цикл while, вы можете связаться с любым врагом в любом положении и активировать ваш sys.exit(). pygame.sprite.spritecollide() нуждается в трех вещах в своих скобках: переменная, в которую вы положили свою функцию (cursor = Cursor()), группу спрайтов, с которой вы сталкиваетесь (enemies = pygame.sprite.Group()), и True/False в третьем (так как ваше утверждение таково, что до gameloop = True игра все еще работает, поэтому True будет помещен в третью часть.) Это должно исправить вашу проблему, и если нет, то надеюсь, что вы скоро найдете ответ! Кроме того, я рекомендую использовать while 1: или while True:!

+0

Спасибо за комментарий PythonMaster, но это не работает. Я сделал то, что вы сказали, и первая проблема, которая возникает, - это объект «bool», который нельзя назвать вызываемым, то есть True, который был помещен туда. Когда я удаляю True, игра работает так же, как и когда я впервые спросил здесь. – Krub

+0

Вы использовали только 'pygame.sprite.spritecollide'? –

+0

Извините! Я забыл изменить команду на 'pygame.sprite.spritecollide()'. Это должна быть проблема. Я отредактировал свой ответ, чтобы на самом деле быть правильным на этот раз ... –

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