2016-12-04 2 views
0

но Im новый для pygame и все еще разрабатывает небольшие причуды. У меня есть функция collide, которая не бросает на меня больше ошибок, но она не может обнаружить столкновения? Я знаю, что он сравнивает верхние левые точки, значит ли это, что спрайты должны иметь одинаковый размер? Я изменил размеры своих объектов на одинаковые размеры, но он не смог бы его забрать, но я знаю, что есть определенно способ заставить его двигаться. Любые предложения приветствуются!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.rectx и self.recty, используйте ваши прямоугольники 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.rect.y вместо player.rectx и player.recty.

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