티스토리 뷰
728x90
[이번에는 수업시간에 배운 내용인 캐릭터, 적 생성하고 충돌 판정까지 구현하는 과정을 정리하겠습니다.]
import pygame
import random
#초기화 #중요!
pygame.init()
score = 0
#FPS
clock = pygame.time.Clock()
#화면 크기 설정
screenWidth = 480 #가로크기
screenHeight = 640 #세로크기
screen = pygame.display.set_mode((screenWidth,screenHeight)) #가로, 세로
#배경이미지
background = pygame.image.load("background.png")
#캐릭터
character = pygame.image.load("character.png")
characterSize = character.get_rect().size #img크기 불러옴
characterWidth = characterSize[0]
characterHeight = characterSize[1]
characterXpos = (screenWidth / 2) - (characterWidth / 2)
characterYpos = screenHeight - characterHeight
#이동할 좌표
toX = 0
toY = 0
#이동속도
characterSpeed = 0.6
#난수 생성 - 똥 생성용
randomNumber = 30
poSpeed = 10
#적
enemy = pygame.image.load("enemy.png")
enemySize = enemy.get_rect().size
enemyWidth = enemySize[0]
enemyHeight = enemySize[1]
enemyXpos = 200
enemyYpos = 100
#Title
pygame.display.set_caption("뭔게임이야")
#폰트 정의
game_font = pygame.font.Font(None,40) #폰트, 크기
#게임 플레이 총 시간
totalTime = 10
startTicks = pygame.time.get_ticks()
#Event
running = True
while running: #실행창
dt = clock.tick(20)
#print("fps: " + str(clock.get_fps()))
#캐릭터가 1초 100만큼 이동:
#10FPs : 1초동안 10번 작동 -> 10만큼~~~ 100
#20FPs : 1초동안 20번 작동 -> 5만큼~~~ 100
for event in pygame.event.get(): #어떤 이벤트 발생했는지 판단함
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
toX -= characterSpeed
if event.key == pygame.K_RIGHT:
toX += characterSpeed
if event.key == pygame.K_UP:
toY -= characterSpeed
if event.key == pygame.K_DOWN:
toY += characterSpeed
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
toX = 0
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
toY = 0
#캐릭터 이동 & 프레임맞추기
characterXpos += toX * dt
characterYpos += toY * dt
#경계 설정-가로
if characterXpos < 0:
characterXpos = 0
elif characterXpos > screenWidth - characterWidth:
characterXpos = screenWidth - characterWidth
#경계 설정-세로
if characterYpos < 0:
characterYpos = 0
elif characterYpos > screenHeight - characterHeight:
characterYpos = screenHeight - characterHeight
randomNumber = random.randrange(1,200)
randomNumber2 = random.randrange(1,440)
if enemyYpos > 640:
enemyYpos = randomNumber
enemyXpos = randomNumber2
score += 1
poSpeed += 2
enemyYpos += poSpeed
#충돌
characterRect = character.get_rect()
characterRect.left = characterXpos
characterRect.top = characterYpos
enemyRect = enemy.get_rect()
enemyRect.left = enemyXpos
enemyRect.top = enemyYpos
if characterRect.colliderect(enemyRect):
print("충돌")
running = False
#타이머
elapsedTime = (pygame.time.get_ticks()) / 1000
#경과시간이 ms 이므로 초단위로 표시
#if totalTime - elapsedTime < 0:
#print("시간초과")
#running = False
timer = game_font.render(str(int(totalTime - elapsedTime)), True, (255,255,255))
# 출력할 글자, , 색상
scoree = game_font.render(str(score), True, (200,200,200))
#screen.fill((0,0,255))
screen.blit(background, (0,0))
screen.blit(character, (characterXpos , characterYpos))
screen.blit(enemy, (enemyXpos , enemyYpos))
screen.blit(timer, (10,10))
screen.blit(scoree, (10,30))
pygame.display.update() #화면 새로고침
pygame.quit() #pygame 종료
<중요 흐름>
- 1. FPs나 시간, pygame초기 화등 기본 설정을 해줍니다.
- 2. 배경, 똥, 캐릭터의 이미지를 가져오고 충돌 영역을 지정합니다.
- 3. 게임 실행 중 키보드 키가 눌릴때마다 특정 이벤트를 발생시킵니다.(캐릭터 이동)
- 4. 똥이 바닥에 닿으면 점수를 올리고 스피드를 증가시키며 다음 똥의 위치가 랜덤으로 다시 생성합니다.
- 5. 상황을 계속해서 업데이트 해주며 캐릭터와 똥의 충돌이 발생하면 게임을 종료합니다.
<주의할 점>
- 꼭 pygame을 초기화 하고 시작하십시오.
- img를 불러올 때 코드와 같은 위치에 존재해야 합니다. (혹은 절대 경로로 불러오십시오)
- 가끔 실행이 되지 않을때 코드를 다시 실행해 주십시오.
<게임 모습>
- 위의 하얀색 글씨는 timer이고 아래 회색 글씨는 똥을 몇개 피했는지를 알려주는 점수입니다.
- 똥을 많이 피할수록 더 파른 속도로 똥이 내려오게 됩니다.
<느낀 점>
pygame으로 게임을 만들어 본건 처음인데 생각보다 재미있네요.
간단한 게임을 만들어 보실 분들이나, 간단히 프로젝트를 시각적으로 표현해보고 싶으신 분들은 한번 해보세요!
'프로그래밍 > python' 카테고리의 다른 글
[Python] 이미지 이어붙이기 프로그램 제작하기 (2) | 2020.07.15 |
---|---|
[Python] 간단한 게임 제작 (6) | 2020.07.02 |
[Python] 파일에 있는 여러 문서를 불러와 내용 바꾸기 (0) | 2020.05.18 |
[Python] 예외 경우 처리하기 - try, except문 (0) | 2020.03.09 |
[Python] 일정 시간마다 반복하기 (7) | 2020.03.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 도전
- django
- localstorage
- 사칙연산
- 꿈두레
- 1254
- 1255
- 크롤링
- SMTP
- 아나콘다
- Python
- 1253
- Anaconda
- 바닐라 javascript
- 1252
- pygame
- 코드업
- 1251
- 컨트롤타임
- promise반환
- Codeup
- 타이탄의도구들
- 주석
- JavaScript
- 바닐라 js
- 2022.02.05
- 코드설명
- 티처블 머신
- notion api
- 문제풀이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함