개발 공부 일지/Python

개발 공부 일지[나도코딩/ 파이썬 활용편] - 독학 4일차

yelimu 2024. 6. 6. 12:12

오늘은 도파민 중독 이슈로.. 오전 시간을 다 보내고 12시가 돼서야 공부를 시작한다..

밥먹으면서 봐야지 라는 핑계로 유튜브는 켜지않는게 좋겠다 ^^ 

오후에 미용실 예약도 해놔서 흐름이 끊길거같긴 하지만 그래도 나머지 시간을 잘 써보자 

나도 코딩님의 파이썬 무료강의..감사합니다.

모든 활용편의 프로젝트를 해볼 필요는 업다고?

일단게임편 레스꼬


pip install pygame 다운로드 받아주시고

import game > 실행하면 확인 가능

기본 화면 설정 

타이틀 

이벤트 루트 

게임 종료 

import pygame

pygame.init() #초기화 : 반드시 호출

#화면 크기 설정
screen_width = 480
screen_height = 640
screen = pygame.display.set_mode((screen_width, screen_height)) #설정된 값을 screen이라는 변수로 받기

#화면 타이틀 설정
pygame.display.set_caption("Nado Game") #게임이름
# 화면이 떴따가 사라짐 !! (프로그램이 종료됨)

# 이벤트 루프 : 프로그램이 종료되지않도록 대기 (사용자 마우스나 키보드 움직임 체크? )
runnimg = True #게임이 진행중인가? true
while runnimg:
    for event in pygame.event.get(): #어떤 이벤트(창 닫힘 등..)가 발생하는가를 체크
        if event.type == pygame.QUIT: #창 닫히는 이벤트가 발생했는가?
            runnimg = False #게임이 진행중이 아님

#pygame 종료
pygame.quit

오 나 신기....

 

배경이미지 불러오기

좌표 설정

유지해주기 

background = pygame.image.load("C:\\Users\\예리밍\\Desktop\\PythonWorkspace\\pygame_basic\\background.png")
 screen.blit(background, (0,0)) #  배경 그리기 & 불러올 위치 좌표 설정 *좌측 상단 > 아직 반영되진 않음
    # screen.fill((30, 200, 250)) # 이미지 없이 색깔만 채우기 가능
    pygame.display.update() # 게임화면을 다시 그리기 (유지되도록 )


# 스프라이트 (캐릭터) 불러오기
character = pygame.image.load("C:\\Users\\예리밍\\Desktop\\PythonWorkspace\\pygame_basic\\character.png")
#사이즈를 알아야됨
character_size = character.get_rect().size #rectangle
character_width = character_size[0] #가로 크기
character_height = character_size[1] #세로 크기
#위치설정
character_x_pos = (screen_width - character_width)/ 2 #화면 x축 절반 크기에 해당하는곳에 위치 설정
character_y_pos = screen_height - character_height #화면 y축 가장 아래에 위치 하도록 계산
# 캐릭터 이미지의 왼쪽모서리 좌표 기준임!
  #캐릭터 그리기
    screen.blit(character, (character_x_pos, character_y_pos))

 

배경/캐릭터 load 랑 blit 둘다해줘야 표시가 된다..음 

 

그담에 이벤트루프에 키보드 이벤트 추가해주기 

runnimg = True #게임이 진행중인가? true
while runnimg:
    for event in pygame.event.get(): #어떤 이벤트(창 닫힘 등..)가 발생하는가를 체크
        if event.type == pygame.QUIT: #창 닫히는 이벤트가 발생했는가?
            runnimg = False #게임이 진행중이 아님

        if event.type == pygame.KEYDOWN: #키보드 키가 눌러졌는지 확인
            if event.key == pygame.K_LEFT: #캐릭터를 왼쪽으로 눌렸을때 > 캐릭터 좌표를 바꿔줘야함 1) 이동할 좌표 먼저 0으로 세팅해주고 그 값을 바꿔준다
                to_x -= 5 #(왼쪽으로 5만큼 이동)
               
            elif event.key == pygame.K_RIGHT:
                to_x += 5
            elif event.key == pygame.K_UP:
                to_y -= 5
            elif event.key == pygame.K_DOWN:
                to_y += 5

        if event.type == pygame.KEYUP: #방향키를 떼면
            if event.key == pygame.K_LEFT or pygame.K_RIGHT:
                to_x = 0
            elif event.key == pygame.K_UP or pygame.K_DOWN:
                to_y = 0

    character_x_pos += to_x #좌표 옮겨주기
    character_y_pos += to_y
#근데 내껀 왜 존나 빠르고 안멈춤..? ㅇㅇ 화면 밖으로도 벗어남 !! > 제어해주기
    if character_x_pos < 0 :
        character_x_pos = 0
    elif character_x_pos > screen_width - character_width :
        character_x_pos = screen_width - character_width #가로 경계값 처리
       
    if character_y_pos < 0 :
        character_y_pos = 0
    elif character_y_pos > screen_height - character_height :
        character_y_pos = screen_height - character_height #세로 경계값 처리

 

FPS frame per second


clock = pygame.time.Colck() 

 pygame 모듈 안에서 Clock() 이라는 함수를 호출하여 변수에 저장

while runnimg:
    dt = clock.tick(30) #게임화면의 초당 프레임수 설정
   

이벤트 루프에 dt 를 추가해줬는데 갑자기 화면이 .. 유지가 안되고.. 맨 처음에 실행했을때처럼 바로 꺼진다 왜죠!! 

4번 파일가지고 다시 수정하니까 됐어욤... ㅠ ㅂ ㅠ 뭐냐고~~~~ 

글구 왜 위아래 방향은 한번만 눌러도 연속 이동 & 누를때마다 속도 배속됨??... 좌우는 키보드 누를때만 이동함..

FPS 느리면 버벅이는 느낌 (10정도)

▶ 프레임수가 달라진다고 게임 속도가 달라지면 안된다..

아 그래?... > 보정이 필요하다 ▶ 위치 좌표에서! speed * dt 를 해주면 프레임 수에 상관없이 캐릭터가 움직이는 속도는 비슷하게 보정이 됨 

 

충돌처리 (적군과 충돌 )


# 적 캐릭터 enemy
enemy = pygame.image.load("C:\\Users\\예리밍\\Desktop\\PythonWorkspace\\pygame_basic\\enemy.png")
#사이즈를 알아야됨
enemy_size = enemy.get_rect().size #rectangle
enemy_width = enemy_size[0] #가로 크기
enemy_height = enemy_size[1] #세로 크기
#위치설정
enemy_x_pos = (screen_width - enemy_width)/ 2 #화면 x축 절반 크기에 해당하는곳에 위치 설정
enemy_y_pos = (screen_height - enemy_height )/2 # 화면 중앙에 위치

 


    #충돌 처리를 위한 rect 정보 업데이트
    character_rect = character.get_rect()  #rect 에는 크기 위치 정보 포함 * 캐릭터를 이동 시켜도 rect 정보에는 처음 저장한 위치 정보만 있음
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos

    enemy_rect = enemy.get_rect()
    enemy_rect.left = enemy_x_pos # enemy 위치 고정이지만 일단 써놔봄  x  -> rect에 넣어줘야댐
    enemy_rect.top = enemy_y_pos  

    #충돌 체크
    if character_rect.colliderect(enemy_rect): #캐릭터가 에너미와 충돌햇는지 확인
        print("충돌했어요")
        running = False


충돌했어요 출력은 되는데 게임이 안꺼져요 선생님 !!!! 아 답답하네.... 머가 문제냐고 

지피티쌤이 알려줌.. 고맙다 무료지만 코드하나만큼은 잘짜는구나 

근데 왜 시행된거냐고 그동안? 암튼 해결 

 

rect.colliderect 를 쓰기 위해 get_rect를 갖다 넣는것인가보다 

 

텍스트를 써보자 


# 폰트 정의
game_font = pygame.font.Font(None, 40) # 폰트 None, 크기 40

#게임 시간
total_time = 10

# 시작 시간 정보
start_ticks = pygame.time.get_ticks() #시작 tick 정보를 받아옴 - 이게 뭔말일까?
#타이머 집어넣기 #이벤트 루프 안에 ~
#경과 시간 계산
    elapsed_time = ((pygame.time.get_ticks()) -start_ticks ) /1000 #밀리세컨즈(ms) -> 초로 환산
   
    timer = game_font.render(str(int(total_time - elapsed_time)), True, (255, 255, 255)) # 총 시간 -> 1 로 줄어들게 render & int 표현 & str 문자 처리
    #출력할 글자, true, 글자 색상
    screen.blit(timer,(10, 10) )#객체, 위치
   
    #만약 시간이 0 이하면 게임 종료
    if total_time - elapsed_time <= 0 :
        print("타임아웃")
        running = False

종료시 버퍼링 걸어주깃


#잠시 대기
pygame.time.delay(1500) #1.5초 대기 (ms)

 

* 창닫힘 버튼 눌러도 창이 안꺼지는 문제 ~ : 뭔지아세요? 또 runnimg이라고 되어있었어요 ^ ^

 

똥피하기 게임 quiiiiz  ~ 

세팅까진 걍 복붙햇습니다;

 

캐릭터가 x좌표로만 이동가능함 -> ㅇㅋ 


        if event.type == pygame.KEYDOWN: #키보드 키가 눌러졌는지 확인
            if event.key == pygame.K_LEFT: #캐릭터를 왼쪽으로 눌렸을때 > 캐릭터 좌표를 바꿔줘야함 1) 이동할 좌표 먼저 0으로 세팅해주고 그 값을 바꿔준다
                to_x -= character_speed #(왼쪽으로 5만큼 이동)                
            elif event.key == pygame.K_RIGHT:
                to_x += character_speed

 

똥이 랜덤한 x좌표에서 시작해야함 

#위치설정
enemy_x_pos = screen_width - randrange(0, 481)  #x좌표 랜덤
enemy_x_pos = random.randint(0, screen_width - enemy_width) 이걸로 바꿔줌..
enemy_y_pos = enemy_height / 2 # 화면 맨 위에서 시작

똥이 위에서 아래로 떨어지게 해야함 -> 이거!를 어떻게 하지?? 

시간이 흐름에 따라 y 좌표가 아래로 이동이동 ( 0 -> 640 까지) & 속도 정의 

***굳이 시간으로 할 필요는 없고 똥 스피드 가지고 위치만 바꿔주면됨 


#똥 좌표
to_x_enemy = 0
to_y_enemy = 0


#이동 속도
character_speed = 0.6
enemy_speed = 1
    #시간에 따라 흘러가야됨
    enemy_x_pos = to_x_enemy
    enemy_y_pos = to_y_enemy + (elapsed_time * 500) #0부터 시작인데
#여기에도 dt 곱해줘야하나? 유저가 이동시키는거아니니까 상관없을거같기도하고.. 

캐릭터가 똥을 피하면 다음 똥이 떨어져야함 

충돌까진 구현되어있고 똥을 피했다는걸 알게 해야댐.. >> 그럴필요가 없었다 ㅜ


    if enemy_y_pos > screen_height + character_height:
       또다른 똥이 등장!!! 

ㅋㅋㅋㅋㅋㅋ아 웃기다.. 또다른 똥이 나와야한다고.. 혼잣말 하는데 더럽고 어이없어.. 똥이 무한으로 나와야한다고 !! 

 

 

 

  _____________

<  반복문을 쓰자 !  

  -----------------------

근데 잘 모르겠음.. 영상 보고 가실게요...

    #시간에 따라 똥이 ㅋㅋ 흘러가야됨
    # enemy_x_pos = to_x_enemy << 이것때매 자꾸 위치가 처음이랑 똑같이 옮겨감!! 삭제
    enemy_y_pos += enemy_speed*10 #0부터 시작

    # 새로운 똥 등장 시키기
    if enemy_y_pos > screen_height:
        enemy_y_pos = 0
        enemy_x_pos =  random.randint(0, screen_width - enemy_width)

생각보다 간단한것이었따... 그냥 다시 위치를 옮기면 되는거였삼 (y 좌표를 height -> 0으로) 

import random

from import random * 

이 둘이 다른거여? 같은거 아니냐구.. 근데 왜 from 에서는 random.randint 가 안써지는걸까... 

비슷한 질문에 대한 나도코딩샘의 답변!

내가 만든 똥겜~~~ 너를 위해 구웠찌

코드 영상 안보고 써봐야겟다..어려워잉 ~

 

프로젝트 하나 더있네.. 가시죠

광고에서 뇌빼고 코드 따라칠꺼면 시간낭비니까 떄려치라네?ㅋㅋㅋㅋ 복습이나 하자^^