Движение камеры Pygame - PullRequest
       0

Движение камеры Pygame

0 голосов
/ 29 марта 2020

Здравствуйте, я делаю игру-клон Pokémon, и после ее завершения я хочу изменить некоторые вещи, чтобы сделать ее своей собственной версией. Но мой вопрос: не могли бы вы помочь мне улучшить движение камеры, потому что теперь персонаж движется быстрее, чем камера. Я хочу, чтобы персонаж оставался в центре, и я не хочу, чтобы персонаж не двигался, а фон перемещался. Персонаж должен двигаться, а камера должна следовать за персонажем. Изображения находятся в ZIP-файле по этой ссылке. Вот код ->

import pygame
from pygame import mixer

pygame.init()

display_width = 800
display_height = 600

# Screen and Caption
screen = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('PokémonClone')

# Background
background = pygame.image.load('Images/main_town1.png')
bgX = -450
bgY = -700
bgX_change = 0
bgY_change = 0

# FPS
clock = pygame.time.Clock()
FPS = 15

# Background music
mixer.music.load('Sounds/bgmusic.mp3')
pygame.mixer.music.set_volume(0.1)
mixer.music.play()

# Player
walkUp = [pygame.image.load('Images/up1.png'), pygame.image.load('Images/up2.png'),
            pygame.image.load('Images/up3.png'), pygame.image.load('Images/up4.png')]

walkDown = [pygame.image.load('Images/down1.png'), pygame.image.load('Images/down2.png'),
            pygame.image.load('Images/down3.png'), pygame.image.load('Images/down4.png')]

walkLeft = [pygame.image.load('Images/left1.png'), pygame.image.load('Images/left2.png'),
            pygame.image.load('Images/left3.png'), pygame.image.load('Images/left4.png')]

walkRight = [pygame.image.load('Images/right1.png'), pygame.image.load('Images/right2.png'),
            pygame.image.load('Images/right3.png'), pygame.image.load('Images/right4.png')]

playerImg = pygame.image.load('Images/down1.png')

playerX = 370
playerY = 270
playerX_change = 0
playerY_change = 0

up = False
down = False
left = False
right = False
walkCount = 0

def redrawWindow(x, y):
    global walkCount
    clock.tick(FPS)
    screen.blit(background, (bgX, bgY))

    if walkCount + 1 >= 15:
        walkCount = 0

    if up:
        screen.blit(walkUp[walkCount//4], (x, y))
        walkCount += 1
    elif down:
        screen.blit(walkDown[walkCount//4], (x, y))
        walkCount += 1
    elif left:
        screen.blit(walkLeft[walkCount//4], (x, y))
        walkCount += 1
    elif right:
        screen.blit(walkRight[walkCount//4], (x, y))
        walkCount += 1
    else:
        screen.blit(playerImg, (x, y))

    pygame.display.update()

# Game loop
running = True
while running == True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LSHIFT:
                FPS = 25
            elif event.key == pygame.K_LEFT:
                playerX_change = -2
                bgX_change += 3
                up = False
                down = False
                left = True
                right = False
            elif event.key == pygame.K_RIGHT:
                playerX_change = 2
                bgX_change += -3
                up = False
                down = False
                left = False
                right = True
            elif event.key == pygame.K_UP:
                playerY_change = -2
                bgY_change += 3
                up = True
                down = False
                left = False
                right = False
            elif event.key == pygame.K_DOWN:
                playerY_change = 2
                bgY_change += -3
                up = False
                down = True
                left = False
                right = False

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                up = False
                down = False
                left = False
                right = False
                walkCount = 0
                playerX_change = 0
                playerY_change = 0
                bgX_change = 0
                bgY_change = 0
            elif event.key == pygame.K_LSHIFT:
                FPS = 15


    playerX += playerX_change
    playerY += playerY_change
    bgX += bgX_change
    bgY += bgY_change

    redrawWindow(playerX, playerY)

pygame.quit()

Я уже пытался увеличить скорость перемещения камеры, но затем персонаж движется быстрее. Так что, если бы вы могли мне помочь, я был бы признателен. И если вы хотите, может быть, вы можете посмотреть, как я могу сделать хорошие столкновения, такие как граница на деревьях и в домах? Заранее спасибо !!!

1 Ответ

0 голосов
/ 30 марта 2020

Я не совсем понимаю, что вы хотите, но этот код удерживает игрока в центре экрана, в то же время позволяя ему перемещаться и не выходить за пределы экрана. (добавьте это в вашу программу выше, где вы вызываете функцию redrawWindow ())

 if playerX > 460:
    playerX = 460
 if playerX < 280:
    playerX = 280
 if playerY > 360:
    playerY = 360
 if playerY < 200:
    playerY = 200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...