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?
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()
Veuillez essayer de transformer votre code en [exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve). – skrx