2017-10-08 40 views
0

攝像頭正在跟隨英雄攝像頭正在跟隨英雄

我有一個pygame中的錯誤,我試圖讓攝像頭跟着英雄,但它似乎使我的遊戲有兩個實例。頂視圖沒有滾動。底部視圖具有按照我想要的方式工作的滾動。這兩種觀點都讓我的英雄做着相同的事情(射擊,跳躍,移動)。任何人都可以幫我找到並解釋爲什麼會發生這種情況?

pygame Screen --- has two identical games with different camera views

myCamera.py

class Camera: 
    def __init__(self, camera_function, w, h): 
     x, y = 0, 0 
     self.cameraFrame = pygame.Rect(x, y, w, h) 
     self.camera_function = camera_function 

    def moveTiles(self, entity): 
     return entity.rect.move(self.cameraFrame.topleft) 

    def updateCamera(self, entity, screenWidth, screenHeight): 
     self.cameraFrame = self.camera_function(screenWidth, screenHeight, self.cameraFrame, entity.rect) 


def camera_function(screenWidth, screenHeight, camera, target_rect): 
    half_width = screenWidth/2 
    half_height = screenHeight/2 
    left, top, _, _ = target_rect 
    _, _, width, height = camera 
    left, top, _, _ = half_width - left, \ 
         half_height - top, \ 
         width, \ 
         height 
    left = min(0, left) 
    left = max(-(camera.width - screenWidth), left) 
    top = min(0, top) 
    top = max(-(camera.height - screenHeight), top) 
    return pygame.Rect(left, top, width, height) 

myGame.py

level = [ 
    "----------------------------------------", 
    "-          -", 
    "-          -", 
    "-          -", 
    "-          -", 
    "-          -", 
    "-          -", 
    "-          -", 
    "----------------------------------------", 
] 

x, y = 0, 0 
for row in level: 
    for symbol in row: 
     if symbol == "-": 
      w, h = TILE_SIZE, TILE_SIZE 
      sprite = mySprites.Entity(x, y, w, h) 
      wallSprites.add(sprite) 
      allSprites.add(sprite) 
     x += TILE_SIZE 
    y += TILE_SIZE 
    x = 0 


def getLevelSize(level): 
    width = len(level[0]) * TILE_SIZE 
    height = len(level) * TILE_SIZE 
    return [width, height] 



[levelWidth, levelHeight] = getLevelSize(level) 

done = False 
clock = pygame.time.Clock() 
camera = myCamera.Camera(myCamera.camera_function, 
         levelWidth, levelHeight) 

fps = 60 

while not done: 
    # Event Handling 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       hero.moveLeft() 
      elif event.key == pygame.K_RIGHT: 
       hero.moveRight() 
      elif event.key == pygame.K_UP: 
       hero.aimUp() 
       hero.stopMoving() 
      elif event.key == pygame.K_DOWN: 
       hero.aimDown() 
       hero.stopMoving() 
      elif event.key == pygame.K_SPACE: 
       w, h = 5, 5 
       bullet = mySprites.Bullet(hero.rect.centerx, hero.rect.centery, w, h) 
       bullet.setHeading(hero.shootingAngle) 
       allSprites.add(bullet) 
       bulletSprites.add(bullet) 
      elif event.key == pygame.K_j: 
       hero.jump() 
     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT: 
       hero.moveLeft() 
      elif event.key == pygame.K_RIGHT: 
       hero.moveRight() 


    # Clear the Screen 
    screen.fill(myColors.getColor("white")) 

    # Collision Detection 
    L = pygame.sprite.spritecollide(hero, wallSprites, False) 
    for wall in L: 
     if hero.dx > 0: 
      hero.rect.right = wall.rect.left 
      hero.dx = 0 
     elif hero.dx < 0: 
      hero.rect.left = wall.rect.right 
      hero.dx = 0 
     elif hero.dy > 0: 
      hero.rect.bottom = wall.rect.top 
      hero.dy = 0 
      hero.onGround = True 
     elif hero.dy < 0: 
      hero.rect.top = wall.rect.bottom 
      hero.dy = 0 

    pygame.sprite.groupcollide(bulletSprites, wallSprites, True, False) 

    # Draw Sprites 
    allSprites.draw(screen) 

    # Update Hero 
    hero.update() 

    # Update Camera 
    camera.updateCamera(hero, SCREEN_WIDTH, SCREEN_HEIGHT) 


    for sprite in allSprites: 

     if isinstance(sprite, mySprites.Bullet): 
      sprite.update() 
     screen.blit(sprite.image, camera.moveTiles(sprite)) 



    # Update Display 
    pygame.display.flip() 

    # Next Frame 
    clock.tick(fps) 

pygame.quit() 
+0

請嘗試將您的代碼轉換爲[最小,完整且可驗證的示例](https://stackoverflow.com/help/mcve)。 – skrx

回答

0

解決。我意識到我正在畫兩次精靈。一旦使用allSprites.draw(),另一個使用screen.blit()。通過刪除allSprites.draw(),問題就解決了。