如何解决尝试在 pygame 上制作自上而下的射击游戏,但在尝试弄清楚玩家移动时如何滚动地图时遇到了麻烦
我目前正在尝试制作一个自上而下的射击游戏,但是我在尝试弄清楚如何在角色移动时(向上、向下、向左和向右)移动地图时遇到了一些麻烦。我希望地图始终填满屏幕,但是当角色移动时,地图会随之移动。我曾在网上寻找一些解决方案,但在尝试将其实施到我自己的程序中时遇到了困难。
import pygame
pygame.display.set_caption("TEST")
clock = pygame.time.Clock()
class Player():
def __init__(self,x,y):
self.Image = pygame.image.load("myAvatar.png").convert()
self.rect = self.Image.get_rect(topleft = (x,y))
def getX(self):
return self.rect.x
def getY(self):
return self.rect.y
def handle_keys(self,screenHeight,screenWidth):
key = pygame.key.get_pressed()
dist = 1
if key[pygame.K_DOWN]:
self.rect.y += dist
if self.rect.y > screenHeight:
self.rect.y = screenHeight
elif key[pygame.K_UP]:
self.rect.y -= dist
if self.rect.y < 0:
self.rect.y = 0
if key[pygame.K_RIGHT]:
self.rect.x += dist
if self.rect.x > screenWidth:
self.rect.x = screenWidth
elif key[pygame.K_LEFT]:
self.rect.x -= dist
if self.rect.x < 0:
self.rect.x = 0
def draw(self,game_window,screenX,screenY):
self.Image = pygame.transform.scale(self.Image,(20,20))
game_window.blit(self.Image,(screenX,screenY))
class Map():
def __init__(self):
self.Image = pygame.image.load("testbackground.jpg").convert()
self.rect = self.Image.get_rect()
self.rect.x = 0
self.rect.y = 0
def getX(self):
return self.rect.x
def getY(self):
return self.rect.y
def setX(self,newX):
self.rect.x = newX
def setY(self,newY):
self.rect.y = newY
def draw(self,(800,800))
game_window.blit(self.Image,screenY))
class Enemy():
def __init__ (self,y):
self.Image = pygame.image.load("WC.jpg").convert()
self.rect = self.Image.get_rect(topleft = (x,y))
def draw(self,game_window):
self.Image = pygame.transform.scale(self.Image,(self.rect.x,self.rect.y))
pygame.init()
clock = pygame.time.Clock()
screenWidth = 400
screenHeight = 400
game_window = pygame.display.set_mode((screenWidth,screenHeight))
player = Player(200,200)
map = Map()
enemy = Enemy(250,250)
leave = False
while not leave:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
running = False
playerX = player.getX()
playerY = player.getY()
mapX = map.getX()
mapY = map.getY()
screenX = playerX - (screenWidth/2)
if screenX < 0:
screenX = 0
if screenX > (mapX - screenWidth):
screenX = (mapX - screenWidth)
screenY = playerY - (screenHeight/2)
if screenY < 0:
screenY = 0
if screenY > (mapY - screenHeight):
screenY = (mapY - screenHeight)
player.handle_keys(screenHeight,screenWidth)
map.draw(game_window,screenY)
enemy.draw(game_window)
player.draw(game_window,screenY)
pygame.display.update()
pygame.display.flip()
clock.tick(60)
pygame.quit()
quit()
解决方法
您可以像this question中那样移动相机:
基本上,每个精灵都有一个位置,在屏幕上是这样绘制的:
pos_on_the_screen = (posX - cameraX,posY - cameraY)
然后,摄像机像这样跟随玩家:
width,height = sceen_size
camera_pos = (player.posX - width / 2,player.posY - height / 2)
在这种情况下,玩家停留在屏幕中央。
如果你想让相机跟随播放器,但又不想让播放器一直在中心(它可以移动一点,但不会退出屏幕),你可以使用这种方法:>
width,height = screen_size
if cameraX - playerX > 2 * width / 3: # player exits to the right
cameraX = playerX - 2 * width / 3
elif cameraX - playerX < width / 3: # player exits to the left
cameraX = playerX - width / 3
if cameraY - playerY > 2 * height / 3: # player exits to the bottom
cameraY = playerY - 2 * height / 3
elif cameraY - playerY < height / 3: # player exits to the top
cameraY = playerY - height / 3
在这个例子中,玩家永远不会离开这个空间:
您也可以使用更紧凑的形式:
width,height = screen_size
cameraX = min(max(cameraX,playerX - 2 * width / 3),playerX - width / 3)
cameraY = min(max(cameraY,playerY - 2 * height / 3),playerY - height / 3)
示例:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。