python - 无法将地图图片保留在 pygame 屏幕上
问题描述
我在 pygame 窗口上对齐地图图片时遇到了一些麻烦。我想要它,这样地图图片将始终填满整个屏幕。我已经做到了,当玩家移动时地图图片会移动,但无法显示整个地图。
(这些不是我将在我的实际游戏中使用的图像,只是用它们来测试)
如果你向上和向左移动到最大值会发生什么
这是我正在使用的代码:
import pygame
from pygame.locals import *
from math import sin
pygame.display.set_caption("TEST")
clock = pygame.time.Clock()
time_passed = 0
class Player():
def __init__(self,x,y):
self.Image = pygame.image.load("myAvatar.png").convert()
self.x = 200
self.y = 200
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 = 2
if key[K_LEFT] and self.x > 0:
self.x -= 500 * time_passed
if key[K_RIGHT] and self.x < screenWidth -20:
self.x += 500 * time_passed
if key[K_UP] and self.y > 0:
self.y -= 500 * time_passed
if key[K_DOWN] and self.y < screenHeight -20:
self.y += 500 * time_passed
def draw(self, game_window):
self.Image = pygame.transform.scale(self.Image,(20,20))
game_window.blit(self.Image, (int(self.x), int(self.y)))
class Map():
def __init__(self):
self.Image = pygame.image.load("testbackground.jpg").convert()
self.rect = self.Image.get_rect()
self.x = 0
self.y = 0
def draw(self, game_window,screenHeight,screenWidth):
self.Image = pygame.transform.scale(self.Image,(800,800))
self.x = min(max(self.x, player.x - 2 * screenWidth / 3), player.x - screenWidth / 3)
self.y = min(max(self.y, player.y -2 * screenHeight / 3), player.y - screenHeight / 3)
game_window.blit(self.Image,(-self.x,-self.y))
class Enemy():
def __init__ (self,x,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,(20,20))
game_window.blit(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
player.handle_keys(screenHeight,screenWidth)
game_window.fill((0,0,0))
map.draw(game_window,screenHeight,screenWidth)
#enemy.draw(game_window)
player.draw(game_window)
pygame.display.update()
pygame.display.flip()
time_passed = clock.tick() / 1000
pygame.quit()
quit()
解决方案
您需要blit
多次进入后台。请参阅如何在 PyGame 中滚动背景表面?.
如果背景沿 x 和 y 轴移动,则必须在屏幕上放置 4 个背景“tiles2”:
class Map():
def __init__(self):
self.Image = pygame.image.load("testbackground.jpg").convert()
self.Image = pygame.transform.scale(self.Image, game_window.get_size())
self.rect = self.Image.get_rect()
self.x = 0
self.y = 0
def draw(self, game_window,screenHeight,screenWidth):
self.x = player.x - screenWidth // 2
self.y = player.y - screenHeight // 2
x1 = self.x % self.Image.get_width()
x2 = x1 - self.Image.get_width()
y1 = self.y % self.Image.get_height()
y2 = y1 - self.Image.get_height()
game_window.blit(self.Image, (x1, y1))
game_window.blit(self.Image, (x2, y1))
game_window.blit(self.Image, (x1, y2))
game_window.blit(self.Image, (x2, y2))
推荐阅读
- firebase - 用于触发 Firebase Cloud Functions 的 Slack API 事件订阅
- office365 - 从 Office 365 组中删除电子邮件
- caching - 使用Vue keep-alive可以缓存多少个组件?
- r - 尝试创建一个 R Shiny 应用程序,它将抓取 Twitter 并创建一个词云
- css - HTML Email TD的堆叠
- google-cloud-platform - 无法将 POST 请求发送到 DialogFlow (404)
- c# - 重新着色 Material Design XAML Toolkit - WPF 中的各个元素
- python - 查找(并记录)numpy 数组切片的最大值
- mongodb - Meteor:对变量对象使用集合排序
- vbscript - VBS 机器人无法正常工作