로그인

검색

MoA
조회 수 1243 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄 첨부

배경 그리기

이제 배경을 그려보자. 먼저 while 1: 루프 전에 이미지를 불러와야 한다.

 

grass = pygame.image.load("resources/images/grass.png")
castle = pygame.image.load("resources/images/castle.png")

잔디와 성을 불러왔다. 다음은 잔디와 성을 그릴 차례다. 배경이 뒤에 와야 하므로 플레이어가 그려지는 6번 코드 전에 배경을 그리자.

 

# 잔디를 그린다.
    for x in range( int(width/grass.get_width()) + 1):
        for y in range( int(height/grass.get_height()) + 1):
            screen.blit(grass,(x*100,y*100))

    # 성을 배치
    screen.blit(castle,(0,30))
    screen.blit(castle,(0,135))
    screen.blit(castle,(0,240))
    screen.blit(castle,(0,345 ))

잔디 그리는 코드에서 width/grass.get_width() 부분을 보자. width는 코드의 맨 처음 부분에서 640으로 정했다. grass는 잔디 이미지이고 grass.get_width()는 잔디 이미지의 가로 크기를 알고 싶을 때 쓰는 것이다. 잔디 이미지 크기는 100x100이다. 그러므로 width/grass.get_width() = 640 / 100이다. 이 결과는 int ()함수를 통해 정수로 바뀌어 내림 후 6이 된다. 즉 맨 처음의 for문은 다음과 같이 된다.

 

for  in range(7):

range(7)는 0 ~ 6 범위를 나타낸다. 마지막 숫자는 제외됨에 유의하자. for문이 중첩되어 있으므로 7 x 7 개의 이미지를 그리게 된다.

 

draw image.png

 

Bunny 움직이게 하기

다음으로 Bunny를 움직여 보자. 먼저 Bunny의 위치를 실시간으로 업데이트하고 관리하기 위해 변수를 만들자. 그리고 키 입력을 체크하는 변수를 만들자. 게임 초기화 다음 부분에 변수를 선언하자.

 

# 키 입력 체크
keys = [False, False, False, False]

# 플레이어 위치
playerpos=[100,100]

keys, playerpos 변수 모두 리스트 형태로 선언하였다. 리스트는 배열처럼 여러 변수를 한 번에 저장할 수 있다. 그렇지만 리스트는 배열보다 더 뛰어나다. 자세한 설명은 다른 파이썬 강좌를 참고하고 여기에서는 이것이 리스트라는 것만 알아두자. keys 변수의 각각의 항목은 w, a, s, d 키가 눌렸는지 안눌렸는지를 체크한다. 처음에는 안눌러져 있는 것으로 설정하였다. 플레이어 위치는 (100, 100)으로 설정하였다.

위치를 나타내는 변수를 만들었으므로 플레이어를 그리는 부분을 아래와 같이 바꾸자.

 

screen.blit(player, playerpos)

이제 playerpos 변수 값을 바꾸면 플레이어 위치를 바꿀 수 있게 되었다. playerpos 변수는 당연히 키입력을 통해 바꾼다. 코드의 맨 아랫부분에 다음 코드를 추가하자. 이벤트를 체크하는 부분이므로 if 문은 if event.type==pygame.QUIT: 문과 같은 수준으로 들여쓰기를 해야한다.

 

        # 키를 누르면
        if event.type == pygame.KEYDOWN:
            if event.key==K_w:
                keys[0]=True
            elif event.key==K_a:
                keys[1]=True
            elif event.key==K_s:
                keys[2]=True
            elif event.key==K_d:
                keys[3]=True
        # 키를 떼면
        if event.type == pygame.KEYUP:
            if event.key==pygame.K_w:
                keys[0]=False
            elif event.key==pygame.K_a:
                keys[1]=False
            elif event.key==pygame.K_s:
                keys[2]=False
            elif event.key==pygame.K_d:
                keys[3]=False

키를 누르는 동안은 keys 변수의 각 항목을 True로 바꾸었고 키를 떼는 순간 이를 False로 바꾸었다. 이렇게 하면 키를 누르고 있는 동안 플레이어를 계속 움직이게 하고 키를 떼면 플레이어를 멈추게 하는 동작을 할 수 있다.

마지막으로 플레이어를 움직이게 하자. 이벤트를 처리하는 부분이 아니라 상태를 업데이트 하는 부분이므로 for event in pygame.event.get(): 구문과 같은 수준으로 들여쓰기를 해야한다. 그리고 키를 입력하고 나서 상태를 업데이트 하는 것이므로 맨 마지막에 아래 코드를 입력한다.

 

    # 9 - 플레이어를 움직인다.
    if keys[0]:
        playerpos[1]-=5
    elif keys[2]:
        playerpos[1]+=5
    if keys[1]:
        playerpos[0]-=5
    elif keys[3]:
        playerpos[0]+=5

움직임이 너무 빠른가? 프레임 레이트를 고정시켜서 움직임을 좀 더 느리게 하자. screen 변수 선언 다음 부분에 아래 코드를 입력하자.

 

FPS = 60 # frames per second setting
fpsClock = pygame.time.Clock()

그리고 화면을 업데이트하는 7번 코드 바로 아래에 fps 설정을 하는 코드를 추가하자.

 

fpsClock.tick(FPS)

이렇게 한 후 코드를 실행하면 플레이어가 좀 더 느려진 걸 확인할 수 있다.

 

지금가지 완성된 코드는 맨 위의 첨부 파일을 참고

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Tool/etc Programming 게시판 관련 2 MoA 2014.11.01 5317
168 Tool/etc Redmine 설치 MoA 2013.07.28 947
167 API/MFC unsigned char <-> 유니코드(unicode) 및, string 변환 매크로 - USES_CONVERSION MoA 2013.07.28 2336
166 C/C++ memset vs for 초기화. 속도 차이가 얼마나 날까? 2 MoA 2013.07.28 1547
165 C/C++ fopen 함수가 Multi Thread 에서 안전한가? MoA 2013.07.28 1418
164 API/MFC __cdecl , __pascal, __stdcall MoA 2013.07.28 1270
163 Tool/etc 컨텍스트 스위칭 (Context Switching) MoA 2013.07.28 1800
162 API/MFC HWND와 HINSTANCE MoA 2013.07.28 1237
161 Library pthread MoA 2013.07.28 727
160 STL/Boost 정적 배열과 STL vector 속도 비교 MoA 2013.07.28 1250
159 Tool/etc 에디트 플러스, VS 2008 컴파일 환경 설정 MoA 2013.07.28 758
158 Library ChartFX 7.0 MFC에서 사용하기 MoA 2013.07.28 1134
157 Tool/etc Coding conventions MoA 2013.07.28 1501
156 Site GOF 디자인패턴 정리 MoA 2013.07.28 800
155 Tool/etc Design Patterns Quick Reference MoA 2013.07.28 850
154 Tool/etc 예외 처리 가이드 (Slide) MoA 2013.07.28 803
153 API/MFC Legacy MFC 어플리케이션을 MFC feature pack으로 포팅 MoA 2013.07.30 999
152 JAVA/Android XML 파싱하기 MoA 2013.08.06 7346
151 API/MFC 리스트 컨트롤에 체크박스 추가 MoA 2013.08.14 2178
150 Tool/etc 앱 디자인의 발견 - 메모 서비스를 생각하다 MoA 2013.08.17 863
149 C/C++ C++11 A cheat sheet MoA 2013.08.21 878
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 ... 15 Next
/ 15