[PYGAME] Pirate Mario - 1

문승환·2022년 8월 10일
0

[PYGAME]

목록 보기
2/8

프로젝트 개요

  • pygame을 사용하여 Pirate Mario제작
  • Youtube Clear Code의 Platformer in Pygame을 따라하며 진행
  • 주요 과제: 게임 실행을 위한 기본적인 세팅을 완성하고 맵과 플레이어를 화면에 출력

프로젝트 내용

Default Settings

main.py

import pygame
from sys import exit

pygame.init()

screen = pygame.display.set_mode((1200, 700))
clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    pygame.display.update()
    clock.tick(60)
  • 게임에서 진행할 모든 이벤트를 처리하기 위해 메인 모듈을 먼저 설계

settings.py

level_map = [
'                            ',
'                            ',
'                            ',
' XX    XXX            XX    ',
' XX P                       ',
' XXXX         XX         XX ',
' XXXX       XX              ',
' XX    X  XXXX    XX  XX    ',
'       X  XXXX    XX  XXX   ',
'    XXXX  XXXXXX  XX  XXXX  ',
'XXXXXXXX  XXXXXX  XX  XXXX  ']

tile_size = 64
screen_width = 1200
screen_height = len(level_map) * tile_size
  • 플레이어, 적, 구조물 등이 배치될 level을 먼저 저장
  • 벽 또는 장애물이 있을 경우 'X' 표시
  • 'X' 표시가 된 인덱스에 대해 tile이라 칭하고 그 크기를 64로 고정 (플레이어의 경우 'P' 표시)
  • screen의 너비 = 1200, 높이 = level_map의 크기 * tile의 크기로 고정

tiles.py

import pygame

class Tile(pygame.sprite.Sprite):
    def __init__(self, size, pos):
        super().__init__()
        self.image = pygame.Surface((size, size))
        self.image.fill('grey')
        self.rect = self.image.get_rect(topleft = pos)
  • 크기와 위치를 입력받아 타일을 생성해주는 sprite class

player.py

import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, pos):
        super().__init__()
        self.image = pygame.Surface((32, 64))
        self.image.fill('red')
        self.rect = self.image.get_rect(topleft = pos)
  • 위치를 입력받아 플레이어를 생성해주는 sprite class

level.py

import pygame
from settings import tile_size
from tiles import Tile
from player import Player

class Level:
    def __init__(self, level_data, surface):
        super().__init__()
        self.display_surface = surface
        self.setup_level(level_data)

    def setup_level(self, level_data):
        self.tiles = pygame.sprite.Group()              # a container class to hold and manage multiple sprite objects
                                                        # there are tiles
        self.player = pygame.sprite.GroupSingle()       # group container that holds a single sprite
                                                        # there is just one player

        for row_index, row in enumerate(level_data):
            for col_index, cell in enumerate(row):

                x = col_index * tile_size
                y = row_index * tile_size

                if cell == 'X':
                    tile = Tile(tile_size, (x, y))
                    self.tiles.add(tile)        # add sprites to this group

                elif cell == 'P':
                    player = Player((x, y))
                    self.player.add(player)     # add a single sprite to this group

    def run(self):
        self.tiles.draw(self.display_surface)
        self.player.draw(self.display_surface)
  • settings, tiles, player 모듈을 불러와 sprite들을 생성하고 level_map에 따라 level을 화면에 출력하도록 하는 sprite class

Basic setup using default settings

main.py

import pygame
from sys import exit
from settings import *
from level import Level

pygame.init()

screen = pygame.display.set_mode((1200, 700))
clock = pygame.time.Clock()

level = Level(level_map, screen)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    level.run()

    pygame.display.update()
    clock.tick(60)

KEEP

  • main.py의 default setting을 혼자 작성

PROBLEM

  • 여러가지 모듈을 만들고 호출하는 과정에서 상당히 복잡함을 느꼈고 class의 상속을 통해 다른 모듈에서 instance, method를 사용하는 것이 미숙했음
  • level_map의 원소를 받아들여 화면에 출력하는 부분에서 이해하는 데에 다소 걸림

TRY

  • class의 사용과 상속에 대해 다시 공부하고 코드 복기
  • 알고리즘 작성 연습
profile
아직 모자란 수학과생

0개의 댓글