앱 개발/pygame

[pygame] 03. 캐릭터 넣기

내만 2022. 9. 17. 22:36
728x90
반응형

728x90
반응형

 

 

 

 

🙆‍♂️ 사진 불러오기


# 3. 게임 내 필요한 설정
.
.
.
hero = pygame.image.load(r'image\blackEagle.png').convert_alpha()

먼저 위의 코드처럼 설정을 해줬습니다.

jpg 파일이라면 .conver_alpha() 부분을 적지 않아도 되지만 png파일이라 적었습니다.

 

경로는 절대경로로 해도 되고 상대경로로 해도 되는데 다른 컴퓨터에서 실행하기 위해서는 상대경로가 편하기 때문에 상대 경로를 이용했습니다.

제 파일은 이렇게 jupyter파일인 .ipynb파일과 image 폴더가 같은 위치에 있기 때문에 바로 imgae 폴더로 이동해서 해당 사진과 접촉할 수 있었습니다.

 

그리고 자세히 보면 문자열 앞에 r을 써서 원시 문자열로 처리해주는 것인데 파일 경로에 역슬래시가 있는 이슈 때문에 r을 붙여서 이스케이프 문자로 바뀌지 않도록 처리해야 합니다.

지금 상황에서 r을 붙이지 않는다면 \b(백스페이스)가 되어서 없는 경로라고 나올 것입니다. 

 

이렇게요

 

 

암튼 이 사진을 이제 화면에 띄우기 위해선 코드 한 줄이 필요합니다.

    # 4-4 그리기
    .
    .
    .
    screen.blit(hero, (0,0))

이렇게 screen의 blit함수를 통해서 (객체, 위치(가로,세로))를 정의할 수 있습니다.

 

이렇게 실행해보면

사진이 잘 나오긴 하지만 약간 배경 색 조정도 필요해 보이고 너무 크고 이상한데에 있습니다.

 

🙆‍♂️ 캐릭터 크기 설정


hero = pygame.transform.scale(hero, (40,70))

transform의 scale을 통해서 크기를 지정할 수 있습니다.

사용법은 (객체이름, 크기(가로,세로)) 입니다.

크기가 다소 작아진 모습입니다.

 

 

🙆‍♂️ 캐릭터 위치 설정


캐릭터의 위치는 x,y좌표로 봤을 때 x좌표로는 딱 가운데이고 y좌표로는 맨 밑에서 조금 위에 위치하도록 하고 싶습니다.

 

# 2. 게임 창 옵션 설정
.
.
.
#크기 설정
size = [800,1000] #이미 설정 했던 값

.
.

# 3. 게임 내 필요한 설정
.
.
.
heroX = size[0]//2
heroY = size[1] - 50

.
.

# 4-4 그리기
.
.
.
    screen.blit(hero, (heroX,heroY))

이렇게 위처럼 따로 변수를 지정하여 heroX엔 x좌표 값을 heroY에는 y좌표 값을 설정합니다.

x좌표 값은 예전에 설정 했던 size라는 값에서 x축의 길이를 지정한 값인 size[0]을 2로 나눈 값을 설정했고

y좌표 값은 size[1]에서 50을 빼줬습니다. //그 이유는 1000에서 50빼면 950이니까 암튼 그런 느낌?

그리고 마지막으로 아까 0,0으로 설정했던 좌표 값을 heroX와 heroY값으로 설정합니다.

 

실행해보면 x선상 가운데도 아니고 밑에 짤린 모습입니다.(스크린샷 잘못한게 아님)

이를 해결하기 위해서는 이 캐릭터의 x길이와 y길이를 고려해줘야 합니다.

 

#캐릭터 x,y길이 가져오기
heroSizeX,heroSizeY = hero.get_size()

이렇게 객체.get_size하면 객체의 x,y 길이를 앞에 선언한 변수로 가져올 수 있습니다.

 

#캐릭터 위치 설정
heroX = size[0]//2 - heroSizeX
heroY = size[1] - 50 - heroSizeY

이 값들을 추가적으로 빼주고 실행해보면

 

아기자기하고 귀여운 블랙이글스를 볼 수 있습니다.(근데 뭔가 가운데 아닌거 같기도 하고)

가운데가 아닌데요? 생각해보니까 hero의 x길이를 그냥 빼는게 아닌 반을 나눠서 뺐어야 했던 것 같습니다.

 

다시 수정해보면

#캐릭터 위치 설정
heroX = round(size[0]/2) - round(heroSizeX/2) - 0.1
heroY = size[1] - 50 - heroSizeY

이렇게 됐는데 그냥 몫만 구해서 하려 했는데 나누고 round 함수를 통해서 반올림을 하는 방법을 선택했습니다.

그런데 여기서 0.1을 더 빼줬는데 그 이유는 round 함수의 반올림 이슈(0.5일 때 짝수는 버리고 홀수는 올리는)가 있어서

 0.1을 더 했습니다. (가중치 느낌으로다가) 실행을 해보면

 

정가운데로 보이지 않나요? 전 그렇게 보입니다..

 

import pygame

# 1. 게임 초기화
pygame.init()


# 2. 게임 창 옵션 설정

#크기 설정
size = [800,1000]                         
screen = pygame.display.set_mode(size)

 #제목 설정
title = "Korea 1947"                    
pygame.display.set_caption(title)        



# 3. 게임 내 필요한 설정

#시계 만들기
clock = pygame.time.Clock()              

#배경 색 지정
gray = (80,80,80)                        
color = gray

#캐릭터 경로 설정
hero = pygame.image.load(r'image\blackEagle.png').convert_alpha()
#캐릭터 크기 설정
hero = pygame.transform.scale(hero, (40,70))
#캐릭터 x,y길이 가져오기
heroSizeX,heroSizeY = hero.get_size()
#캐릭터 위치 설정
heroX = round(size[0]/2) - round(heroSizeX/2) - 0.1
heroY = size[1] - 50 - heroSizeY



# 4. 메인 이벤트
#버튼 누르면 XB값이 0이되어 종료
XB = 1
#XB가 1이 아니라면 while문 종료
while XB == 1:
    
    # 4-1. FPS 설정
    
    #FPS 설정 초당 반응 수
    clock.tick(60)                       


    # 4-2. 각종 입력 감지
    
    #입력 감지
    for event in pygame.event.get():
        #입력이 들어오면 종료
        if event.type == pygame.QUIT:
            XB=0
    
    
    
    # 4.3 입력과 시간에 따른 변화

    
    
    # 4-4 그리기
    
    #화면 색 채우기
    screen.fill(color)
    
    #사진 띄우기
    screen.blit(hero, (heroX,heroY))
    
    

    # 4-5 업데이트
    
    #screen 상태 업데이트
    pygame.display.flip()                
    
    
    

# 5 게임 종료 
pygame.quit()

현재까지의 코드는 이렇습니다.

728x90
반응형