2016-12-04 105 views
0

但是我對pygame很陌生,仍然在努力解決小怪癖。我有碰撞功能不會再向我拋出錯誤,但它不能檢測到碰撞?我知道它比較了左上角的點,所以這意味着精靈必須具有相同的尺寸? 我調整了我的對象的大小,但它不會接受它,但我知道有一個確定的方法來讓它移動。任何建議,非常感謝!Pygame沒有識別碰撞

from classyforryan import sprites 
import pygame 
import os 
import time 

pygame.init() #short for initialize does return a tuple of successful intilizaton 
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("otherreferece.png") 
player=sprites(moore, 50, 544) 
ob = sprites(cube, 2125, 540) #changing 580 to 540 
ob1 = sprites(cube, 2125, 540) 
ob2 = sprites(cube, 2125, 540) 


clock = pygame.time.Clock() 


class sprite1(pygame.sprite.Sprite): 
    def __init__(self, ob, ob1, ob2): 
     pygame.sprite.Sprite.__init__(self) 
     #self.image = pygame.image.load("1136693.jpg") 
     self.spritesgroup = pygame.sprite.Group() #sprite group 
     self.spritesgroup.add(ob) 
     self.spritesgroup.add(ob1) 
     self.spritesgroup.add(ob2) 
     #self.spritesgroup = pygame.sprite.Group() #sprite group 
     pygame.display.update() 



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_SPACE: 
       if not fall: 
        jump = True 
      if event.key == pygame.K_ESCAPE: 
       gameExit= True 
    if jump: 
     player.recty -= 18 
     if player.recty <= 410: 
      ycoor = 500 
      jump = False 
      fall = True 

    if fall: 
     player.recty += 18 
     if player.recty >= 544: 
      ycoor = 0 
      fall = False 
    pygame.display.update() 
    gameDisplay.blit(bg,[0,0]) 
    time.sleep(.05) 
    player.pos() 
    ob.pos() 
    ob.left() 
    ob1.pos() 
    ob2.pos() 
    if(timer > 1600): 
     ob1.left() 
    if(timer > 2800): 
     ob2.left() 
    score = 100 
    spritegroup=sprite1(ob, ob1, ob2) 
    blocks_hit_list = pygame.sprite.spritecollide(player, spritegroup.spritesgroup, True) 

    print(blocks_hit_list) 
    #for block in blocks_hit_list: 
    # score +=1 
    # print("yo new score is", score) 
pygame.quit() #unintiliazes pygames 
quit() #this will exit out of python 

,這裏是我的課,我導入

import pygame 
import os 
import time 

gameDisplay= pygame.display.set_mode((800, 600)) 
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.rectx=xcoor 
     self.recty=ycoor 
     self.rect.topleft = self.rectx, self.recty 
    def pos(self): 
     gameDisplay.blit(self.image, [self.rectx, self.recty]) 
    def left(self): 
     dist = 7 
     self.rectx = self.rectx - dist 
+0

你應該在pygame上查看教程。截至目前,你的代碼中有些東西有點奇怪。你的'sprite1'類似乎完全沒有必要。如果一個類只包含一個屬性和'__init__'方法,那麼它很可能不應該是一個類。 'pygame.display.update()'應該只在每個遊戲循環中調用一次,你可以使用精靈組來更新和繪製你的精靈。我建議[this](https://www.youtube.com/watch?v=bMt47wvK6u0&t=5126s&list=PL4Yp6gRH-R1Birdm-Gs-SdBFWLUC1q3Fa&index=4)說話。他詳細地探討了pygame。 –

回答

0

pygame.sprite.collide()使用精靈rect屬性來檢查,如果有衝突發生。您正在爲每個精靈創建一個rect對象,但正在使用另一個屬性來移動和定位它們。整個遊戲中self.rect屬性處於相同位置。所以玩家和對象永遠不會碰撞,除非他們在相同的位置開始,然後他們會一直碰撞。

而不是創建新屬性self.rectxself.recty,使用您的rect的x和y來移動精靈。這可以通過點符號來訪問。

class Sprite(pygame.sprite.Sprite): # Start classnames with capital letter! 
    def __init__(self, image, x_coor, y_coor): 
     # Call the parent class (Sprite) constructor 
     pygame.sprite.Sprite.__init__() 
     self.image = image 
     self.rect = self.image.get_rect() 
     self.rect.x = x_coor # Notice that we're assigning to the rects x value! 
     self.rect.y = y_coor # The same here. 

    def pos(self): 
     gameDisplay.blit(self.image, self.rect) # Position the sprite according to the the rect. 

    def left(self): 
     dist = 7 
     self.rect.x = self.rect.x - dist # Assigning to the rect's x attribute. 

在你的程序的其餘部分,你應該改變屬性player.rect.xplayer.rect.y,而不是player.rectxplayer.recty