Wie Verwenden von Sprite-Kollisionen in Pygame
Ich bin ein sehr einfaches Spiel, wo der Vogel (Spieler) hat dodge die Felsen, und wenn es getroffen wird, durch den rock, den Sie verlieren. Ich bin versucht, pygame.sprite.collide_rect() zu sagen, wenn Sie berührt, aber ich kann nicht scheinen, um herausfinden, wie man richtig nutzen es.
Hier ist mein code:
import pygame
import os, sys
import random
import time
img_path = os.path.join('C:\Python27', 'player.png')
img_path2 = os.path.join('C:\Python27', 'rock.png')
class Bird(object):
def __init__(self):
self.image_s = pygame.image.load(img_path)
self.image_b = self.image_s.get_rect()
self.x = 0
self.y = 0
def handle_keys(self):
key = pygame.key.get_pressed()
dist = 2
if key[pygame.K_DOWN]:
self.y += dist
elif key[pygame.K_UP]:
self.y -= dist
if key[pygame.K_RIGHT]:
self.x += dist
elif key[pygame.K_LEFT]:
self.x -= dist
def draw(self, surface):
surface.blit(self.image, (self.x, self.y))
def background(self, surface):
bg = os.path.join('C:\Python27', 'bg.png')
self.image2 = pygame.image.load(bg)
surface.blit(self.image2, (0,0))
class Rock(object):
def __init__(self, x=640, y=0,):
self.image_s = pygame.image.load(img_path2)
self.image_b = self.image_s.get_rect()
self.x = x
self.y = y
dist = 10
self.dist = dist
def rock(self):
dist = 10
self.x -=dist
def rock_draw(self, surface):
surface.blit(self.image, (self.x, self.y))
def checkCollision(sprite1, sprite2):
col = pygame.sprite.collide_rect(sprite1, sprite2)
if col == True:
sys.exit()
pygame.init()
screen = pygame.display.set_mode((640, 200))
bird = Bird()
rock = Rock()
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
running = False
if rock.x < 0:
y = random.randint(10, 190)
rock = Rock(640, y)
rock.checkCollision(bird.image_b, rock.image_b)
bird.handle_keys()
rock.rock()
screen.fill((255,255,255))
bird.background(screen)
bird.draw(screen)
rock.rock_draw(screen)
pygame.display.update()
clock.tick(40)
Wenn ich ihn starten will sagt er mir es dauert nur 2 Argumente, und ich gab drei, wenn ich versuche zu lösen, bekomme ich alle Arten von verschiedenen Fehlermeldungen.
wenn
im Versuch, es zu tun wie dieser
Hast du die Fehlermeldung Lesen? Es sagt, dass Sie es übergeben Sie einen parameter mit kein Attribut
ohhhh sorry ich bin ein Anfänger danke!
collide_rect
ist eine Instanz-Methode der sprite -, dann müssen Sie es so nennen: sprite1.collide_rect(sprite2)
. Ob es eine Instanz-Methode von "rect", dann rufen Sie es auf sprite1 rect. Und so weiter.im Versuch, es zu tun wie dieser
if pygame.sprite.collide_rect(rock.image_b, bird.image_b)==True: sys.exit()
aber ich bin immer diese Fehlermeldung Traceback (most recent call last): File "C:\Python27\BIRDGAME.py", line 111, in <module> if pygame.sprite.collide_rect(rock.image_b, bird.image_b)==True: File "C:\Python27\lib\site-packages\pygame\sprite.py", line 1147, in collide_rect return left.rect.colliderect(right.rect) AttributeError: 'pygame.Rect' object has no attribute 'rect'
Hast du die Fehlermeldung Lesen? Es sagt, dass Sie es übergeben Sie einen parameter mit kein Attribut
rect
und es es erwartet haben. So müssen Sie übergeben einen parameter mit dem Attribut rect
.ohhhh sorry ich bin ein Anfänger danke!
InformationsquelleAutor Serial | 2013-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
sollte
da es eine Methode an ein Objekt gebunden.
InformationsquelleAutor sloth
Ändern
Zu
Und Sie nicht haben, um überprüfen Sie die Kollision auf jeden Fall, verringern Sie den Einzug des
rock.checkCollision(bird.image_b, rock.image_b)
1.InformationsquelleAutor pradyunsg
Haben Sie diese:
Sondern ein einfacher Weg, dies zu tun wäre, einfach colliderect, das eine Funktion rect. Es könnte einfacher sein, zu versuchen, diese:
Ok, in diesem Fall, kann er entweder den Weg, den ich bereits in meiner Antwort, oder er kann collide_rect() aber das problem ist, dass er vorbei an zwei sprites anstelle einer integer-Zahl.
Nein, die Sprite-Klasse hat keine Kollision Funktionen. Das sprite-Modul hat ein paar Kollision Funktionen, aber keiner von Ihnen entsprechen, was Sie eingegeben haben, als eine Antwort.
Oops, sorry, ich habe ganz vergessen, Ihr Recht. Seine tatsächlich eine Funktion rect selbst ist, werde ich Bearbeiten Sie die Antwort, um das zu beheben
InformationsquelleAutor Chachmu