2016-02-29 23 views
0

感謝您查看我的問題並幫助我。我有一個用戶控制的精靈,它應該會導致屏幕圍繞精靈的位置移動,就像老式的Gameboy Pokemon遊戲一樣,但這並沒有發生。相反,我的精靈卡在一盒座標中,我用它來幫助定義背景偏移的參數。這是我認爲的代碼是導致此:用戶控制的精靈卡在框中。 Python 2.7.9 w/Pygame

# Shift world left (-x) 
    if player.rect.right >= 510: 
     diff = player.rect.right - 510 
     player.rect.right = 510 
     current_level.shift_world_x(-diff) 

    # Shift world right (+x) 
    if player.rect.left <= 130: 
     diff = 130 - player.rect.left 
     player.rect.left = 130 
     current_level.shift_world_x(diff) 

    # Shift world up (-y) 
    if player.rect.top <= 100: 
     diff = 100 - player.rect.top 
     player.rect.top = 100 
     current_level.shift_world_y(diff) 

    # Shift world down (y) 
    if player.rect.bottom >= 380: 
     diff = player.rect.bottom - 380 
     player.rect.bottom = 380 
     current_level.shift_world_y(-diff) 

如果我把一個#旁邊player.rect.right = 510,或任何其他三個一些變體,我的精靈可以自由移動,但屏幕不會移位。

所有資產Zip文件是在這裏: https://www.dropbox.com/s/3g2w0mv1fuupetl/DoneGeon.zip?dl=0

我的代碼全部如下:

import pygame 

"""---Global Constants---""" 

# Colors 
BLACK = (0, 0, 0) 

# Screen Variables 
screen_x = 720 
screen_y = 480 

# Background variables 
back_x = 0 
back_y = -243 
back_x_change = 0 
back_y_change = 0 

class Player(pygame.sprite.Sprite): 
    """---User Controled Character---""" 

    # Methods 
    def __init__(self): 
     """---Contructor Function---""" 

     # Call parent's constructor 
     pygame.sprite.Sprite.__init__(self) 

     # Load player image 
     self.image = pygame.image.load("player.png").convert() 

     # Set referance to image "hit box" 
     self.rect = self.image.get_rect() 

     # Set speed of player 
     self.change_x = 0 
     self.change_y = 0 


    def update(self): 
     """---Move the Player---""" 

     # Move left/right 
     self.rect.x += self.change_x 

     # Move up/down 
     self.rect.y += self.change_y 

    # User controlled movements 
    def go_left(self): 
     self.change_x = -3 
    def go_right(self): 
     self.change_x = 3 
    def go_up(self): 
     self.change_y = -3 
    def go_down(self): 
     self.change_y = 3 
    def stop_x(self): 
     self.change_x = 0 
    def stop_y(self): 
     self.change_y = 0 

class Barrier(pygame.sprite.Sprite): 
    """---Barriers that prevent player from passing---""" 

    def __init__(self,width,height): 
     """ Barrier constructor """ 
     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.Surface([width,height]) 
     self.image.fill(BLACK) 

     self.rect = self.image.get_rect() 

class Level(): 
    """---All levels will spawn from this generic class---""" 

    def __init__(self,player): 
     """ Needed for when sprites collide with player """ 
     self.barrier_list = pygame.sprite.Group() 
     self.enemy_list = pygame.sprite.Group() 
     self.player = player 

     # Distance world has been shifted left/right 
     self.world_shift_x = 0 

     # Background image 
     background_base = None 
     background_layera = None 

     # Distance world has been shifted up/down 
     self.world_shift_y = 0 


    def update(self): 
     """ Update everything on level """ 
     self.barrier_list.update() 
     self.enemy_list.update() 

    def draw(self,screen): 
     """ Draw everything on level """ 

     # Draw barriers 
     self.barrier_list.draw(screen) 

     # Draw the base layer 
     screen.blit(self.background_base,(back_x,back_y)) 

     # Draw all sprites 
     self.enemy_list.draw(screen) 

     # Draw Layer A 
     screen.blit(self.background_layera,(back_x,back_y)) 

    def shift_world_x(self,shift_x): 
     """ When character moves left/right, everything must follow """ 

     # Track shift amount 
     self.world_shift_x += shift_x 

     # Go through all list and shift 
     for barrier in self.barrier_list: 
      barrier.rect.x += shift_x 

     for enemy in self.enemy_list: 
      enemy.rect.x += shift_x 

    def shift_world_y(self,shift_y): 
     """ When character moves up/down, everything must follow """ 

     # Track shift amount 
     self.world_shift_y += shift_y 

     # Go through all list and shift 
     for barrier in self.barrier_list: 
      barrier.rect.y += shift_y 

     for enemy in self.enemy_list: 
      enemy.rect.y += shift_y 

class Level_1(Level): 
    """---Forest 1---""" 

    def __init__(self,player): 
     """ Create the level """ 

     # Call parent constructor 
     Level.__init__(self,player) 

     self.level_limit_x = -1912 
     self.level_limit_y = 1080 

     # Make background 
     self.background_base = pygame.image.load("base1.png").convert() 
     self.background_layera = pygame.image.load("layera1.png").convert() 
     self.background_layera.set_colorkey(BLACK) 


     # List with w, h, x = 32, y = 32 of barriers 
     # Remove comment to activate-> level = [] 

     # Go through the list above and add barriers 
     # Remove comment to activate-> for barriers in level: 


def main(): 
    """---Main Program---""" 
    pygame.init() 

    # Set screen size and caption 
    size = (screen_x,screen_y) 
    screen = pygame.display.set_mode(size) 
    pygame.display.set_caption("DoneGeon") 

    # Create Player 
    player = Player() 

    # Create all levels 
    level_list= [] 
    level_list.append(Level_1(player)) 

    # Set current level 
    current_level_no = 0 
    current_level = level_list[current_level_no] 

    # Add all sprites 
    active_sprite_list = pygame.sprite.Group() 

    # Add player 
    player.level = current_level 
    player.rect.x = 360 
    player.rect.y = 240 
    active_sprite_list.add(player) 

    # Loop until closed 
    done = False 

    # Screen update rate 
    clock = pygame.time.Clock() 

    # -------- Main Program Loop ----------- 
    while not done: 

     """---Main event loop---""" 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       done = True 

      """---User Controls---""" 

      # Key Pressed 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 
        player.go_left() 
       if event.key == pygame.K_RIGHT: 
        player.go_right() 
       if event.key == pygame.K_UP: 
        player.go_up() 
       if event.key == pygame.K_DOWN: 
        player.go_down() 

      # Key Released 
      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
        player.stop_x() 
       if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
        player.stop_y() 

     """---Game Logic---""" 

     # Update Player 
     active_sprite_list.update() 

     # Update items in level 
     current_level.update() 

     # Shift world left (-x) 
     if player.rect.right >= 510: 
      diff = player.rect.right - 510 
      player.rect.right = 510 
      current_level.shift_world_x(-diff) 

     # Shift world right (+x) 
     if player.rect.left <= 130: 
      diff = 130 - player.rect.left 
      player.rect.left = 130 
      current_level.shift_world_x(diff) 

     # Shift world up (-y) 
     if player.rect.top <= 100: 
      diff = 100 - player.rect.top 
      player.rect.top = 100 
      current_level.shift_world_y(diff) 

     # Shift world down (y) 
     if player.rect.bottom >= 380: 
      diff = player.rect.bottom - 380 
      player.rect.bottom = 380 
      current_level.shift_world_y(-diff) 


     """---Draw below here---""" 
     current_level.draw(screen) 
     active_sprite_list.draw(screen) 

     pygame.display.flip() 
     clock.tick(60) 


    pygame.quit() 

if __name__ == "__main__": 
    main() 

感謝您的任何建議!

回答

0

我想你會發現,如果你記錄玩家x和世界x的變化,你會發現這更容易追蹤。通常遊戲中的小變化是不可見的,所以日誌記錄是監視遊戲循環中發生的事情的唯一方法。

我還沒有測試過這個,但我敢打賭,你在錯誤的地方有一個負面的。這:

def shift_world_x(self,shift_x): 
    """ When character moves left/right, everything must follow """ 

表明,如果玩家右邊緣移動經過世界右側邊緣的世界第一右邊緣應該擴展到匹配的球員,但是這個代碼反向:

if player.rect.right >= 510: 
    diff = player.rect.right - 510 
    player.rect.right = 510 
    current_level.shift_world_x(-diff) 

如果玩家。右移動到513 diff將會是3,所以shift_world_x將被調用-3,將世界框左移動到507.玩家權利將被設置爲510,所以玩家權利仍然會在下一個環路的框外。這表明世界圖像會飄向左邊,玩家精靈會卡在右邊緣,但聽起來像是被困在右邊緣(我專注於一個邊緣,因爲所有的邏輯都是相同的)。

如果你在上面的if中記錄player.rect.right和world.rect.right,你應該看到值的變化,並且更好地感受遊戲邏輯正在做什麼。

+0

謝謝,我能找到問題。在繪製背景的第104和第110行中,x和y座標必須是「self.world_shift_x」和「self.world_shift_y」,以根據玩家精靈動作物理移動他們的位置。如果沒有這些,他們的位置永遠不會改變,無論精靈x或y位置。再次感謝你的幫助! – RavusFlapjack