如何解决如何使用 pygame.transform.scale 调整图像大小?
得到了一些代码,并难倒了一个问题: 如何使用 pygame.transform.scale 调整图像大小? 看了文档,还是看不懂。 我对 player.py 部分感到困惑。
这是我的代码:
elve.py:
import pygame
import config
from game_state import GameState
from game import Game
pygame.init()
screen = pygame.display.set_mode((config.SCREEN_WIDTH,config.SCREEN_HEIGHT))
pygame.display.set_caption("Elves")
clock = pygame.time.Clock()
game = Game(screen)
game.set_up()
while game.game_state == GameState.RUNNING:
clock.tick(50)
game.update()
pygame.display.flip()
game.py:
import pygame
import config
import math
from player import Player
from game_state import GameState
class Game:
def __init__(self,screen):
self.screen = screen
self.objects = []
self.game_state = GameState.NONE
self.map = []
self.camera = [0,0]
def set_up(self):
player = Player(1,1)
self.player = player
self.objects.append(player)
self.game_state = GameState.RUNNING
self.load_map('01')
def update(self):
self.screen.fill(config.BLACK)
self.handle_events()
self.render_map(self.screen)
for object in self.objects:
object.render(self.screen,self.camera)
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.game_state = GameState.ENDED
# handle key events
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
self.game_state = GameState.ENDED
elif event.key == pygame.K_UP: # up
self.move_unit(self.player,[0,-1])
elif event.key == pygame.K_DOWN: # down
self.move_unit(self.player,1])
elif event.key == pygame.K_LEFT: # left
self.move_unit(self.player,[-1,0])
elif event.key == pygame.K_RIGHT: # right
self.move_unit(self.player,[1,0])
def load_map(self,file_name):
with open('maps/' + file_name + '.txt') as map_file:
for line in map_file:
tiles = []
for i in range(0,len(line) - 1,2):
tiles.append(line[i])
self.map.append(tiles)
print(self.map)
def render_map(self,screen):
self.determine_camera()
y_pos = 0
for line in self.map:
x_pos = 0
for tile in line:
image = map_tile_images[tile]
rect = pygame.Rect(x_pos * config.SCALE,y_pos * config.SCALE - (self.camera[1] * config.SCALE),config.SCALE,config.SCALE)
screen.blit(image,rect)
x_pos = x_pos + 1
y_pos = y_pos + 1
def move_unit(self,unit,position_change):
new_position = [unit.position[0] + position_change[0],unit.position[1] + position_change[1]]
try:
if self.map[new_position[1]][new_position[0]] == '':
return
except IndexError:
return
if new_position[0] < 0 or new_position[0] > (len(self.map[0]) - 1):
return
if new_position[1] < 0 or new_position[1] > (len(self.map) - 1):
return
if self.map[new_position[1]][new_position[0]] == 'W':
return
if self.map[new_position[1]][new_position[0]] == '0':
return
if self.map[new_position[1]][new_position[0]] == 'T':
return
unit.update_position(new_position)
def determine_camera(self):
max_y_position = len(self.map) - config.SCREEN_HEIGHT / config.SCALE
y_position = self.player.position[1] - math.ceil(round(config.SCREEN_HEIGHT / config.SCALE / 2))
if y_position <= max_y_position and y_position >= 0:
self.camera[1] = y_position
elif y_position < 0:
self.camera[1] = 0
else:
self.camera[1] = max_y_position
map_tile_images = {
"G": pygame.transform.scale(pygame.image.load('imgs/grass.png'),(config.SCALE,config.SCALE)),"W": pygame.transform.scale(pygame.image.load('imgs/water.png'),"0": pygame.transform.scale(pygame.image.load('imgs/none.png'),"T": pygame.transform.scale(pygame.image.load('imgs/tree1.png'),}
player.py:
import pygame
import config
screen = pygame.display.set_mode((config.SCREEN_WIDTH,config.SCREEN_HEIGHT))
class Player:
def __init__(self,x_postition,y_position):
self.load_image = pygame.image.load('imgs/stepped_on_grass.png')
self.position = [x_postition,y_position]
self.image = pygame.image.load('imgs/goblin.png')
self.image = pygame.transform.scale(self.image,config.SCALE))
self.rect = pygame.Rect(self.position[0] * config.SCALE,self.position[1] * config.SCALE,config.SCALE)
def update(self):
pass
def update_position(self,new_position):
self.position[0] = new_position[0]
self.position[1] = new_position[1]
img = pygame.Surface.blit(screen,self.load_image,(self.position[0],self.position[1]))
pygame.transform.scale(screen,config.SCALE))
def render(self,screen,camera):
self.rect = pygame.Rect(self.position[0] * config.SCALE,self.position[1] * config.SCALE - (camera[1] * config.SCALE),config.SCALE)
screen.blit(self.image,self.rect)
gamestate.py
from enum import Enum
class GameState(Enum):
NONE = 0,RUNNING = 1,ENDED = 2
config.py:
# colours
BLACK = (0,0)
WHITE = (255,255,255)
SCALE = 32
SCREEN_HEIGHT = 480
SCREEN_WIDTH = 640
好吧,我知道您不需要所有其他文件,但以防万一,对吗? 当我上下移动地精时,我没有看到地面发生变化。
编辑: 问题是:如何使用 pygame.transform.scale 调整图像大小? 我想要玩家站在的瓷砖上切换图像。 它没有。 没有错误。只是个bug。
解决方法
在不知道更多您真正需要什么的情况下,尝试一下,因为它对我来说效果很好。
pygame.transform.scale(pygame.image.load(os.path.join('assets','image.png')),((x,y))).convert_alpha(),
使用您要缩放的图像更新“image.png”。同时使用所需的维度更新“x”和“y”。
将您的图片放在资产文件夹中
,要获得“踩踏”效果,您必须更改地图的内容。对踩到的草使用新字母(例如“S”)(stepped_on_grass.png
):
map_tile_images = {
"G": pygame.transform.scale(pygame.image.load('imgs/grass.png'),(SCALE,SCALE)),"W": pygame.transform.scale(pygame.image.load('imgs/water.png'),"0": pygame.transform.scale(pygame.image.load('imgs/none.png'),"T": pygame.transform.scale(pygame.image.load('imgs/tree1.png'),"S": pygame.transform.scale(pygame.image.load('imgs/stepped_on_grass.png'),}
将 map
传递给 Player.update_position
方法:
class Game:
# [...]
def move_unit(self,unit,position_change):
# [...]
unit.update_position(new_position,self.map)
更改Player.update_position
中地图的内容:
class Player:
# [...]
def update_position(self,new_position,map):
game.map[self.position [1]][self.position [0]] = 'S'
self.position = new_position
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。