2014-12-17 2 views
1

У меня возникла эта проблема с первого раза, когда я попытался сделать код. Моя проблема связана с системой столкновений, которая находится внутри этого класса.Исчезновение моего персонажа из-за столкновения. pygame

def updates(self, wall): 
     self.hero = hero 
     self.wall = wall 
     self.rect.x += self.change_x 

     list_of_collisions = pygame.sprite.spritecollide(self, self.wall, False) 
     for wall in list_of_collision: 
      if self.change_x > 0: 
       self.rect.right = wall.rect.left 
      elif self.change_x < 0: 
       self.rect.right = pared.rect.left 

     self.rect.y += self.change_y 
     list_of_collision = pygame.sprite.spritecollide(self, self.wall, False) 
     for block in list_of_collision: 
      if self.change_y > 0: 
       self.rect.right = wall.rect.left 
      else: 
       self.rect.left = wall.rect.right 

по какой-то причине extrange мой персонаж совершенно сталкиваются с одной стеной, но исчезает в others.I пытались решить это сам, я бы не просил, если я попытался нету все, что я думал о.

Это полный код (К сожалению это как-то давно)

#imports 
import pygame 
import random 

#colors and images 
WHITE = (255, 255, 255) 
BLACK = (0,0,0) 
BLUE = (0, 0, 255) 

#Class and fuctions 
class Wall(pygame.sprite.Sprite): 
    def __init__(self, x, y, high, width): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface([high, width]) 
     self.image.fill(BLACK) 
     self.rect = self.image.get_rect() 
     self.rect.y = y 
     self.rect.x = x 

class Prota(pygame.sprite.Sprite): 
    change_x = 0 
    change_y = 0 

    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface([15, 15]) 
     self.image.fill(BLUE) 
     self.rect = self.image.get_rect() 
     self.rect.x = 450 
     self.rect.y = 300 
    def velocity(self, x, y): 
      self.rect.x += x 
      self.rect.y += y  
    def update(self, wall): 
     self.hero = hero 
     self.wall = wall 
     self.rect.x += self.change_x 

     list_of_collisions = pygame.sprite.spritecollide(self, self.wall, False) 
     for wall in list_of_collisions: 
      if self.change_x > 0: 
       self.rect.right = wall.rect.left 
      elif self.change_x < 0: 
       self.rect.right = wall.rect.left 

     self.rect.y += self.change_y 
     list_of_collisions = pygame.sprite.spritecollide(self, self.wall, False) 
     for block in list_of_collisions: 
      if self.change_y > 0: 
       self.rect.right = wall.rect.left 
      else: 
       self.rect.left = wall.rect.right 


#creating room 
dimensions = [900, 600] 
screen = pygame.display.set_mode(dimensions) 
pygame.display.set_caption("The oblivion of the voices") 

#variables 
    #walls 
list_walls= pygame.sprite.Group() 
wallr = Wall(850, 0, 50, 600) 
walll = Wall(0, 0, 50, 600) 
walltop = Wall(0, 0, 900, 50) 
wallbot = Wall(0, 550, 900, 50) 
lista_paredes.add(paredd,paredi, paredar, paredab) 


#protagonist 
hero = pygame.sprite.Group() 
Aaron = Prota() 
hero.add(Aaron) 

    #list of everything 
list_of_lists = pygame.sprite.Group() 
list_of_lists.add(walll, wallr, walltop, wallbot, Aaron) 





#creating a clock 
clock = pygame.time.Clock() 

#initializing pygame 
pygame.init() 

#The game start 
done = False 


#-------------------------------------------------- HERE IS WHERE THE GOOD STUFF IS------------------------------ 
while done == False: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
#LOGIC OF THE GAME 
    #keyboard for moving charac 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       Aaron.velocity (-10, 0) 
      elif event.key == pygame.K_RIGHT: 
       Aaron.velocity (10, 0) 
       print(Aaron.cambio_x, Aaron.rect.x) 
      elif event.key == pygame.K_DOWN: 
       Aaron.velocity (0, 10) 
      elif event.key == pygame.K_UP: 
       Aaron.velocity (0, -10) 
    x = Aaron.rect.y 
    y = Aaron.rect.x 
    cam_x = Aaron.change_x 
    cam_y = Aaron.change_y 
    print("[",x,"*",y,"-","]", "[" ,cam_x,"^", cam_y,"&","]") 
    Aaron.update(list_walls) 


    #mouse for touching (not in used yet) 
    pos = pygame.mouse.get_pos() 
    royx = pos[0] 
    royy = pos[1] 




#Draw 
    screen.fill(WHITE) 
    list_of_lists.draw(screen) 

#FInal ditails 
    clock.tick(20) 
    pygame.display.flip() 
pygame.quit() 

Если вы заметили, я попытался напечатать также переменные, х, у, cam_x, cam_y и это то, что консоль показывает. Значения 0, 200 просто случаются, когда я нажимаю правую кнопку.

[ 300 * 200 - ] [ 0^0 & ] 
[ 300 * 150 - ] [ 0^0 & ] 
[ 300 * 150 - ] [ 0^0 & ] 
[ 300 * 150 - ] [ 0^0 & ] 
[ 300 * 150 - ] [ 0^0 & ] 
0 200 

ответ

0

Изменить код из этого

for block in list_of_collision: 
      if self.change_y > 0: 
       self.rect.right = wall.rect.left 
      else: 
       self.rect.left = wall.rect.right 

к этому

for block in list_of_collision: 
       if self.change_y > 0: 
        self.rect.bottom = wall.rect.top 
       elif : 
        self.rect.top = wall.rect.bottom 

вы устанавливаете права и слева от вашей коробки, когда вы должны быть настройки верхней и нижней

+0

<Да, извините за это. Последний раз> А что вы мне порекомендовали? – Jocoso

+0

В одном из операторов if необходимо проверить, равно ли оно равно нулю. Вам нужно решить, какой из них, как правило, не имеет значения. Вот список операторов сравнения, я предлагаю использовать либо <= or > = Это может не исправить это, но это хорошая практика, чтобы не сделать убедитесь, что ваши инструкции if else охватывают весь диапазон чисел, когда это необходимо –

+0

Кроме того, еще одна вещь, которую я замечаю, заключается в том, что когда вы проверяете 'if self.cambio_y> 0:', вы устанавливаете левое и правое положения прямоугольника вместо верхнего и нижнего, так что прямоугольник может быть, в некотором смысле, телепортироваться к дальним сторонам вашей верхней стены, где вы не видите его. –

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