2017-12-25 13 views
-1

Ich möchte die Collision Detection Skripte machen.Python Collision Erkennung von Bild mit Pygame (Bildtyp: PNG)

Wenn ich meine Skripte Pygame immer sagen, dass die Bilder kollidieren.

Es druckt "crash", wenn ich {"rect = cat1.img.get_rect()" then "rect.colliderect(another rect of other image)} benutze und auf diese Weise beides.

Ich verwendete cat.png in zwei Sprites.

Fragen

Ist cat.png schlecht?

Benutze ich nicht die richtigen Skripte?

Ist mein Computer komisch?

Hier sind meine Skripte und die cat.png.

enter image description here

import pygame, sys, time 
from pygame.locals import * 

pygame.init() 

Fps = 100 
fpsClock = pygame.time.Clock() 

Displaysurf = pygame.display.set_mode((300, 300))# full is 1900, 1000 
pygame.display.set_caption('Animation') 

white = (255, 255, 255) 

class cat: 
     def __init__(self, x, y): 
      self.img = pygame.image.load('cat.png') 
      self.x = x 
      self.y = y 
      self.rect = self.img.get_rect() 

    def draw(self): 
      Displaysurf.blit(self.img, (self.x, self.y)) 

    def colde(self, sprite1, sprite2): 
      col = pygame.sprite.collide_rect(sprite1, sprite2) 
      if col == True: 
       print("crash!") 

cat1 = cat(10, 10) 
cat2 = cat(100, 100) 

while True: 
    Displaysurf.fill(white) 
    cat1.draw() 
    cat2.draw() 

    for event in pygame.event.get(): 
     if event.type==QUIT: 
      pygame.quit() 
      sys.exit() 

    keys = pygame.key.get_pressed() 
    if keys[pygame.K_UP]: 
     cat1.y -= 3 
    if keys[pygame.K_DOWN]: 
     cat1.y += 3 
    if keys[pygame.K_LEFT]: 
     cat1.x -= 3 
    if keys[pygame.K_RIGHT]: 
     cat1.x += 3 
    cat1.colde(cat1, cat2) 
    pygame.display.update() 
    fpsClock.tick(Fps)` 
+0

'get_rect' gibt immer ein Rect an der Position (0, 0) zurück. Dokumentation ist [hier] (https://www.pygame.org/docs/ref/surface.html#pygame.Surface.get_rect) –

+0

Sie müssen 'cat1.rect.x' und' cat1.rect.x' verwenden anstelle von 'cat1.x' und' cat1.y' um Objekt zu verschieben und Kollision zu prüfen. Und um 'blit (self.img, self_rect)' zu verwenden – furas

Antwort

0

Sie haben cat1.rect.x und cat1.rect.x zu verwenden, anstatt cat1.x und cat1.y Objekt zu bewegen und cat1.rect dann Kollision zu überprüfen, verwenden und es

self.rect.colliderect(other_sprite) 

surface.blit(self.img, self.rect) 

-Code zu ziehen:

import pygame 

# --- constants --- (UPPER_CASE_NAMES) 

FPS = 100 
WHITE = (255, 255, 255) 

# --- classes --- (CamelCaseNames) 

class Cat: 

    def __init__(self, x, y): 
     self.img = pygame.image.load('cat.png') 
     self.rect = self.img.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

    def draw(self, surface): 
     surface.blit(self.img, self.rect) 

    def colide(self, other_sprite): 
     col = self.rect.colliderect(other_sprite) 
     if col: 
      print("crash!") 

# --- main --- (lower_case_names) 

# - init - 

pygame.init() 

display_surf = pygame.display.set_mode((300, 300)) # full is 1900, 1000 
pygame.display.set_caption('Animation') 

# - objects - 

cat1 = Cat(10, 10) 
cat2 = Cat(100, 100) 

# - mainloop - 

fps_clock = pygame.time.Clock() 
running = True 

while running: 

    # - events - 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 

    keys = pygame.key.get_pressed() 

    if keys[pygame.K_UP]: 
     cat1.rect.y -= 3 
    if keys[pygame.K_DOWN]: 
     cat1.rect.y += 3 
    if keys[pygame.K_LEFT]: 
     cat1.rect.x -= 3 
    if keys[pygame.K_RIGHT]: 
     cat1.rect.x += 3 

    # - updates (without draws) - 

    cat1.colide(cat2) 

    # - draws (without updates) - 

    display_surf.fill(WHITE) 
    cat1.draw(display_surf) 
    cat2.draw(display_surf) 

    pygame.display.update() 

    fps_clock.tick(FPS) 

# - end - 

pygame.quit()