pygame으로 게임 만들기

JoonQpa·2022년 4월 27일
0

개인프로젝트

목록 보기
2/6
post-thumbnail

게임을 완성했다.

게임 타이틀은 attaboy와 boo를 합친 AttaBooi

완성했다는 뿌듯함보다는 아쉬움이 많이 남는다. 구현하고 싶은 기능이 정말 많고 아이디어는 많이 떠올랐지만, 짧은 시간 + 실력 부족으로 구현하지 못했기 때문..😔

대신 중간중간 에러를 내 힘으로 해결했을때 희열을 느낄 수 있었고, 확실히 게임을 개발하면서 반복문, 조건문들 python문법에 대해 많이 공부할 수 있었다.

게임을 만들면서 힘들었던 부분이나 유용했던 부분에 대해 정리해본다.

favicon 설정하기 (상단 아이콘)

import pygame

favicon = pygame.image.load("data/images/title.png")    #favicon 설정
pygame.display.set_icon(favicon)

좌측 상단에 아이콘을 띄우는 favicon기능

굳굳


highscore 기능 구현하는 법

    highscore_value = open("data/serialisation/highscore.csv", "r").readline() ##highscore표시
    text_highscore = font.render("Highscore: {}".format(highscore_value), True, (150, 200, 255))
    screen.blit(text_highscore, (size[0] - 530, 5))

if SB != 0 or GO ==1:
    old_highscore_value = open("data/serialisation/highscore.csv", "r").readline()          # highscore를 따로 액셀파일에 저장하고 출력하는 방식으로 구현
    try:
        if score > int(old_highscore_value):
            highscore_value = open("data/serialisation/highscore.csv", "w")
            highscore_value.write(str(score))
            highscore_value.close()
    except:
        pass

폴더에 따로 excel파일을 만들어서 자동으로 입력하고 게임내에 출력하는 방식으로 구현했다.


게임오버 사운드 한번만 재생하는 법

playgameover = True 
# 게임오버사운드 한번만 재생하기 위한 메인루프에 playgameover값 True설정

    if playgameover:
        bgm.stop()  
        gs = pygame.mixer.Sound("data/sound/smw_lost_a_life.wav")
        gs.play(loops=0)
        playgameover = False 
        #값을 바꿔줘야 루프 프레임마다 재생되는 것을 방지할 수 있다.

개인적으로 가장 많이 시간을 소비해서 해결했을때 나도 모르게 박수 친 구간.

기본적으로 게임오버 사운드가 연속으로 재생되는 로직은,

  • 컴퓨터가 게임 메인 루프 프레임(FPS)별로 값 체크
  • 게임오버 상태가 프레임마다 입력
  • 게임오버 사운드가 프레임마다 재생

과 같은 로직으로 사운드가 연속 재생된다.

이를 playgameover 변수를 gameover시에 바꿔주면 사운드가 한번만 재생된다.


랜덤 확률로 개체 생성하는 법

    # boo 생성함수
import random from pygame

b_list = []

    if random.random() > 0.98 and score >= -2:
        boo = obj()
        boo.put_img("data/images/boo.png")
        boo.change_size(40, 40)
        boo.x = random.randrange(0, size[0] - boo.sx - round(player.sx) / 2)
        boo.y = 10
        boo.move = 6
        b_list.append(boo)
        
    elif random.random() > 0.98 and score >= 15:
        booo = obj()
        booo.put_img("data/images/booo.png")
        booo.change_size(50, 50)
        booo.x = random.randrange(0, size[0] - booo.sx - round(player.sx) / 2)
        booo.y = 10
        booo.move = 10
        b_list.append(booo)
        angry = pygame.mixer.Sound("data/Sound/Super Mario Fireball.mp3")
        angry.play(loops=0).set_volume(0.05)

pygame에서 제공하는 ramdom 라이브러리를 이용해서 random.random() > '값' 을 넣어 객체 생성 확률을 조절할 수 있다.

스코어가 15가 넘어가면 더 빠르고 무서운 boo가 생기도록 설정했다.


pause/continue 기능 구현하는 법

def pause():                # 일시정지 기능 만들기

    paused = True
    while paused:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.MOUSEBUTTONDOWN:         #마우스 버튼 클릭시 다시 시작
                    paused = False


        font1 = pygame.font.Font("data/font/AGENCYB.TTF", 100)
        text_paused = font1.render("Paused", True, (0, 0, 0))
        screen.blit(text_paused, (size[0] / 2 - 130, round(size[1] / 2 - 100)))

        font2 = pygame.font.Font("data/font/AGENCYB.TTF", 50)
        text_paused = font2.render("continue to click", True, (0, 0, 0))
        screen.blit(text_paused, (size[0] / 2 - 150, round(size[1] / 2 )))

        pygame.display.update()
        clock.tick(5)

충돌 개념 구현하는 법

def crash(a, b):
    if (a.x - b.sx <= b.x) and (b.x <= a.x + a.sx):
        if (a.y - b.sy <= b.y) and (b.y <= a.y + a.sy):
            return True
        else:
            return False
    else:
        return False

사각형의 각 모서리가 닿을 때 충돌한 것으로 보는 함수를 만들어서 구현시켰다.


기본적인 틀을 유투브 영상에서 보고 구현해보고 싶은 기능들은 따로 오픈소스를 보면서 구현하려고 시도했지만, 처음 틀의 코드가 난잡하게 구성되어 있어 적용시키기도 힘들 뿐더러 코드 자체를 이해하기도 버거웠다.

가독성 좋은 코드의 중요성을 느낄 수 있었다.
리펙토링의 중요성..

다음에는 재도전할때는 정말 깔끔하게 코드를 짜서 이것 저것 구현해보고 싶다.


내 게임에 적용하지 못해 이미지와 사운드만 바꿔본 넋두리용 게임,,😂




매우 귀엽다.

위 게임의 요소를 적용시켜서 랜덤하게 떨어지는 유령을 피해서 올라가는 식의 게임을 만들어 보려했었지만 실패. 그치만 다음에 재도전한다면 할 수 있을 것 같다는 생각이 들 정도로 이 게임을 만들면서 많이 배웠다.

다음에는 class와 def만을 이용해서 깔끔하게 코딩을 해보고 싶다.


내가 속한 반이 아닌 다른 반을 관리하고 계신 튜터님께도 상담을 받았다. 머리 속에 들어있는 모든 근심거리 혹은 궁금증을 하나하나 친절하고 자세하게 튜터님의 경험을 바탕으로 말씀해주시고, 앞으로 어떤 방향을 잡으면 더 많은 기회를 얻을 수 있을지 알려주셔서 너무 감사했다. 나에게 프로그램의 가장 큰 장점이 튜터님께 언제든 어떤 질문을 해도 답변해주신다는 점인 것 같다.

호주에서 대학원을 다녀온것이 좋은 기회가 될 수 있을 것 같다고 말씀해주시면서,
불안해하지말고 길게 보고 현재 프로그램에 충실하면 분명 좋은 결과를 얻을 수 있을 것이라고 하셨다.
프로그램을 이어가면서 개인 공부를 해야한다는 말씀은 똑같이 해주셨다.

  • 운동하듯 매일 짧게라도 코딩테스트 및 과제 준비하기
  • 타게팅 회사 요구 역량 체크
  • 타게팅 회사가 제시한 과제와 비슷한 프로젝트 해보기
  • 호주 비자 준비 및 취업 알아보기
  • 영어
profile
Intuition factory: from noob to pro

1개의 댓글

comment-user-thumbnail
2022년 4월 28일

굉장히 잘 만들어 주셨습니다~
글에 작성해주신 것 처럼 해당 게임의 기능을 다시 한번 정리 하시면서 함수 혹은 클래스로 분류해보세요.
그리고 에러 코드는 완벽하게 잡을 수 없습니다. 그럼 이를 어떻게 막을 수 있을지 고민해보세요.
(예외처리 검색)

마지막으로 게임을 만들게 되면 조건문을 꽤 많이 정의하게 되며 자연스럽게 코드가 약간 지저분해집니다. 이럴때 파이썬에서는 어떻게 코드를 깔끔하게 정리할 수 있는지 검색해보세요 :)
(switch 문법)

답글 달기