#python #pygame
#python #pygame
Вопрос:
Я хочу заставить программу работать так, чтобы, когда спрайт достиг выхода из лабиринта (-15 и 780), экран переключался на следующий лабиринт в массиве комнат [].
Я попытался интегрировать средство проверки положения, используя уже существующий self.pos, хотя это, похоже, не работает. Я также добавил 4 лабиринта в массив с именем rooms
import pygame
pos = (0,0)
class Player(pygame.sprite.Sprite):
def __init__(self, image, pos, background):
super().__init__()
self.image = image
self.pos = pygame.Vector2(pos)
self.rect = self.image.get_rect(center=self.pos)
self.background = background
def update(self, events, dt):
pressed = pygame.key.get_pressed()
move = pygame.Vector2((0, 0))
if pressed[pygame.K_w]: move = (0, -1)
if pressed[pygame.K_a]: move = (-1, 0)
if pressed[pygame.K_s]: move = (0, 1)
if pressed[pygame.K_d]: move = (1, 0)
#if move.length() > 0: move.normalise_ip()
new_pos = self.pos move*(dt/5)
new_rect = self.rect.copy()
new_rect.center = new_pos
new_rect.clamp_ip(self.background.get_rect())
new_pos = new_rect.center
hit_box = self.background.subsurface(new_rect)
for x in range(new_rect.width):
for y in range(new_rect.height):
if sum(hit_box.get_at((x, y))) < 500:
return
self.pos = new_pos
self.rect.center = self.pos
global pos
pos = self.pos
# Scenes
def room1():
background = (pygame.image.load('maze1.jpg'))
background = pygame.transform.rotate(background, -90)
background = pygame.transform.scale(background, (800,600))
def room2():
background = (pygame.image.load('maze2.jpg'))
background = pygame.transform.rotate(background, -90)
background = pygame.transform.scale(background, (800,600))
def room3():
background = (pygame.image.load('maze3.jpg'))
background = pygame.transform.rotate(background, -90)
background = pygame.transform.scale(background, (800,600))
def room4():
background = (pygame.image.load('maze4.jpg'))
background = pygame.transform.rotate(background, -90)
background = pygame.transform.scale(background, (800,600))
def main():
pygame.init()
screen = pygame.display.set_mode((800, 600))
screen_rect = screen.get_rect()
clock = pygame.time.Clock()
sprites = pygame.sprite.Group()
rooms = []
room = room1()
rooms.append(room)
room = room2()
rooms.append(room)
room = room3()
rooms.append(room)
room = room4()
rooms.append(room)
current_room_no = 0
current_room = rooms[current_room_no]
dt = 0
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
if pos < -15:
if current_room_no == 0:
current_room_no = 2
current_room = rooms[current_room_no]
pos = 790
elif current_room_no == 2:
current_room_no = 1
current_room = rooms[current_room_no]
pos = 790
else:
current_room_no = 0
current_room = rooms[current_room_no]
pos = 790
if pos > 801:
if current_room_no == 0:
current_room_no = 1
current_room = rooms[current_room_no]
pos = 0
elif current_room_no == 1:
current_room_no = 2
current_room = rooms[current_room_no]
pos = 0
else:
current_room_no = 0
current_room = rooms[current_room_no]
pos = 0
pimg = pygame.Surface((10, 10))
pimg.fill((200, 20, 20))
sprites.add(Player(pimg, (50, 50), background))
sprites.update(events, dt)
screen.fill(pygame.Color('grey'))
screen.blit(background, (0, 0))
sprites.draw(screen)
pygame.display.flip()
dt = clock.tick(60)
if __name__ == '__main__':
main()
Я надеюсь, что кто-нибудь может помочь мне интегрировать функцию смены экрана, поскольку в настоящее время код выдает ошибку о том, что pos не является переменной и / или pos вызывается после ее необходимости, но, как вы можете видеть, я четко вызываю переменную pos в начале кода как глобальную переменную.
Изображения: https://imgur.com/a/AgN5uJa
Ответ №1:
Для того, чтобы использовать pos
, вам нужно указать global pos
в начале main
. В целом использование глобальных переменных не является хорошей практикой, попробуйте провести рефакторинг вашего кода, чтобы иметь pos
внутри функции. Я обеспокоен тем, что вы пытаетесь сравнить tuple
с int
. Это также приведет к ошибке.
Я взял на себя смелость немного изменить ваш код.
- Я использовал
player.pos
для отслеживания положения спрайта проигрывателя - Я инициализировал
player
только один раз для каждой комнаты, потому что игрок появлялся несколько раз, когда в игре происходили события - Я удалил
room
функции, поскольку вы делали что-то вродеrooms.append(room())
, вы в основном добавляли результатroom
функций, который был в основномNone
. Я не совсем понял, почему вы хотели это сделать - загруженный фон также один раз, не имеет смысла воссоздавать фоновую поверхность при каждой перерисовке
- изменено начальное положение игрока, чтобы оно соответствовало входу в лабиринт
- обнаруженная позиция выхода игрока, может быть изменена
Полный код:
import pygame
class Player(pygame.sprite.Sprite):
def __init__(self, image, pos, background):
super().__init__()
self.image = image
self.pos = pygame.Vector2(pos)
self.rect = self.image.get_rect(center=self.pos)
self.background = background
def update(self, events, dt):
pressed = pygame.key.get_pressed()
move = pygame.Vector2((0, 0))
if pressed[pygame.K_w]: move = (0, -1)
if pressed[pygame.K_a]: move = (-1, 0)
if pressed[pygame.K_s]: move = (0, 1)
if pressed[pygame.K_d]: move = (1, 0)
#if move.length() > 0: move.normalise_ip()
new_pos = self.pos move*(dt/5)
new_rect = self.rect.copy()
new_rect.center = new_pos
new_rect.clamp_ip(self.background.get_rect())
new_pos = new_rect.center
hit_box = self.background.subsurface(new_rect)
for x in range(new_rect.width):
for y in range(new_rect.height):
if sum(hit_box.get_at((x, y))) < 500:
return
self.pos = new_pos
self.rect.center = self.pos
pos = self.pos
# Scenes
def load_background(filename):
background = (pygame.image.load(filename))
background = pygame.transform.rotate(background, -90)
background = pygame.transform.scale(background, (800,600))
return background
def load_player(background):
pimg = pygame.Surface((10, 10))
pimg.fill((200, 20, 20))
return Player(pimg, (25, 325), background)
def main():
pygame.init()
screen = pygame.display.set_mode((800, 600))
screen_rect = screen.get_rect()
clock = pygame.time.Clock()
sprites = pygame.sprite.Group()
mazes = [
"maze1.jpg",
"maze2.jpg",
"maze3.jpg",
"maze4.jpg",
]
mazes_len = len(mazes)
player = None
initialized = False
current_maze = None
dt = 0
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
if not initialized:
current_maze = 0
background = load_background(mazes[current_maze])
player = load_player(background)
sprites.add(player)
initialized = True
player_x = player.pos[0]
player_y = player.pos[1]
if player_x >= 780 and 275 < player_y < 375:
current_maze = 1
# reset to first maze if all mazes were done
if current_maze >= mazes_len:
current_maze = 0
background = load_background(mazes[current_maze])
sprites.empty()
player = load_player(background)
sprites.add(player)
sprites.update(events, dt)
screen.fill(pygame.Color('grey'))
screen.blit(background, (0, 0))
sprites.draw(screen)
pygame.display.flip()
dt = clock.tick(60)
if __name__ == '__main__':
main()
Комментарии:
1. Да, только что получил эту точную ошибку, как я мог это исправить
2. Я хочу восстановить положение спрайтов, но не знаю, как это сделать tbh
3. @KallumHancox , не могли бы вы загрузить изображения лабиринта? Я хочу поместить их и играть
4. добавлены изображения, приятель
5. @KallumHancox ага. смотрю на это.