게임을 만들려고 하면 많은 리소스가 필요하다.

 

PYGAME이 아무리 코딩이 쉽다하더라도 리소스는 직접 구해야 한다.

 

코딩하는 시간보다 리소스를 찾고 편집하는 작업이 더 걸릴 수도 있다. 게임은 종합예술이라서 코딩만 가지고 만들수는 있겠지만 멀티미디어 리소스없이는 한계가 있다.

 

그래서 이 포스트에서는 코드도 중요하지만 리소스를 찾는 방법에 대하여도 기록한다.

 

 

PYGAME

영상을 보면 리소스가 들어간 것은

 

- 캐릭터

- 미사일

- 배경이미지

- 배경음악

- 발사하는 사운드

 

이다. 적 캐릭터가 등장하게 되면 폭발 사운드, 이미지 등 몇가지가 더 추가될 것이다.

 

물론 지난 포스트들을 보면 도형을 캐릭터로 삼아서 게임을 만들 수도 있다. 근데 그건 느낌이 안난다. 우리가 블로그나 앱에 스킨을 입히는 것도 따지고 보면 근사하게 보이는 것 만으로도 좋은 감정을 갖게되고, 흥미가 생기기 때문이다.

 

돈을 받고 배포할 게임이 아니더라도 시간과 노력을 들여 만들거면 즐거운 쪽이 좋다. 자신이 해봤을 때 눈과 귀가 즐거운 게임은 사람들이 돈을 주고 사려고 할지도 모른다. 돈을 내지 않아도 적어도 유료광고는 보게 할 수 있다. (요즘 무료인 모바일 게임이다)

 

결국 리소스를 찾아야 한다. 이번 포스트에서는 백그라운드와 넣기와 캐릭터 리소스 등을 알아본다.

 

백그라운드 넣기

 

백그라운드 넣는 것은 기본적으로 새로운 Surface 객체에 로드한 이미지를 최상위 window에 뿌려주는 것이다. 

DISPLAYSURF = pygame.display.set_mode((640, 430))
background = pygame.image.load('nasa.png')
DISPLAYSURF.blit(background, (0, 0))

이 코드는 이렇게 모여있지 않다. display.set_mode는 초기화에 한번 실행될 것이고, background도 초기화다. (스테이지가 하나일때) blit 은 게임루프의 update 에 들어간다. 여기서는 관계를 설명하기 위해 모아놨다. 나중에 코드가 멀리 떨어져 있어도 이들의 관계는 알고 있어야 한다.

 

한가지 더 display의 모드를 640x430이면 이미지는 그보다 크거나 작을수도 있다. 메인 윈도우의 크기를 벗어나면 짤릴 것이고 그보다 작으면 스크린의 나머지 부분은 검정색이다. 백그라운드를 blit할 때 좌표를 0,0에 넣는 것은 윈도우의 크기와 맞추기 위해서이다. 배경이미지와 윈도우창의 차이가 있다면, 스크린 사이즈나 배경이미지 둘중 하나를 조절해서 크기를 맞춘다.

 

background blit

*백그라운드 이미지 리소스: 본인의 게임이 어떤 백그라운드를 쓰느냐에 달려있다. 그냥 배경사진 같은 것이면 픽사베이에서도 충분히 찾을 수 있을 것이다. 아니면 좀 더 게임 틱한 배경을 찾는 다면 아래의 사이트를 활용한다. 무료 다운로드 가능한 자료들이 있다. 무료란 것은 본인 개인의 목적으로는 사용가능한데 상업적 이용에는 CC 라이센스가 걸려있을 수 있으니 주의하자.

 

그리고 영단어 중에서 Royalty-free라는 말은 알고 있어야 한다. Royalty-fee는 무료로 구매할 수 있다는 말이 아니다. 리소스를 구매하면 저작권에 제한없이 사용가능하다는 말이다. 저작권은 우리가 알던 상식하고는 많이 다르니까 충분히 개별 저작권의 내용을 읽어보고 판단하자.

 

https://opengameart.org/

 

OpenGameArt.org

There are currently 5 users online.

opengameart.org

https://itch.io/

 

Download the latest indie games

itch.io is a simple way to find, download and distribute indie games online. Whether you're a developer looking to upload your game or just someone looking for something new to play itch.io has you covered.

itch.io

 

게임에 특화된 많은 자료가 무료로 이용가능하지만 사실 좋은 것들은 유료도 많다. 그렇다면 내가 직접 배경이미지를 만드는 것도 생각해볼 만하다. 그래픽 프로그램을 잘 못하거나 근사한 이미지가 없어도 된다. 무료 이미지 사이트에서 다운로드 받은 이미지를 활용하면 된다. 편집해서 상업적으로 사용가능한 이미지가 많다.

 

https://tactmarketing.tistory.com/3

 

무료 스톡 이미지 사이트 모음 | 상업적 사용가능 이미지,영상 | 저작권 걱정없는 자료 사이트

인터넷에서 콘텐츠를 생산하려면 항상 걸리는 것이 있다. 불펌이라는 단어는 여기서만 봐야할 콘텐츠를 누가 허락없이 저기로 가져가서 사용한다는 말이다. 불펌때문에 뭔가 경제적인 이득이 �

tactmarketing.tistory.com

포토샵 등 이미지 프로그램을 사용해서 게임화면에 맞게 확대 축소한다. 또 포토샵이 유료라 없는 사람들은 파이어알파카 같은 무료 프로그램을 사용한다. 스톡 이미지에서 받은 파일을 파이어알파카에서 열고 setdisplyDISPLAYSURF = pygame.display.set_mode((640, 430)) 여기 해상도에 맞춰준다. 640과 430은 여기의 설정이다. 자신이 만들 게임의 해상도로 바꾼다.

 

https://keunttang.tistory.com/1

 

무료 페인트 소프트웨어 리뷰 - 파이어 알파카 (FireAlpaca)

컴퓨터로 그림을 그릴려고 생각하고 있다면 첫번째로 떠오르는 것은 그림판이다. 뭐 나름 그림 자체를 그리는 것의 목적을 달성할 수 있다. 그런데 좀 더 제대로 그림을 그리고 싶은 생각이 들��

keunttang.tistory.com

그밖에 배경에 관련한 사이트는 셀수없이 많다. 아무래도 유료가 좋은 자료가 더 많다. 셔터스톡도 있고.. 그래픽 툴을 사용할 줄 아는 사람은 스톡이미지로 얼마든지 배경이미지를 만들 수 있을 것이다.

 

이도 저도 너무 복잡한 초보자라면 무료 스톡이미지의 사이즈를 줄여 가공하는 방법을 추천한다. 나중에 자신이 붙으면 유료 컨텐츠도 이용해 볼 만하다.

 

*캐릭터 이미지 로드하기

 

캐릭터의 조작방법에 대해서는 이전 포스터에 다 설명이 되어있다. 도형에 대하여 키보드를 눌렀을때의 이벤트 처리나 이미지를 입힌 캐릭터나 조작 방법은 완전히 같다. 도형을 생성하는 과정이 이미지를 입히는 것으로 대체될 뿐이다.

 

우주선

자체 제작한 우주선 캐릭터이다;; 급조해서 퀄러티가 매우 낮다. 이것을 보여준 이유는 간단한 캐릭터는 쉽게 만들 수 있다는 것을 보여주기 위해서다. 저 캐릭터는 무료 이미지 사이트에서 배경만 투명화 시키고 png로 저장하여 만들었다. 3분도 안 걸린다. 이 정도 캐주얼한 게임에 적당하다.

 

70 x 70 픽셀이다.

캐릭터의 크기를 픽셀의 크기로 결정한다. 실상 중요한 일이다. 픽셀이 늘어나면 더 크고 정교한 캐릭터가 되는 대신 리소스가 더 많이 들어갈 것이고, 적으면 그만큼 리소스가 적게 들어간다. 나중에 스프라이트까지 사용하면 용량에 큰 차이가 생긴다.

 

spaceship = pygame.image.load('spaceship.png')
DISPLAYSURF.blit(spaceship, (x, y))

fighterX = 0

로드와 그리는 일은 똑같다. 백그라운드와 마찬가지로 초기 로드할때와 blit은 분리해줘야한다. fighterX는 캐릭터의 이동을 위한 속도이다. 갤러그 같은 고전 슈팅게임이라 오른쪽과 왼쪽밖에 이동하지 못한다. 비행기의 X좌표로 사용한다.

 

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_a:
                fighterX -= 5

            elif event.key == K_d:
                fighterX += 5

방향키는 왼쪽에 a 오른쪽에 d를 할당한다. 좌표가 좌우로 5씩 이동한다.

x += fighterX
    if x < 0:
        x=0
    elif x > 640 - 70:
        x = 640 - 70

우주선캐릭터가 윈도우 화면을 빠져나가지 못하도록 막는다. 스크린 너비가 10의 배수니까 x가 -5에 도달하면 x는 0으로 바뀌고 우주선을 재자리에 그리게 된다. (왼쪽) fighter x는 왼쪽으로 누르고 있을시 -5 -> 0 으로 루프한다.

 

오른쪽 스크린의 경우 우주선의 너비인 70을 빼면 570이다. (캐릭터는 왼쪽 상단을 기준으로 오른쪽 하단을 향해 그려진다) 575에 도달하면 570으로 초기화 된다.

 

속도와 좌표

 

즉 KEYDOWN 이벤츠 처리기에서는 0에 도달한 x에게 계속 -5를 넣지만 그럴때마다 x는 0으로 돌아오고, 반대편 570에 도달하서 계속 +5를 줘도 570으로 되돌아 오는 것이다.


*캐릭터 리소스 찾기

 

캐릭터 리소스의 경우도 위의 배경이미지를 구하는 곳에서 발견할 수 있다. 아래의 자료는 무료로 다운로드 받을 수 있다. CC By 3.0 의 저작권 표시를 눈여겨 보자. 상업적 사용이 가능하다. 단 원저자에 대한 표시를 해야한다. 또한 이 저작물을 리믹스 했더라도 1차 저작물(이것)에 대한 권리를 가질 수 없다. (쉽게 말해 상업적 저작권을 보호받고 싶으면 2차 저작권을 알아서 잘 만들라는 뜻)

 

그래도 이 정도의 리소스를 무료로 사용할 수 있다는 것은 상당히 괜찮다. 직접 편집하는 수고에 비하면 아무것도 아니다.

 

opengameart.org

https://creativecommons.org/licenses/by/3.0/deed.ko

 

Creative Commons — 저작자표시 3.0 Unported — CC BY 3.0

이 콘텐츠는 기부로 운영되는 비영리 단체인 크리에이티브 커먼즈로 인해 만들어진 간단한 법적 조건에 따라 자유롭게 이용할 수 있습니다. 이 콘텐츠가 마음에 드신다면, 그리고 이 콘텐츠를 �

creativecommons.org

스켈레톤 스프라이트

https://itch.io/game-assets

 

Top game assets

Find game assets like Huge 16x16 Top-down Tileset, Heroic Asset Series: Hero Pack, Sunnyside World, Pixel Effects!, HUGE pixelart asset pack on itch.io, the indie game hosting marketplace.

itch.io

itch 잇치에도 많은 캐릭터 자료들이 있다. 스프라이트의 퀄리티가 상당히 좋다. 라이센스에 대하여도 OpenGameArt.org와 비슷하게 내용이 적혀있다. (상업적으로 허용 / 비허용 / 배포권 등 / 원저자 표시 등)

 

일본 미소녀풍의 자료도 무료로 배포하고 있다. 미연시에 제작이 가능할듯

상당히 다양한 자료가 있다. 무려 자료를 받으려고 하면 도네이션을 하라는 창이 뜨는데 그냥 No로 다운로드 받을 수 있다.

 

 No thanks just take me to the downloads 를 클릭한다. 디자이너가 마음에 들면 페이팔로 기부도 할 수 있다.

 

무료만 바라보지 말고 유료자료도 저렴하면서 좋은 것들이 많이 있다. 온라인 게임의 아이템 한번 안사면 살 수있는 것들이다. 게임의 아이템은 쓰면 사라지지만 게임 리소스는 한번 사두면 계속 쓸수 있다. 게임 제작용이기 때문에 당연히 상업용에 사용가능하다.

 

단 이 아이템을 재업로드해서 판매하는 것은 불가능하다. 리믹스(에디팅)의 범위가 어디까지 인줄은 모르겠는데 여하튼 남의 아이템을 편집해서 돈번다는 생각은 버리는게 좋다. 인터넷은 소문이 빠르기 때문에 어느 나라에서 소송이 들어올줄 모른다. 인터넷에서 리소스를 팔아 돈을 벌고 싶으면 게임이 아니라 리소스를 만들면 된다.

 

잇치의 유료 아이템(2.79 달러)

다른 웹사이트도 많지만 이 두개가 TOP 무료 사이트이기 때문에 소개를 한다. 돈이 충분하면 리소스를 많이 구입해서 프로그래밍 할 수 있을 것이다 (게임 제작도 이제는 현질인가 ㅜㅜㅜ) 하지만 먼저 무료들을 충분히 다루어 보면 게임 리소스를 보는 눈이 생기니까 처음부터 현질할 필요는 없다.

 

그리고 파이게임 프레임워크에 맞는지도 테스트 할 필요도 있다.

 

이 블로그에서 나중에 기회가 되면 Unity를 다뤄볼 것이다. Unity에서는 고퀄리티의 리소스가 상당히 많다. 주로 모바일용이 많다보니 이런 8비트 스타일의 캐릭터와는 좀 차이가 나는데 이런 저런 스타일을 비교하는 것도 자신에게 맞는 리소스를 찾는 방법일 것이다.

*컴퓨터를 업그레이드 하면 유니티를 돌릴 수 있을 것 같다.

 

이 포스트는 상업용 게임을 만드는 사람들을 위한 내용이 아니다. 일반인인데 코딩을 배우고 즐기다 보니 어쩌다 보니 파이게임까지 건드리게 된 사람들을 위한 내용에 가깝다. 주로 영어사이트를 참고하려고 노력하기때문에 혹은 교과서에 있는 내용만으로 진행이 안되는 사람들도 도움이 될 수 있다.

 

 

다음 포스트는 비슷한 주제이지만 게임내 사운드와 배경음 삽입 방법과 리소스를 찾는 방법을 다룰 예정이다.

 

*추가된 리소스 ^^

 

https://www.gameart2d.com/freebies.html

 

Free Game Assets

Collection of various completely free game assets. From 2d character sprites, platformer tileset, game GUI, and many other themes. No hidden costs, for sure.

www.gameart2d.com

 

 

아래는 처음 동영상의 소스코드이다.

import pygame, sys
from pygame.locals import *

pygame.init()
DISPLAYSURF = pygame.display.set_mode((640, 430))
rect1 = DISPLAYSURF.get_rect()
print(rect1.size)

pygame.display.set_caption('Hello World!')
background = pygame.image.load('nasa.png')
spaceship = pygame.image.load('spaceship.png')
missile = pygame.image.load('missile2.png')

soundObj = pygame.mixer.Sound('move.wav')
pygame.mixer.music.load('instinct.mp3')
pygame.mixer.music.play(0, 180.0)
import time

musicon = False
missileXY = []

clock = pygame.time.Clock()

fighterX = 0
x = 270
y = 350

print([QUIT])
while True:
    # clock.tick(60)
    pygame.time.delay(10)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_a:
                fighterX -= 5
                print(fighterX,x)

            elif event.key == K_d:
                fighterX += 5
                print(fighterX,x)

            elif event.key == K_m:
                if musicon == False:
                    pygame.mixer.music.play(0, 50.0)
                    musicon = True
                else:
                    pygame.mixer.music.stop()
                    musicon = False

            elif event.key == K_SPACE:
                missileX = x + 50/2
                missileY = y - 25
                missileXY.append([missileX,missileY])
                # soundObj.stop()
                soundObj.play()
                # time.sleep(15)

        if event.type == KEYUP:
            if event.key == K_d or event.key == K_a:
                fighterX = 0

    x += fighterX
    if x < 0:
        x=0
    elif x > 640 - 70:
        x = 640 - 70


    DISPLAYSURF.blit(background, (0,0))
    DISPLAYSURF.blit(spaceship, (x, y))

    if len(missileXY) != 0:
        for i, bxy in enumerate(missileXY):
            bxy[1] -= 2
            print(bxy[1])
            missileXY[i][1] = bxy[1]
            if bxy[1] <= 0:
                try:
                    missileXY.remove(bxy)
                except:
                    pass

    if len(missileXY) != 0:
        for bx,by in missileXY:
            DISPLAYSURF.blit(missile,(bx,by))

    pygame.display.update()

공유하기

facebook twitter kakaoTalk kakaostory naver band