오늘은 도파민 중독 이슈로.. 오전 시간을 다 보내고 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 가 안써지는걸까...
비슷한 질문에 대한 나도코딩샘의 답변!
내가 만든 똥겜~~~ 너를 위해 구웠찌
코드 영상 안보고 써봐야겟다..어려워잉 ~
프로젝트 하나 더있네.. 가시죠
광고에서 뇌빼고 코드 따라칠꺼면 시간낭비니까 떄려치라네?ㅋㅋㅋㅋ 복습이나 하자^^