본문 바로가기
개발/Python

[파이썬] 내 파이게임 애플리케이션 루프가 제대로 작동하지 않는 이유

by MinorMan 2023. 8. 12.
반응형

<질문>

저는 파이게임 문서를 훑어본 후 매우 거친 하향식 2D 어드벤처 게임을 작업하고 있습니다. 그러나 카메라 시스템에서 아무것도 찾을 수 없어서 약간의 장애물에 부딪혔고 카메라에 대한 대부분의 튜토리얼이 5년 이상 된 것이고 더 이상 작동하지 않는 것 같습니다. 아무도 내가 카메라를 만드는 데 도움을 줄 수 있습니까?

이것은 내 주요 실행 스크립트입니다

import sys, pygame
from PlayerObject import Player

pygame.init()

screen_height = 180
screen_width = 320
map_height = 1080
map_width = 1920

num_objects = 5

screen = pygame.display.set_mode((screen_width, screen_height))
player_image = pygame.image.load('models/hero.bmp').convert()
background = pygame.image.load('models/lobby.bmp').convert()
screen.blit(background, (0, 0))
objects = []

# randomly generates 5 entities with the 1st one being the controlled character
for i in range(num_objects):
    o = Player(player_image, random.randint(0, screen_width), random.randint(0, screen_height), 10)
    objects.append(o)

while 1:

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        screen.blit(background, objects[0].pos, objects[0].pos)
        objects[0].move_left()
        screen.blit(objects[0].image, objects[0].pos)
    if keys[pygame.K_RIGHT]:
        screen.blit(background, objects[0].pos, objects[0].pos)
        objects[0].move_right()
        screen.blit(objects[0].image, objects[0].pos)
    if keys[pygame.K_UP]:
        screen.blit(background, objects[0].pos, objects[0].pos)
        objects[0].move_up()
        screen.blit(objects[0].image, objects[0].pos)
    if keys[pygame.K_DOWN]:
        screen.blit(background, objects[0].pos, objects[0].pos)
        objects[0].move_down()
        screen.blit(objects[0].image, objects[0].pos)
        screen.blit(background)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    for o in objects:
        screen.blit(background, o.pos, o.pos)
    for num in range(num_objects - 1):
        objects[num + 1].rand_move()
    for o in objects:
        screen.blit(o.image, o.pos)

    pygame.display.update()
    pygame.time.delay(100)

이것은 내 플레이어 클래스입니다.

import random

map_height = 180
map_width = 320

class Player:
    def __init__(self, image, width, height, speed):
        self.speed = speed
        self.image = image
        self.pos = image.get_rect().move(width, height)
        self.image = image

    def set_speed(self, speed):
        self.speed = speed

    def rand_move(self):
        x = random.randint(-self.speed, self.speed)
        y = random.randint(-self.speed, self.speed)
        self.pos = self.pos.move(x, y)

        # keeps player in boundaries
        if self.pos.left < 0:
            self.pos.left = 0
        if self.pos.right > map_width:
            self.pos.right = map_width
        if self.pos.top < 0:
            self.pos.top = 0
        if self.pos.bottom > map_height:
            self.pos.bottom = map_height

    def move_left(self):
        speed = self.speed
        self.pos = self.pos.move(-speed, 0)
        if self.pos.left < 0:
            self.pos.left = 0

    def move_right(self):
        speed = self.speed
        self.pos = self.pos.move(speed, 0)
        if self.pos.right > map_width:
            self.pos.right = map_width

    def move_up(self):
        speed = self.speed
        self.pos = self.pos.move(0, -speed)
        if self.pos.top < 0:
            self.pos.top = 0

    def move_down(self):
        speed = self.speed
        self.pos = self.pos.move(0, speed)
        if self.pos.bottom > map_height:
            self.pos.bottom = map_height

<답변1>

당신의 기본적인 오해는 물체의 위치에 배경을 그리려고 한 다음 물체를 움직이고blit마침내 새로운 위치에 있습니다. 그 모든 것이 필요하지 않습니다.
일반적으로 전체 장면은 기본 응용 프로그램 루프의 각 프레임에 그려집니다. 전체 창에 배경을 그리는 것으로 충분하며blit그 위에 있는 각 개체. 창 표면의 변경 사항을 즉시 확인할 수 없습니다. 디스플레이가 다음에 의해 업데이트되면 변경 사항이 표시됩니다.pygame.display.update()또는pygame.display.flip():

기본 애플리케이션 루프는 다음을 수행해야 합니다.

  • 다음 중 하나를 통해 이벤트를 처리합니다.pygame.event.pump()또는pygame.event.get().
  • 입력 이벤트 및 시간(각 프레임)에 따라 개체의 게임 상태 및 위치를 업데이트합니다.
  • 전체 디스플레이를 지우거나 배경을 그립니다.
  • 전체 장면을 그립니다(blit모든 객체)
  • 다음 중 하나로 디스플레이를 업데이트합니다.pygame.display.update()또는pygame.display.flip()

예:

while 1:

    # handle events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    # update objects (depends on input events and frames)
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        objects[0].move_left()    
    if keys[pygame.K_RIGHT]:
        objects[0].move_right()
    if keys[pygame.K_UP]:
        objects[0].move_up()
    if keys[pygame.K_DOWN]:
        objects[0].move_down()

    for num in range(num_objects - 1):
        objects[num + 1].rand_move()

    # draw background
    screen.blit(background, (0, 0))

    # draw scene
    for o in objects:
        screen.blit(o.image, o.pos)

    # update dispaly
    pygame.display.update()
    pygame.time.delay(100)

최소한의 예:repl.it/@Rabbid76/PyGame-MinimalApplicationLoop

728x90

댓글