2016-12-04 9 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 

と、ここで私は衝突が起こったかどうかをチェックするためにスプライトrect属性を使用

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'クラスは完全に不要なようです。クラスが1つの属性と '__init__'メソッドしか保持していない場合は、クラスであってはいけません。 'pygame.display.update()'はそれぞれのゲームループのたびに呼び出され、スプライトグループを使ってスプライトを更新し描画することができます。私は[こちら](https://www.youtube.com/watch?v=bMt47wvK6u0&t=5126s&list=PL4Yp6gRH-R1Birdm-Gs-SdBFWLUC1q3Fa&index=4)の話をお勧めします。彼はパイゲームをうまく使いこなす。 –

答えて

0

pygame.sprite.collide()をインポートし、私のクラスです。すべてのスプライトに対して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.x、代わりに player.rectxplayer.rectyplayer.rect.yを変更する必要があります。

関連する問題