2017-03-23 2 views
-1

Ich habe in letzter Zeit Probleme mit diesem Code in Pygame, und ich kann meinen Fehler nicht finden. Das Skript ist im Moment nur ein kontrollierbares Sprite, (was ich verstehe, wird nicht angezeigt, da die Dinge darüber gezeichnet sind), aber wenn ich meinen Code ausführe, denkt es das kleine weiße Quadrat, (Player) kollidiert mit dem größeren, (Blöcke. Bäume). Der Code ist als solcher:Beim Ausführen eines Skripts erkennen zwei sehr weit auseinander liegende Objekte, dass sie kollidieren

import pygame 
from pygame.locals import* 

#initialise pygame 
pygame.init() 

WHITE = (255,255,255) 

#counts which sprite you should be on when running 


#create screen 
screen_width = 160 
screen_height = 144 
screen_multiplier = 4 
screen = pygame.display.set_mode(((screen_width*screen_multiplier), (screen_height*screen_multiplier))) 
pygame.display.set_caption('Pokemon Blood Red') 

#Sprite stuff 
sprite = pygame.image.load('player_east_still.png') 
#Reform the sprite 
sprite = pygame.transform.scale(sprite, (10*screen_multiplier, 14*screen_multiplier)) 
sprite.set_colorkey(WHITE) 

############################################################################# 
class Player(pygame.sprite.Sprite): 

    def __init__(self): 
     super(Player, self).__init__() 
     self.player_sprite = pygame.Surface((10*screen_multiplier, 14*screen_multiplier)) 
     self.player_sprite.fill(WHITE) 
     self.rect = self.player_sprite.get_rect() 


class Blocks(pygame.sprite.Sprite): 

    def __init__(self): 
     super(Blocks, self).__init__() 
     self.trees = pygame.Surface((20*screen_multiplier, 40*screen_multiplier)) 
     self.trees.fill(WHITE) 
     self.rect = self.trees.get_rect() 

player = Player() 
blocks = Blocks() 












############################################################################# 
#Random variables for later use 

amount_caught = 0 
place = 1 
catch1 = {'pokemon':'none', 
      'hp':0, 
      'attack':0, 
      'defence':0, 
      'sp_attack':0, 
      'sp_defence':0,} 
background = 1 
def area_load(): 
    global background 
    if background == 1: 
     background = pygame.image.load('neuory_town.png').convert() 
     background = pygame.transform.scale(background, (160*screen_multiplier, 144*screen_multiplier)) 
area_load() 
(x) = 160*0.45 
(y) = 144*0.45 
def caught(): 
    if amount_caught == 0: 
     pass 


#Mainloop 
crashed = False 
while not crashed: 
    pressed_keys = pygame.key.get_pressed() 
    player.update(pressed_keys) 
    x_change = 0 
    y_change = 0 

    #Different buttons 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      crashed = True 
      pygame.quit() 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       x_change = 5*screen_multiplier 

       sprite = pygame.image.load('player_west_still.png') 
     elif event.key == pygame.K_RIGHT: 
      x_change = -5*screen_multiplier 

      sprite = pygame.image.load('player_east_still.png') 
     elif event.key == pygame.K_UP: 
      y_change = -5*screen_multiplier 

      sprite = pygame.image.load('player_north_still.png') 
     elif event.key == pygame.K_DOWN: 
      y_change = 5*screen_multiplier 

      sprite = pygame.image.load('player_south_still.png') 

    elif event.type == pygame.KEYUP: 
     if event.key == pygame.K_LEFT: 
      x_change = 0 
     elif event.key == pygame.K_RIGHT: 
      x_change = 0 
     elif event.key == pygame.K_UP: 
      y_change = 0 
     elif event.key == pygame.K_DOWN: 
      y_change = 0  
x += x_change 
y += y_change 

blockades = pygame.sprite.Group() 
blockades.add(blocks) 
#Check for collisions 
hits = pygame.sprite.spritecollide(player, blockades, True) 
if hits: 
    print ('Collision!') 

#Draw everything 
sprite = pygame.transform.scale(sprite, (10*screen_multiplier, 14*screen_multiplier)) 
sprite.set_colorkey(WHITE) 
screen.blit(background,(0,0)) 
screen.blit(sprite,(x,y)) 
screen.blit(player.player_sprite, (x, y)) 
screen.blit(blocks.trees, (200, 200)) 
pygame.display.flip() 
pygame.quit()  

Danke für die Hilfe!

+1

Willkommen bei Stackoverflow. Bitte lesen und befolgen Sie die Buchungsrichtlinien in der Hilfe. [Minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) gilt hier. Wir können Ihnen nicht effektiv helfen, bis Sie Ihren MCVE-Code veröffentlicht und das Problem genau beschrieben haben. In diesem Fall suche ich nach * minimalem * Code sowie nach Ihren Debugging-Versuchen - woher wissen Sie, dass sie kollidieren, und was sind die Werte kritischer Variablen bei und bis zu diesem Punkt? – Prune

Antwort

0

pygame.sprite.spritecollide überprüft, ob sich die rect s der Sprites überschneiden. Nach der Instanziierung werden die Retrakte nie an eine neue Position verschoben, sodass sowohl player als auch immer noch auf (0, 0) positioniert sind (versuchen Sie es mit print(blocks.rect, player.rect)). Um sie bewegt Sie zum Beispiel können die x- und y-Koordinaten ändern, den topleft, das Zentrum oder die other attributes des rect:

blocks.rect.center = (400, 500) 
player.rect.topleft = (20, 40) 
player.rect.x += 50 
player.rect.y += 100 

In Ihrem ursprünglichen Beispiel sind Sie nicht den Sprites bewegen, aber nur ändern die Variablen x und y, die Sie als Blit-Position für das Bild verwenden.

# This doesn't change the position of the rect, so there won't be collisions. 
x += x_change 
y += y_change 

Sie sollten stattdessen die rect bewegen und dann die rect als blit Position verwenden:

player.rect.x += x_change 
player.rect.y += y_change 
screen.blit(player.player_sprite, player.rect) # Blits the image at rect's topleft coords. 

Auch das Bildattribut eines pygame.sprite.Sprite sollte image nicht player_sprite aufgerufen werden. Dann können Sie alle Ihre Sprites in eine pygame.sprite.Group setzen und zu aktualisieren und alle Sprites zeichnen Sie brauchen nur zwei Zeilen Code:

# Before the while loop define the sprite group. 
all_sprites = pygame.sprite.Group() 
# Add all sprites. 
all_sprites.add(player) # And other sprites. 

# In the while loop update the sprites. 
all_sprites.update() 
# And in the draw phase. 
all_sprites.draw(screen) 
+0

Danke, ich werde es versuchen, wenn ich nach Hause komme! –

+0

Wenn ich das versuchte, hat es immer noch keine Kollisionen: Ich habe versucht, sie am Ende zu verschiedenen Co-Orden zu blitzen. –

+0

Die Quadrate berühren sich nicht, nachdem sie geblitzt wurden, aber sie nehmen keine Kollisionen auf! –

Verwandte Themen