2016-12-04 8 views
0

Ich arbeite am Pygame-Projekt und versuche, einen Punktakku zu setzen, wenn der Charakter über die Hindernisse springt? Wenn ich jedoch den Dokill - Parameter in spritecollide() auf true setze, werden die Hindernisse nicht zerstört. Ich möchte, dass sie zerstört werden, so dass die Hindernisse (die sich von rechts nach links zum Spieler bewegen) übersprungen werden Ende des Bildschirms und kollidiert mit einem anderen Sprite, der vom Bildschirm entfernt ist (wenn diese Kollision auftritt, werden Punkte angesammelt). Ich kann nicht einmal so viel anfangen, wenn die Hindernisse, über die der Spieler nicht springt (mit denen er kollidiert), nicht zerstört werden. Danke an jeden, der irgendwelche Vorschläge hat! Auch die spritecollide() keine Liste des Sprites zurückkehrt kollidierte, es gibt dieses für jeden einzelnen Sprit, das es mit kollidiert ... [<sprites sprite(in 0 groups)>]Pygame Sprites wird nicht zerstört, wenn eine Kollision auftritt

from classyforryan import sprites 
import pygame 
import os 
import time 

pygame.init() #short for initialize does return a tuple of successful intilizaton 
colors={"black":(0,0,0), "white": (255, 255, 255), "red": (255, 0, 0), "green": (0, 255, 0), "purple": (164, 66, 244), "pink" :(252, 25, 123)} 
gameDisplay= pygame.display.set_mode((800, 600)) 

bg=pygame.image.load('clouds_converted.jpg') 
moore=pygame.image.load("baemoore_converted.png") 
jump = False 
fall = False 

cube = pygame.image.load("cube.png") 
player=sprites(moore, 50, 544) 
ob = sprites(cube, 2125, 580) #changing 580 to 580 
ob1 = sprites(cube, 2125, 580) 
ob2 = sprites(cube, 2125, 580) 
ob3 = sprites(cube, 2125, 580) 
ob4 = sprites(cube, 2125, 580) 
ob5 = sprites(cube, 2125, 580) 

spritesgroup=pygame.sprite.Group() 
spritesgroup.add(ob) 
spritesgroup.add(ob1) 
spritesgroup.add(ob2) 
spritesgroup.add(ob3) 
spritesgroup.add(ob4) 
spritesgroup.add(ob5) 

score=600 

pygame.display.set_caption("lets play!") 
gameExit = False 
clock = pygame.time.Clock() 
while not gameExit: 
    clock.tick(40) 
    timer = pygame.time.get_ticks() 
    for event in pygame.event.get(): 
     if event.type==pygame.QUIT: 
      gameExit=True 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       gameExit= True 

    pygame.display.update() 
    gameDisplay.blit(bg,[0,0]) 
    time.sleep(.05) 
    player.pos() 
    ob.pos() 
    ob.left() 
    ob1.pos() 
    ob2.pos() 
    ob3.pos() 
    ob4.pos() 
    ob5.pos() 


    if(timer > 1600): 
     ob1.left() 
    if(timer > 2800): 
     ob2.left() 
    if(timer > 4000): 
     ob3.left() 
    if(timer > 5200): 
     ob4.left() 
    if(timer > 6400): 
     ob5.left() 

    blocks_hit_list = pygame.sprite.spritecollide(player, spritesgroup, True) 
    print blocks_hit_list 
    #if (blocks_hit_list!=[]): 
    # score-=10 
    # print(score) 


    #print blocks_hit_list 
    #for x in blocks_hit_list: 



pygame.quit() #unintiliazes pygames 
quit() #this will exit out of python 

und hier sind unsere Klassen

import pygame 
import os 
import time 
#import panda3d 
gameDisplay= pygame.display.set_mode((800, 600)) 

class ourMusic: #our music class 
    def __init__(self, song): 
     self.song=song #sthis is the song 
    def musicUpload(self): 
     pygame.mixer.music.load(self.song) 
    def musicPlay(self): 
     pygame.mixer.music.play(loops=-1, start=0.0) #assignes loops and plays music 
class sprites(pygame.sprite.Sprite): 
    def __init__(self, image, xcoor, ycoor): 
     # Call the parent class (Sprite) constructor 
     pygame.sprite.Sprite.__init__(self) 
     self.image = image 
     self.rect = self.image.get_rect() 
     self.rect.x=xcoor 
     self.rect.y=ycoor 
     self.rect.topleft = self.rect.x, self.rect.y 
    def pos(self): 
     gameDisplay.blit(self.image, [self.rect.x, self.rect.y]) 
    def left(self): 
     dist = 7 
     self.rect.x = self.rect.x - dist 

Irgendwelche Vorschläge werden geschätzt!

+0

müssen Sie 'self.rect.topleft = self.rect.x, self.rect.y' nicht tun, weil pygame das automatisch macht. – furas

+0

BTW: Sie können 'self.rect = self.image.get_rect (x = xcoor, y = xcoor)' und 'gameDisplay.blit (self.image, self.rect)'. Die Gruppe hat die Funktion 'draw()', die dasselbe wie Ihre 'pos()' Methode tut, aber mit allen Elementen in der Gruppe. – furas

+0

Hallo danke für den Tipp! Und tut mir leid, würde daran erinnern, dass "self.rect = self.image.get_rect (x = xcoor, y = xcoor) und gameDisplay.blit (self.image, self.rect) –

Antwort

0

Wenn dokill=True in der pygame.sprite.spritecollide Funktion wird es das Sprite aus allen Sprite-Gruppen entfernen. Wenn Sie außerhalb einer Sprite-Gruppe einen anderen Verweis auf dieses Objekt haben, wird es nicht aus dem Programm entfernt.

Sie referenzieren Ihre Objekte (ob = sprites(cube, 2125, 580)) und daher verschwinden sie nicht. Um dieses Problem zu beheben, müssen Sie alle Referenzen entfernen und nur Ihre Objekte in Sprite-Gruppen behalten.

Erstellen Sie eine update() Methode in Ihrer Sprite-Klasse und setzen Sie die Methoden, die die Objekte aufrufen sollen, jeden Frame dort. Auf diese Weise können Sie die Sprite-Gruppen-Methode update() verwenden, die alle Sprites update() Methode aufrufen wird.

EDIT: Wenn der Spieler mit einem einzelnen Sprite kollidiert, sollte es diese [<sprites sprite(in 0 groups)>] zurückgeben. Dies ist eine Liste von einem Sprite.