본문 바로가기
개발일지/게임

게임개발일지 #2 - 파이썬으로 뱀서류 게임 만들어보기(feat.Pygame)

by Jay Anderson 2025. 5. 30.

 

↓ 지난 포스팅 ↓

 

게임개발일지 #1 - 파이썬으로 뱀서류 게임 만들어보기(feat.Pygame)

문득뱀파이어서바이벌 스러운 게임을 만들고 싶어짐 별 계획없이 무턱대고 시작해봄먼저 메모장에 텍스트로 만들고 싶은 게임에 대해 간단히 기술.(어떤형태의 맵인지, Enemies의 스폰 방식은 어

andersonlab.tistory.com

 

지난시간에는 시커먼 맵과 동그란 초록색의 원형 캐릭터를 만들어봄.

이번엔 맵을 한번 깔아보겠음.

 

 

 

 

대충 일러스트레이터+포토샵으로 아무렇게나 맵 작업ㅋㅋㅋㅋㅋ

 

 

 

import pygame
import sys
import random

# 초기화
pygame.init()

# 타일 이미지 리스트 만들기
tile_images = [
    pygame.image.load("assets/bg_01.jpg").convert(),
    pygame.image.load("assets/bg_02.jpg").convert(),
    pygame.image.load("assets/bg_03.jpg").convert(),
    pygame.image.load("assets/bg_04.jpg").convert(),
    pygame.image.load("assets/bg_05.jpg").convert(),
    pygame.image.load("assets/bg_06.jpg").convert(),
]

# 타일 크기 맞춰 조정
tile_images = [pygame.transform.scale(img, (TILE_SIZE, TILE_SIZE)) for img in tile_images]

# 월드 타일 맵 생성 (64x64 타일 맵 생성 예시)
WORLD_TILES = 64
tile_map = [[random.choice(tile_images) for _ in range(WORLD_TILES)] for _ in range(WORLD_TILES)]

# 월드 좌표 기준 타일 시작 위치
start_tile_x = (world_x // TILE_SIZE) - 1
start_tile_y = (world_y // TILE_SIZE) - 1

for tx in range(start_tile_x, start_tile_x + (SCREEN_WIDTH // TILE_SIZE) + 3):
    for ty in range(start_tile_y, start_tile_y + (SCREEN_HEIGHT // TILE_SIZE) + 3):
        # world 좌표 기준으로 실제 화면 위치 계산
        screen_x = (tx * TILE_SIZE) - world_x
        screen_y = (ty * TILE_SIZE) - world_y

        # 맵 범위 안이면 타일 그리기
        if 0 <= tx < WORLD_TILES and 0 <= ty < WORLD_TILES:
            tile = tile_map[ty][tx]
            screen.blit(tile, (screen_x, screen_y))

# 해상도 설정 (모바일 기준)
SCREEN_WIDTH = 540
SCREEN_HEIGHT = 960
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Game Project - Jay")

# 색상 정의
GREEN = (0, 255, 0)   # 플레이어
BLACK = (0, 0, 0)     # 배경
GRAY = (70, 70, 70)

# 타일 크기
TILE_SIZE = 250

# 플레이어 설정
PLAYER_RADIUS = 20
player_pos = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)  # 중앙 고정

# 월드 좌표 오프셋 (맵 이동용)
world_x = 0
world_y = 0
speed = 5

# FPS 설정
clock = pygame.time.Clock()
FPS = 60

# 게임 루프
running = True
while running:
    clock.tick(FPS)
    keys = pygame.key.get_pressed()

    # 입력 처리 - 맵이 반대로 움직임
    if keys[pygame.K_w]:
        world_y += speed
    if keys[pygame.K_s]:
        world_y -= speed
    if keys[pygame.K_a]:
        world_x += speed
    if keys[pygame.K_d]:
        world_x -= speed
    
    # 이벤트 처리
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 화면 초기화
    screen.fill(BLACK)

    # 플레이어 그리기
    pygame.draw.circle(screen, GREEN, player_pos, PLAYER_RADIUS)

    # 화면 업데이트
    pygame.display.flip()

# 종료 처리
pygame.quit()
sys.exit()

 

맵 이미지 넣는 코드는 더 간결하게 할 수 있긴한데

일단 테스트하느라 유지보수때문에 대충 저렇게 함

그런데...?

 

 

File "C:\~~~\~~~\Desktop\game-python\main.py", line 10, in <module>
    pygame.image.load("assets/bg_01.jpg").convert(),
pygame.error: No video mode has been set

 

오류가 난다.

왜 이럴까...?

 

"pygame.error: No video mode has been set"

 

pygame.image.load(...).convert() 전에 디스플레이가 설정되지 않은 것이었다...

디스플레이 설정을 더 위로 해주자.

 

하는 김에 전체적으로 조금 바꿔야겠음.

 

import pygame
import sys
import random

# 초기화
pygame.init()


# 해상도 설정 (모바일 기준)
SCREEN_WIDTH = 540
SCREEN_HEIGHT = 960
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Game Project - Jay")

# 색상 정의
GREEN = (0, 255, 0)
BLACK = (0, 0, 0)

# 타일 크기
TILE_SIZE = 250

# 맵 타일 개수 (64x64 크기)
WORLD_TILES = 64

# 플레이어 설정
PLAYER_RADIUS = 20
player_pos = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)

# 월드 오프셋 (화면 기준 맵의 위치를 바꾸는 좌표)
world_x = 0
world_y = 0
speed = 5

# 타일 이미지 불러오기 및 리사이즈
tile_images = [
    pygame.image.load("assets/tiles/bg_01.jpg").convert(),
    pygame.image.load("assets/tiles/bg_02.jpg").convert(),
    pygame.image.load("assets/tiles/bg_03.jpg").convert(),
    pygame.image.load("assets/tiles/bg_04.jpg").convert(),
    pygame.image.load("assets/tiles/bg_05.jpg").convert(),
    pygame.image.load("assets/tiles/bg_06.jpg").convert(),
]
tile_images = [pygame.transform.scale(img, (TILE_SIZE, TILE_SIZE)) for img in tile_images]

# 랜덤 타일 맵 생성
tile_map = [[random.choice(tile_images) for _ in range(WORLD_TILES)] for _ in range(WORLD_TILES)]


# 플레이어 설정
PLAYER_RADIUS = 20
player_pos = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)  # 중앙 고정

# 월드 좌표 오프셋 (맵 이동용)
world_x = 0
world_y = 0
speed = 5

# FPS 설정
clock = pygame.time.Clock()
FPS = 60

# 게임 루프
running = True
while running:
    clock.tick(FPS)
    keys = pygame.key.get_pressed()

    # 입력 처리 - 맵이 반대로 움직임
    if keys[pygame.K_w]:
        world_y += speed
    if keys[pygame.K_s]:
        world_y -= speed
    if keys[pygame.K_a]:
        world_x += speed
    if keys[pygame.K_d]:
        world_x -= speed
    
    # 이벤트 처리
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 화면 초기화
    screen.fill(BLACK)

    # 타일 그리기
    start_tile_x = (world_x // TILE_SIZE) - 1
    start_tile_y = (world_y // TILE_SIZE) - 1

    for tx in range(start_tile_x, start_tile_x + (SCREEN_WIDTH // TILE_SIZE) + 3):
        for ty in range(start_tile_y, start_tile_y + (SCREEN_HEIGHT // TILE_SIZE) + 3):
            screen_x = (tx * TILE_SIZE) - world_x
            screen_y = (ty * TILE_SIZE) - world_y
            if 0 <= tx < WORLD_TILES and 0 <= ty < WORLD_TILES:
                tile = tile_map[ty][tx]
                screen.blit(tile, (screen_x, screen_y))

    # 플레이어 그리기
    pygame.draw.circle(screen, GREEN, player_pos, PLAYER_RADIUS)

    # 화면 업데이트
    pygame.display.flip()

# 종료 처리
pygame.quit()
sys.exit()

 

 

실행해보자.

 

 

 

 

오 맵은 잘 나온다

근데 문제가...

일단,  wasd 방향키가 반대로 인식됨

그리고, 위로 올라가면 검은 영역이 나옴

 

화면 초기화 코드

screen.fill(BLACK) 때문인가보다

굳이 필요없는 소스같음

 

다음시간엔 오류 잡고 캐릭터를 디자인해 얹어보겠음

TOP

Designed by AndersonLab