2017-10-08 3 views
0

caméra Après le héroscaméra Après le héros

J'ai un bogue dans pygame où je suis en train d'obtenir la caméra de suivre le héros mais il semble faire deux instances de mon jeu. La vue de dessus n'a pas de défilement. La vue du bas a un défilement qui fonctionne comme je le veux. Les deux vues permettent à mon Héros de faire des choses identiques (tir, saut, déplacement). Quelqu'un peut-il m'aider à trouver et expliquer pourquoi cela se produit?

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

Veuillez essayer de transformer votre code en [exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve). – skrx

Répondre

0

Résolu. J'ai réalisé que je dessinais les sprites deux fois. Une fois l'utilisation de allSprites.draw() et l'autre avec screen.blit(). En supprimant allSprites.draw(), le problème est résolu.