#python #pygame
Вопрос:
Приношу извинения за то, что в последнее время задаю так много вопросов. Я только начинаю входить в 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("test2.png").convert()
self.rect = self.Image.get_rect()
self.x = 0
self.y = 0
def draw(self, game_window,screenHeight,screenWidth):
self.x = min(max(self.x, player.x - 2 * screenWidth / 2), player.x - screenWidth / 2)
self.y = min(max(self.y, player.y -2 * screenHeight / 2), player.y - screenHeight / 2)
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()
Спасибо
Шей
Ответ №1:
Движение игрока зависит от размера карты. Атрибуты x
и y
«игрока» сохраняют позицию на карте и ограничены размером карты ( map_size
). Игрок всегда рисуется в центре экрана, за исключением случаев, когда он находится рядом с краями карты:
class Player():
def __init__(self, x, y):
self.Image = pygame.image.load("myAvatar.png").convert()
self.x = 200
self.y = 200
def handle_keys(self, map_size):
key = pygame.key.get_pressed()
self.x = (key[K_RIGHT] - key[K_LEFT]) * 500 * time_passed
self.y = (key[K_DOWN] - key[K_UP]) * 500 * time_passed
self.x = max(0, min(map_size[0]-20, self.x))
self.y = max(0, min(map_size[1]-20, self.y))
def draw(self, game_window, map_size):
window_size = game_window.get_size()
center = window_size[0] // 2, window_size[0] // 2
pos = [self.x, self.y]
for i in range(2):
if center[i] < pos[i] <= map_size[i]-center[i]:
pos[i] = center[i]
elif pos[i] > map_size[i] - center[i]:
pos[i] = window_size[i] - map_size[i] pos[i]
game_window.blit(self.Image, (int(pos[0]), int(pos[1])))
Позиция игрока на карте находится в центре окна:
class Map():
def __init__(self):
self.Image = pygame.image.load("test2.png").convert()
def draw(self, game_window):
window_size = game_window.get_size()
map_size = self.Image.get_size()
x = max(0, min(map_size[0] - window_size[0], player.x - 200))
y = max(0, min(map_size[1] - window_size[1], player.y - 200))
game_window.blit(self.Image, (-x, -y))
Цикл применения:
leave = False
while not leave:
for event in pygame.event.get():
if event.type == pygame.QUIT:
leave = True
player.handle_keys(map.Image.get_size())
game_window.fill((0,0,0))
map.draw(game_window)
#enemy.draw(game_window)
player.draw(game_window, map.Image.get_size())
pygame.display.update()
pygame.display.flip()
time_passed = clock.tick() / 1000
pygame.quit()
Комментарии:
1. Большое вам спасибо, это чрезвычайно полезно!