2017-03-23 1 views
-1

J'ai récemment eu des problèmes avec ce code dans Pygame, et je ne trouve pas mon erreur. Le script est pour l'instant juste un sprite contrôlable, (que je comprends ne montre pas que les choses sont dessinées dessus) mais quand je cours mon code il pense que le petit carré blanc, (joueur) entre en collision avec les plus grands blocs. des arbres). Le code est en tant que tel:Lors de l'exécution d'un script, deux objets très éloignés se reconnaissent comme étant en collision

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()  

Merci pour l'aide!

+1

Bienvenue sur StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [Exemple minimal, complet, vérifiable] (http://stackoverflow.com/help/mcve) s'applique ici. Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Dans ce cas, je suis à la recherche de code * minimal *, ainsi que de vos tentatives de débogage - comment savez-vous qu'ils sont en collision, et quelles sont les valeurs des variables critiques à et menant à ce point? – Prune

Répondre

0

pygame.sprite.spritecollide vérifie si les rect s des images-objets se chevauchent. Vous ne déplacez jamais les retours à une nouvelle position après l'instanciation, donc les deux player et blocks sont toujours positionnés à (0, 0) (essayez de print(blocks.rect, player.rect)). Pour les déplacer, vous pouvez par exemple changer x et y coords, le topleft, au centre ou la other attributes du rect:

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

Dans votre exemple original que vous ne bougez pas les sprites, mais seul changement les variables x et y que vous utilisez comme position de blit pour l'image.

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

Vous devriez plutôt déplacer le rect puis utilisez la rect comme position de blit:

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. 

En outre, l'attribut image d'un pygame.sprite.Sprite doit être appelé image pas player_sprite. Ensuite, vous pouvez mettre tous vos sprites en un seul pygame.sprite.Group et de mettre à jour et d'en tirer tous les sprites vous avez seulement besoin de deux lignes de 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

Merci, je vais essayer quand je rentre à la maison! –

+0

Quand j'ai essayé ça, ça ne capte toujours pas les collisions: j'ai essayé, mais je les ai blitties à différents endroits à la fin, cependant. –

+0

Les carreaux ne se touchent pas après avoir soufflé, mais ne ramassent toujours pas les collisions! –