Pygame

[Pygame(파이게임)] 캐릭터와 맵 적용

namu999 2025. 5. 15. 15:06
728x90

앞선 글에서 보여준 그림판을 이용하여 게임에서 움직을 캐릭터를 만들었다

각 행동에 따라 캐릭터의 모습이 달라져야 자연스럽기 때문에,

"기본", "점프", "걷기1", "걷기2" 그리고 "눈 감기1", "눈 감기 2" 총 6개의 그림을 그렸다.

보통 걷거나 점프만 판단하지만, 눈 감기 모션은 추가적으로 넣어보았다.


우선 적용을 위해, 위 그림의 데이터 형태가 어떻게 되어 있는지 설명 할 필요가 있다.

 

파이게임에서는 "색상"을 RGB(Red,Green,Blue) 코드으로 표현한다.

숫자범위는 0부터 255까지로..

R에서 256가지, G에서 256가지, B에서 256가지로 16777216가지의 색상을 구현할 수 있다는 의미이다!!

 

돌아와서, 위 그림의 데이터는 R에대한 정보, G에 대한 정보, B에 대한 정보가 행렬로 각각 따로 저장되어 있다.

따로 저장이 되어도 겹치면 겹친 색의 강도에따라 다른 색이 되는 것이다.

즉, 이 그림의 예시로 오른쪽 무지개?를 만들기 위해서는 R행렬에서 "ㄴ" 자리에 255를 각각 저장해야 한다.


이제 적용을 해보자.

각 그림은 캐릭터의 "상태"에 따라 변한다.

    row,column = 20,30
    if the_player.JUMPING: #점프 중일때
        maked_character_R = c_RR[20:40,:30]
        maked_character_G = c_GG[20:40,:30]
        maked_character_B = c_BB[20:40,:30]
        
    elif the_player.dx and walk_temp >= 0: #걷고 있을때 1
        walk_temp-=1
        maked_character_R = c_RR[60:80,:30]
        maked_character_G = c_GG[60:80,:30]
        maked_character_B = c_BB[60:80,:30]
    elif the_player.dx and walk_temp < 0: #걷고 있을때 2
        walk_temp-=1
        maked_character_R = c_RR[40:60,:30]
        maked_character_G = c_GG[40:60,:30]
        maked_character_B = c_BB[40:60,:30]
        if walk_temp == -25: walk_temp=25
        
    else :
        if np.random.random() < 0.005 or eye_temp<20: #매 틱마다 0.5%의 확률로 눈을 감음
            if eye_temp >= 20:eye_temp=0
            eye_temp+=1
            if eye_temp < 10:
                maked_character_R = c_RR[:20,30:60]
                maked_character_G = c_GG[:20,30:60]
                maked_character_B = c_BB[:20,30:60]
            else:
                maked_character_R = c_RR[20:40,30:60]
                maked_character_G = c_GG[20:40,30:60]
                maked_character_B = c_BB[20:40,30:60]
        else: #아무 상태도 아닐때 (기본)
            maked_character_R = c_RR[:20,:30]
            maked_character_G = c_GG[:20,:30]
            maked_character_B = c_BB[:20,:30]

캐릭터의 상태는 점프>걷기>눈 깜빡임>기본 순서대로 확인한다.

즉, 점프 중일때는 걷기 모션이 없이 점프 모션만 한다.

걷기는 두가지 그림으로 표현하는데, "걷기틱"을 -25에서 25를 반복시키며 양수,음수일때의 그림을 다르게 했다.

눈을 매틱마다 0.5%확률로 감는 것은 1초에 60틱이으므로, (0.5% x 60=) 1초마다 30%확률로 눈을 감는 걸 의미한다.

    p_x,p_y=the_player.p_x,the_player.p_y-150 #캐릭터의 키만큼 y를 증가시킴
    p_size=5 #캐릭터 (픽셀)사이즈
    for i in range(row):
        for j in range(column):
            if maked_character_R[i][j]+maked_character_G[i][j]+maked_character_B[i][j] != 0: #색이 칠해지지 않았으면 사각형을 그리지 않음
                color = (maked_character_R[i][j],maked_character_G[i][j],maked_character_B[i][j])
                pygame.draw.rect(screen,color,[i*p_size+p_x,j*p_size+p_y,p_size,p_size],0)

그리고, pygame.draw.rect()함수를 이용하여, 플레이어의 위치를 the_player.p_x(p_y)로 가져온 후 위치에 맞게 그리면 된다.

이때, 위에서 "상태에 따라" 정한 캐릭터의 데이터(그림)를 이용한다는 것을 볼 수 있다.

넘어가기 전에!! 위 코드를 실행해보면 이상한 걸 느낄 텐데

추가적으로, 캐릭터가 왼쪽을 갈때, 왼쪽 바라보도록 해야한다.

    if the_player.dx < 0: flip=True
    elif the_player.dx > 0: flip=False
    
    if flip:
        maked_character_R = maked_character_R[::-1,:]
        maked_character_G = maked_character_G[::-1,:]
        maked_character_B = maked_character_B[::-1,:]

 

 

(땅 또한 그림으로 그렸는데, 땅의 경우에는 더 간단하다. 땅의 경우에는 위치가 고정되어 있으므로, 미리 위치를 저장해둔 뒤, 행렬의 순서에 맞게 땅을 그려주면 된다.)

적용 모습은 다음과 같다.

 

 

728x90