티스토리 뷰

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으로 게임을 만들어 본건 처음인데 생각보다 재미있네요.

간단한 게임을 만들어 보실 분들이나, 간단히 프로젝트를 시각적으로 표현해보고 싶으신 분들은 한번 해보세요!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함