STOVE 스토어

촉촉한감자칩
3시간 전24.06.22 14:06 -00:00
0 °C
“술을 섞고 삶을 바꿔줄 시간이군”이 대사는, 이 장르의 가장 대표적인 게임이자, 장르 그 자체를 상징하는 “VA-11 HALL-A: Cyberpunk Bartender Action”의 핵심 대사입니다.태번 토크의 핵심 게임 메커니즘 또한 다름이 없습니다.술 대신 포션을 섞어 제공하기는 하지만,포션을 통해 등장인물들의 인생이 바뀌고 세계에 영향을 미치며,결국은 세상의 종말을 구할지 또는 망할지의 거대한 서사극이 펼쳐지게 됩니다.이상하게도 태번(Tavern)은 선술집을 뜻하는 단어인데, 정작 술은 판매하지 않습니다 ㅋㅋㅋ여러분들이 내어주는 포션에 따라서 등장 인물들의 “운명”이 결정됩니다.물론 플레이어는 그런 모험가들의 동행자가 아닌,어디까지나 바에서 포션을 타주고, 사람들의 이야기를 들어주며, 조언을 해주는 “관찰자”로써 역할로 제한되어 있지만요.그러니깐  “판타지 세계의 바텐더가 되어 포션을 타주고 손님들의 이야기를 듣는 게임” 이라는 거죠.■ 태번에 방문하는 다양한 인간 군상의 이야기와 성장 스토리정말 다양한 캐릭터가 등장하고, 그들의 삶, 변화, 그리고 성장의 이야기를 담고 있습니다.손님들의 이야기를 듣는 것이, 이 장르의 핵심이자 전부이죠. 태번 토크는 이런 손님의 이야기를 게임 속에 정말 잘 녹여놨습니다.스토리가 진행됨에 따라서 캐릭터들의 관계성이 변화하고, 가치관이 변화하며, 그들의 외형마져 변하기도 합니다.가끔은 그들이 가져온 전리품이 가게에 장식되기도 하고요.태번 토크에는 유쾌하고 개성넘치고, 또는 흥미로운 캐릭터들이 잔뜩 등장하는데,이 장르에 가장 중요한 부분인, 캐릭터 서사에 있어서 태번 토크는 바로 합격점을 받아갈 수 있다는 말이죠.그리고 여기에 플레이어가 만드는 포션이 매우 중요한 역할을 합니다.손님의 요청을 듣고, 운명의 방향성을 정해주는 포션을 통해 운명의 갈림길을 선택하게 됩니다.손님은 포션을 마시고 모험을 떠난 뒤, 모험을 마치고 돌아와 “그 포션을 통해 결정 된 운명의 이야기”를 주인장에게 들려주게 됩니다.다른 운명의 갈림길이 궁금해서 회차 플레이가 강요되긴 하지만,완전히 다른 운명과 완전히 다른 결말에 대한 흥미 덕분에, 회차 플레이에 대한 원동력을 제공해 줍니다.제공하는 음료에 따라서 전혀 다른 모험의 과정과 결과, 심지어는 세계의 운명에 까지 스노우 볼이 굴러가게 될  겁니다.빵빵한 볼륨 또한 칭찬할만 합니다.회차 플레이가 강제되는 게임임에도 1회차 플레이만 대략 10시간 내외.그렇다고 2회차 플레이의 시간 단축은 거의 없습니다. 모든 업적 달성을 기준으로는 대략 30시간 가량의 플레이 타임이 필요합니다.바텐더 시뮬 장르의 게임들은, 하나같이 다른 인생의 선택지라는 시스템으로 인한 회차 플레이가 강요 되었음에도 불구하고,볼륨의 아쉬움이 항상 존재 했는데, 태번 토크는 1회차에서부터 빵빵한 볼륨으로 만족시켜 줄 겁니다.■ 너무나 쉬운 포션 제작 (미니게임)으로 스토리에 집중케 합니다.포션 제작이 스토리 분기의 핵심 열쇠인데, 이 부분이 심플한 건 오히려 좋습니다.발할라나 커피 토크와 같은 바텐더 게임을 하다보면, 종종 플레이어를 매우 고통스럽게 만들어 주는 부분이 있습니다.바로 “개같이 주문해도 찰떡같이 알아서 음료를 만들어야 한다.”라는 부분 말이죠.“우울한 날에 어울리는 음료를 주세요.” 같은 헛소리... 또는 “맨날 마시던 걸로 내놔요.” 같은 기억력 고문,또는 단서나 힌트도 없이 “마살라 짜이 주세요.” 같은 사전지식 고문 까지 말이죠.태번 토크는 그런게 없습니다. 그리고 부분적으로는 비슷한 형태가 있다고 하더라도 “답을 다 알려주는 수준의 힌트”를 제공합니다.이 덕분에 포션 제작 미니 게임에는 어떠한 고통이나 스트레스 요소가 없습니다.정말 쉬운  포션 제작 방법을 택한 대신,이러한 포션 제작을 통해 “캐릭터의 운명을 결정한다.” 라는 측면을 확실히 부각시켜 주는, 훌륭한 선택과 집중을 해 놨죠.그냥 정답을 다 알려주는 수준의 힌트. 대신 플레이어에게는 운명을 “선택”하는 사람으로써, 포션 제작에 확실한 의미 부여를 해 주었습니다. 추가로 “퀘스트 발행” 미니 게임도 그냥 정답을 다 알려주는 수준입니다. 그냥 같은 색 & 같은 모양 메모지를 3개 모으면 끝!■ 2개의 커다란 단점 - 쿨찐 주인장과 그들만의 이야기쿨병, 또는 쿨찐 같은 단어가 있습니다. 사건이나 인물을 대할 때, 굉장히 시니컬하거나 냉정한 대응,또는 우위에서 내려다보는 것 같은 자세등을 모두 포괄하는 자세를 말하죠.이 작품의 플레이어 = 주인공은 어째선지 각 인물등장 인물들에 대해 굉장히 건방지고 시니컬한 측면이 강합니다.쿨병에 걸린 것 마냥, 아무렇지도 않게 욕설을 담고, 서양식 조크 비슷하게 남에게 블랙조크를 던지거나 무례한 대사들이 상당히 많습니다.어떤 측면에서 태번의 방문한 사람들은 고객인데, 고객을 대하는 게 아니라 바보를 놀리는 것 같은 대화나, 상대방의 약점을 찌르고, 도발하는 식의 대사가 자주 튀어나옵니다.예를 들자면 처음 뼈아저씨가 등장 했을 때는, 포션을 주문할 때 “포션하고 대걸래를 드릴까요?” 같은 말을 합니다. 초면임에도 불구하고 말이죠. 일부 대화에는 대놓고 도발하고, 그것에 대해 고객 또한 상당히 살벌한 위협을 하는 장면도 나옵니다. 등장 인물들과 친밀도를 쌓아가는 스토리에 종종 이런 대사들은 설명하기 어려운 괴리를 느끼게 합니다.다만 이건 어디까지나 예의나 갑을 관계에 기초한 한국적인 정서에서 받아들이기 애매한 것일지도 모르겠습니다.대걸래 드립을 친 사람에게, 친절하게 해줘서 고맙다니...그저 서양식 블랙 조크나, 그런 문화권이라고 생각하고 받아들일 수도 있습니다.위의 쿨병같은 주인장은 문화 차이 같은걸로 넘길 수 있다 하더라도, 두번째 단점은 좀 심하게 큽니다.비록 카운터에 있는 주인장이 “듣는 청자의 입장”에 있다곤 하지만, 너무 부외자로 쫓아내 버리는 “그들만의 이야기”가 풀리는 부분입니다.아직 초반임에도 갑작 스럽게 몰아치는 고유명사의 파도에와, 뭔 소리인지 이해할 수 없는 고유 세계관 위에서 풀어나가는 이야기들은이야기의 청자인 플레이어를 게임 세계 밖으로 밀어냅니다. 캐릭터들이 열심히 떠드는데, 그게 뭔 말인지 이해할 수 없는 상황이 종종 발생합니다.뭔 바다, 플레이아데스, 날개, 에코...마치 수업시간에 잠시 한눈 팔았더니, 전혀 모르는 단어가 칠판 한가득 채워져 있는 것 처럼사전 설명도 없이 쏟아지는 고유 명사의 폭우와 설명도 한 적 없는 세계관의 각종 이야기를 쏟아내곤 하는데,뭔 소리인지 알아 들을 수도 없어, 한국어로 된 대사를 “해석해야 하는 순간”이 종종 찾아옵니다.이건 정말 심각할 정도로 몰입을 깨뜨리는 부분입니다.드넓은 세계관과 각종 종족, 설정, 이야기들을 설명 없이 “쏟아내 버리는 점”정말 중도 하차를 고민할 정도로 몰입을 망치는 부분이었습니다.세계관이나 설정을 찾아가면서 읽어보면 충분히 흥미롭고, 재밌는 발상, 또는 웃음이 나오는 설정들도 있는데,문제는 이런 것들을 하나도 안 가르쳐주고, 그냥 마구 떠든다는 점입니다.핵심 사건이나 등장 인물들이 제한되어 있다면, 어떻게든 집중해서 따라가긴 하겠지만,정말 놀랄 정도로 많은 (20명 이상) 등장인물들, 그리고 세계 곳곳에서 병렬로 진행되는 복수의 사건들 때문에 중반 부분에서는 “게임을 못 따라가겠다.”라는 생각도 종종들 지경이었습니다.그나마 최종장에 들어서면 위 사건들과 세계관, 그리고 등장인물들까지 모두 이어져서 완결로 향하는 서사를 통해그 사건들이 모두 의미가 있었다라는 것을 보여주긴 합니다만,이 중간 지점에서는 진지하게 하차를 고민 할 정도로 몰입을 망치는 구간이 있습니다.20명을 넘는 등장인물들... 몬스터 프롬을 해보셨으면 반가울 얼굴도 등장합니다. “크게 역할은 없지만...”■  끝이 좋으면 다 좋은 것이 게임에 대한 평가는 이 게임의 한 업적을 가져오면 딱 맞을 것 같습니다.갑작스런 고유명사와 그들만의 이야기로 인한 하차의 위기가 3차례 정도 있었지만,스토리의 막판에 그 모든 파편화되어 있던 이야기들의 줄기가 하나로 합쳐지고,자신만의 목적 위에서 행동하던 등장 인물들이 한 자리에 모이게 되어 결말로 향하는 장면에서는,그들의 운명을 이끈 관객으로써의 가슴 뜨거운 무언가가 끌어오르기도 합니다.그렇게 엔딩까지 보고 나면,중간의 고비조차 ‘괜찮았던 것’으로 포장 될 정도로, 감성 넘치는 무엇인가가 기억 한켠에 남게 됩니다.확실히 태번 토크의 최종장은 다른 바텐더 시뮬과는 다른 무엇인가를 보여주기에 “끝은 확실히 좋습니다.”그리고 고유 명사나 세계관 설정에 고생한 1회차 덕분에, 2회차는 훨씬 재밌고 흥미롭게 플레이 할 수 있기도 합니다.공식 한국어 번역에 과하다 싶을 정도로 현지화 되어 있어서, (조금은 은어나 한국 밈까지 사용한 수준)이건 게임성 외적으로도 칭찬 받을 부분이라고 생각합니다 ㅋ 스토브도 그렇고 아무튼 한글화는 감사합니다!커피 토크나 발할라 같은, “관찰자로써 이야기를 듣는 식”의 바텐더 시뮬을 좋아하는 분들에게는 매우 강력하게 추천 드릴 수 있습니다.장르 입문작으로써는 위에 지적한 “세계관을 마구 떠드는 단점”이 가장 마음에 걸리지만,그래도 쉬운 포션 조합과 장르의 핵심 재미를 잘 살린 점은 분명하기에, 조심스럽게 추천하고 싶긴 하네요 ㅎㅎㅎ솔직히 귀여운 페이블 하나만 두고 봐도, 플레이 할 가치가 있습니다!허당 엘프 페이블이 어떻게 성장해서 어떤 영웅이 될지는 본편을 플레이 해 보세요!그러니 제목으로 돌아갑니다. “포션을 섞고 운명을 바꿀 시간입니다.”#태번토크 #리뷰 #후기 #TavernTalk 촉촉한감자칩🫡🫡🫡 즐겜을 위해 하루하루 살아가고 있습니다. 미소녀 게임, 건설 경영 게임을 사랑합니다! 🤪 프로필   👌 추천글  ✨ 인장만들기
14
레랑22
12시간 전24.06.22 04:45 -00:00
85 °C
오늘도 뽑기로 탕진중
디디디디디5
11시간 전24.06.22 05:15 -00:00
오 저도 방금 돌리면서 그 생각 했어요
플레이 후기
문가경
24.06.2124.06.21 11:14 -00:00
11 °C
35분 플레이
충분히 무서운 게임이었습니다.
플레이 후기
한라미
24.06.1924.06.19 09:57 -00:00
20 °C
53분 플레이
지니어스로 겨우 클리어 완료.. 보스가 너무 어려워용 ㅠ..
l한평생l
4시간 전24.06.22 12:29 -00:00
213 °C
안녕하세요.2023년 유진게임즈 동계워크샵에 참여했던 팀 한평생입니다.4월말에 마지막으로 시간의 꽃 개발현황을 공유드리고, 6월 중순까지 개발하느라 바쁜 시간을 보낸 것 같습니다.7월7일에 정식판매되는 시간의 꽃은 워크샵 작품에서 리뉴얼 되어 4가지 엔딩, 추가 CG를 만나 볼 수있습니다.기존에 없었던 앨범 기능 및 호감도 기능이 추가되었으며 이전과 다른 내용을 확인하실 수 있습니다.모두 즐겁게 플레이 해주시기 바라며 많은 관심 부탁드립니다.시간의 꽃 판매 페이지 바로가기#시간의꽃 #비주얼노벨
플레이 후기
hashiruka48
24.06.2124.06.21 04:25 -00:00
21 °C
VolcanoPrincess 무료 아트북입니다.PDF 목차에 맞게 감상이 가능합니다.
달팽맨
24.06.2024.06.20 06:52 -00:00
194 °C
안녕하세요.게임 '타이론 vs 짭새'의 번역을 담당한 달팽맨입니다.이 게임은 '뻐꾸기남 시뮬레이터'의 파생작에 해당하니, 원작인 뻐꾸기남 시뮬레이터를 먼저 플레이해 보는 걸 추천합니다.https://store.onstove.com/ko/games/1674타이론 파생작 3종 중에서는 이 게임이 가장 난이도가 낮습니다. 딱 맛있는 난이도라는 느낌?재도전을 할 때마다 자원이 누적되며 조금씩 강해지니까, 컨트롤이 딸리는 사람이라도 충분히 재미있게 즐길 수 있어요.각종 기술(퍽)을 배워서 활용할 수도 있고, 몇 가지 총기류를 상황에 맞게 사용할 수도 있어요.타이론 파생작 3종 중에 하나만 플레이한다면 저는 이걸 권하고 싶네요.매번 죽을 때마다 킬 수에 따른 호칭(?)이 부여되는데, 각 호칭을 번역하는 과정에서 고민이 많았습니다.'Prison Bitch'라는 호칭은 비교적 짧은 고민 끝에 '감방 바텀'으로 번역했지만,'Homie'라는 호칭은 딱 맞는 번역어를 찾지 못해서 고민이 길어졌습니다.번역을 하다 보면 '뜻은 알지만 딱 대응되는 한국어 표현을 찾기 어려운 경우'가 있는데, Homie도 그런 경우였던 것 같습니다.한참을 고민한 끝에... 이 호칭을 붙여 주는 사람의 시점을 고려해 '동네 친구'로 번역했습니다.게임 자체도 재미있었고 번역 과정도 재미있었으니,부디 많은 분들이 재미있게 플레이해 주셨으면 좋겠습니다.그럼에도 제 번역에 미흡한 부분이 많을 것 같지만... 오역을 발견하시면 제보 부탁드립니다.#타이론vs짭새
알포도
24.06.2124.06.21 04:42 -00:00
한번 해봐야겠네요 
핵유잼
24.06.2024.06.20 03:57 -00:00
469 °C
감튀대신 버거 1+1 하자 이것들아
디디디디디5
24.06.2024.06.20 04:33 -00:00
양파링의 시대가 열리나요.....
G게G
24.06.2124.06.21 10:02 -00:00
감자튀김 없으면 햄버거 안먹어요!!!
리즈의리즈시절
9시간 전24.06.22 07:55 -00:00
73 °C
5만 플레이크 > 1천 포인트 > 커피 > 치킨이렇게인가?
새싹이물티슈
9시간 전24.06.22 08:02 -00:00
일단 5만 플레이크만 받아본 1인 입니다.
스토브9700
24.06.2024.06.20 12:25 -00:00
371 °C
Freshly Frosted라고 하네요스팀 평가는 매긍입니다.퍼즐 게임인것 같네요얼마전만 해도 무료게임 목록이 없길래또 한국은 꽝인가보다 했는데이런 일도 있네요
알포도
24.06.2124.06.21 04:36 -00:00
에픽 재미 있나요?
이번 주 온도 랭킹
  • Sojeob
    66,457℃
  • Chim
    9,304℃
  • 알포도
    628℃
추천 게임 태그
  • 화산의딸
    1명 팔로우
  • ALTF4
    0명 팔로우
  • 기적의분식집
    0명 팔로우
  • 갓오브웨폰
    0명 팔로우
  • 샷건킹
    0명 팔로우
촉촉한감자칩
24.06.0324.06.03 10:20 -00:00
536 °C
[Godot] 코인 획득과 인스턴스, 그리고 첫 애니메이션

취미로 게임 개발에 입문한 사람들이 가장 처음 만나는 최대의 장벽이 바로 이번 글에서 설명할 “인스턴스”입니다.
정식 입문서에는 이걸 설명하기 위해서 “객체지향 프로그래밍”과 객체에 대한 설명, 객체 지향의 특성 4가지인 추상화 상속 다형성 캡슐화....
그만 알아보도록 하죠.

실은 해보면 정말 쉬운겁니다.
우리는 취미로 게임을 만드는 거지, 이걸 업으로 삼을 사람들은 아니잖아요?

이번 글에서 할 일은 단 하나! 클릭 할 때마다, 획득한 코인이 “뿅!” 나타났다 사라지는 것을 구현할 것입니다.
지난번 프로젝트에서 이어서 진행됩니다.


■ 코인을 표시해줄 전용 라벨을 만들자!


기존의 작업하던 프로젝트에서 이어서 작업을 하지만, 이번에는 그 시작 지점이 조금 다릅니다.
프로젝트를 진행중인 node_2D 옆에 있는 + 아이콘을 누르면, 마치 “새 문서”와 같이 빈 노드가 새로 생성될 것입니다.




완전히 새로운 창이 뜨는데, 이번에는 “2D 씬”이 아닌 오직 “라벨”만으로 이루어진 노드를 만들어 줍시다.




다른 노드 > 이후는 이전에 라벨을 추가하는 것과 완벽하게 같은 방법입니다.

이렇게 생성된 라벨의 text에는 “코인획득라벨”이라고 임시로 입력해 줍니다.
이번에는 라벨을 조금만 더 꾸며 보도록 합시다.

라벨의 우측 설정창 (인스펙터)에서 

Control > Theme Overrides > 에 있는 모든 항목을 펼쳐서 아래와 같이 (또는 직접 만져보면서 보기 좋게) 세팅해 봅시다.
Colors > Font Outline Color : 체크
Constants > Outline size : 체크, 5 
Fonts Sizes > Font Size : 체크, 20

※ 기존 프로그래머를 위한 조언 (초보자는 몰라도 전혀 문제 없어요!)


이 부분도 코드 작성을 통해서 수정할 수 있습니다만, 인스턴스를 오버라이드 하는 방식으로 구현된 부분이라,
기존에 호출하던 방식 $Label.font_size = 20 과 같은 방식으로는 수정할 수 없습니다.
주로 전용 폰트 스타일을 새로 overrides 시킨 뒤 그 값을 수정하거나, $Label.set("theme_override_font_sizes/font_size", 30) 과 같은 귀찮은 방식으로 설정해야 합니다. 
그러니 그냥 쉽게 인스펙터 수정을 이용하세요 ^^




적당히 그럴 듯 하게 만들어진 라벨.
물론 나중에 얼마든지 수정할 수 있으니까, 지금은 불만족스럽더라도 일단은 결과물을 보자구요!

저장을 하도록 합시다. 그냥 label.tscn 으로 저장하셔도 되고, 자신만의 이름을 붙히셔도 상관 없습니다.

이제 상단의 node_2D 탭을 눌러서 기존의 작업물로 돌아와 봅시다.


■ 인스턴스를 만들자!


약간의 짧은 글로 인스턴스의 구조를 설명 드리겠습니다.

우리는 위에서 만든 라벨을 “클릭 할 때 마다 반복해서 화면에 띄워줄 것”입니다.

그러기 위해서는 위 라벨의 “설계도”를 누군가에게 맡기고,
필요할 때마다 그 “누군가”를 불러서 “라벨 주세요!” 외치면 됩니다.
그리고 받은 라벨을 원하는 위치에 띄워주면 완성이 되는 거죠.

설계도를 받을 사람은 “감자” 라고 합시다. 설계도를 저장해야 하니 이는 “변수”로 만들어져야 겠죠.




var gamja = preload(”res://la⁠⁠bel.tscn”)

gamja 라는 변수는, 우리가 아까 저장한 “라벨의 설계도(”res⁠⁠://la⁠⁠bel.tscn“)를 소지하게 되었습니다.

이제 버튼을 누를 떄 마다 동작을 해야 하니, 기존에 코인 버튼에 연결 되어 있던 func _on_button_pressed(): 함수에 코드를 추가하면 되겠죠?

다음은 “라벨 주세요!”라고 외칠 때 마다, gamja가 설계도에 따라 물건을 만들어 줄 것입니다.

var givelabel = gamja.instantiate()

givelabel 이라는 변수는 감자가 만든 라벨을 받게 되었습니다. 그리고 감자 뒤에 붙은 .instantiate() 이게 바로 설계도에 따라 물건을 양산하라는 의미입니다.
※ 주의 : godot 4.0 이전에는 .instance() 4.0 이후부터는 intantiate() 입니다. 버전에 따라서 아예 호환이 안됩니다!

이제 라벨은 무한하게 양산 될 것입니다. 비록 우리는 볼 수 없지만, 각 라벨에는 각각의 고유 시리얼 넘버라도 달려 있을 것입니다.

이렇게 만들어진 라벨을 실제로 사용할 때는 add_child(객체명)을 사용해 등장 시킬 수 있습니다.

add_child(givelabel)

그리고 이걸 어디에다 출력하냐?
= 라벨의 위치는 마찬가지로 인스펙터에 존재하는 “position” 값을 조절해 주면 됩니다.

대충 현재 마우스 위치를 강제로 받아오게 만들어 보죠.
get_global_mouse_position() 이 함수는 현재의 마우스 위치의 가져와주는 빌트인(고닷에 미리 만들어진) 함수입니다.

givelabel.position = get_global_mouse_position()




저장하고 실행을 해 보면??




라벨이 무한하게 양산되긴 하는데... 화면을 가려서는 안될 것 같긴 합니다 ㅎㅎㅎ
시간이 지나면 자동으로 사라지도록 만들어 보죠!

그리고 그 전에, 지금 이게 인스턴스 핵심의 전부입니다. 호들갑 떤 것에 비해 별로 어렵진 않죠?

여기서 사용하는 데미지 라벨, 생산을 누르면 뽑히는 유닛, 시뮬레이션에서 나오는 건설, 캐릭터가 쓰는 스킬...
사소하게 게임에서 누를 때 뜨는 팝업 창이나, 업적 달성을 표시해 주는 UI 등등, 
이 모든 것들이 결국 미리 준비된 노드, 그리고 그걸 인스턴스로 불러내는 것이 불과합니다.

더욱 정확히는 게임이라는 프로그램 전체가 하나의 인스턴스 집합입니다.



■ 인스턴스의 소각

label 탭으로 돌아옵시다.
“시간”이 지나면 자동으로 라벨이 사라져야 하니, 시간을 알려줄 무엇인가가 추가되어야 겠죠?

라벨과 버튼을 추가하 듯, 이번에는 Label 에 자식 노드로 Timer 노드를 추가해 줍시다.




그리고 타이머는 라벨이 등장하면 바로 시간을 카운트 하도록,
Timer의 인스펙터에서 “Autostart”에 체크를 해 줍시다. 필요하면 Wait time도 조절해 주셔도 되지만, 일단은 바로 결과를 볼 수 있게 현재의 1초를 그대로 둡시다.

이제 라벨에도 코드를 넣어주기 위해서 Label을 누르고 위에 있는 “문서+”아이콘을 눌러 새로운 스크립트 파일을 만들어 줍시다.
너무나 당연하게 _ready와 _ process 가 추가되는데, 그냥 두셔도 되고, 지워버리셔도 됩니다.

우리는 “시간이 지나면” 이라는 조건이 있고, Timer도 만들어 주었습니다.




timer노드의 timeout() : 시간이 만료되면, 우리가 설정해 놓은 명령을 수행하게 할 수 있습니다.
여기에는 단 한 줄 queue_free()만 적어 줍시다.




다 지워버리고 이것 뿐...
queue_free() 는 우리가 위에서 만든 “인스턴스”를 소각해 버리는 기능입니다.

타이머는 라벨이 등장하는 즉시 시작되고, 타이머가 1초로 설정되어 있으니, 
우리가 만든 라벨은, 등장하고 1초 뒤에 사라질 것입니다.

그리고 위에서 적은 것 처럼 “각 라벨에는 각각의 고유 시리얼 넘버라도 달려 있을 것입니다.”
그래서 라벨 사라져! 라고 말하는 것 처럼 보이지만, 고유 넘버 XXXX0001 번 사라져! 이런 식으로 처리할 겁니다.
이걸 쓴다고 모든 라벨이 한순간에 증발하는 일은 절대 없습니다.

F5를 눌러 실행해 보면?

인스턴스가 1초가 경과한 뒤 사라지는 것을 볼 수 있습니다.


※ 굳이 소각해 줘야 하나요? 지난번에 disabled 처럼 visible 의 인스펙터를 바꿔 버려도 되지 않나요?
인스턴스는 실제 라벨처럼 계속 메모리에 남아 있게 됩니다.
오랜시간 쌓인다면, 결코 무시할 수 없는 양의 인스턴스가 우리 눈에는 보이지 않는 메모리에 남게 됩니다.
그러니 필요 없어지는 인스턴스는 꼭 제거해주는 습관을 길러 주세요!

※ timer를 쓰기 싫은 분에게 단 2줄 코드
await get_tree().create_timer(1).timeout
queue_free()
편하게 타이머 쓰기를 추천 드립니다만, 매번 특정 시간마다 호출하고 싶을 때 마다 타이머를 넣기 귀찮으신 분은
await라는 빌트인 함수를 사용하실수도 있습니다. 이 두줄을 label의 _ready 부분에 넣어 주시면 됩니다.



■ 가만 있으면 심심하니 라벨이 떨어지게 해 보자!


첫 애니메이션입니다!
라벨이 아래로 떨어지게 만들어 봅시다.

이건 “실시간으로 처리되어야 하는 것”이기에 

func _process(delta):

함수에 등록되어야 하죠. 이런 애니메이션을 위해서 전용 물리 효과 함수

func _physics_process(delta):

라는 것도 있지만, 기본적으로는 같은 작동 방식이니 어떤 걸 써도 상관 없습니다.
피직스는 나중에 벨로시티를 공부할 때 사용해 보도록 하죠.





라벨에 애니메이션을 넣는 것이니, 라벨을 아래로 끌어다 놓으면...?
“.” 라는 문자가 생성됩니다. 이건 루트 노드라서 이렇게 표시되는 건데 전혀 문제 없습니다.

이게 좀 보기 싫으신 분은 그냥 self. 로 입력하셔도 됩니다.

$".".position.y += 3

또는

self.position.y += 3

매 프레임마다 라벨의 위치(position)의 Y축(세로)에 3씩 값을 올린다는 의미를 만들었습니다.
Y 축에 값을 더하면 아래로 내려가니, 반대로 위로 올라가게 만들고 싶다면 빼주시면 됩니다!

self.position.y -= 3

이대로 실행해 보시면...




아래로 추락하는 라벨이 완성되었습니다!


■ 동작을 한 단계 향상시켜 봅시다. delta 사용


우리가 만든 애니메이션은 “프레임”에 의존합니다. 120프레임으로 출력되는 컴퓨터에서는 초고속으로 내려갈 것이고,
반면 30프레임밖에 안나오는 컴퓨터에서는 느려터진 애니메이션이 될 겁니다.

이건 엄청 고전 게임을 요즘 컴에서 구동하면 미친 듯 빠른 속도로 돌아가는 증상을 겪어보신 분들이 계실텐데,
바로 프레임 기반으로 프로그램을 만들었을 때 발생하는 이슈입니다.

거기서 등장하는 것이 delta 값 입니다.

delta는 시간을 프레임으로 나눈 값으로써, 프레임이 낮은 컴퓨터나 높은 컴퓨터, 또는 프레임이 들쑥날쑥하는 컴퓨터에서도
일관적으로 부드러운 애니메이션을 구현할 수 있게 만든 값입니다.

방법은 간단합니다. 그저 움직임에 delta 값을 곱해주기만 하면 됩니다.

func _process(delta):
 self.position.y += 3 * delta

실행해 보면 굉장히 느린 것을 알 수 있습니다.
델타 값이 시간을 프레임으로 나눈 값인지라, 매우 작은 소숫점 값입니다.

그럼 간단하게 우리가 원하는 속도가 될 정도로 곱하는 값을 키워주면 끝이죠!
앞의 곱샘 값을 300 정도로 키워 보시면 (대충 100배 하면 됩니다), 괜찮은 속도로 움직일 것입니다.


■ 갑자기 사라지는 것은 어색하다! 서서히 사라지도록 만들자!

이건 라벨이 가지고 있는 다양한 인스펙터 값들을 우리가 이미 사용한 방법을 쓰면 끝입니다.
그리고 색상과 투명도를 조절하는 인스펙터는 modulate 입니다. 그리고 modulate 값 내부에서도 RGBA 의 alpha가 투명도를 의미합니다.

self.modulate.a -= 1 * delta



내려가면서 (투명도가 높아지는) 사라지는 라벨들

너무나 간단하게 해결되었고, 동시에 여러분들이 앞으로 공부할 방향도 느껴질 것입니다.
라벨이나 버튼이나 타이머, 이러한 것들이 가지고 있는 “인스펙터”을 알고, 그 값을 잘 조절할 수 있다면
여러분들이 원하는 많은 것들을 구현할 수 있을 것 같고,

그리고 그것은 거의 맞습니다.

수많은 게임의 구성 요소들은 단지 인스펙터의 값을 클릭할 때 마다 조정하는 것 만으로도 구현해 낼 수 있습니다.
그리고 오늘 학습한 인스턴스까지 활용하면 더욱 엄청난 활용도를 보여줄 것입니다.


■ 최종 목적인 “코인 획득”을 출력하자.

감을 잡으신 분들은 이건 굳이 알려드리지 않아도 혼자서도 하실 수 있을 내용입니다.
그저 우리가 만든 “라벨”의 “text”에 coinEff 값을 출력하면 끝이니까요.

이미 만든 라벨에 position을 바꿔 봤으니 그대로 text 값도 바꿔주는 내용만 추가하면 됩니다.




추가되었다는 의미에서 “+” 텍스트도 추가해 주고, coinEff는 숫자니까 str()을 사용해 텍스트로 바꿔주면 끝!




너무나 잘 작동합니다.


■ 응용편 - 다른 동작들도 만들어 봅시다.


움직임의 이해도도 높히기 위해, 라벨이 떨어지는 2가지 방식을 더 만들어 봅시다.

 - 중력의 영향을 받는 것 처럼 “점차 가속해서 떨어지는 라벨” 
 - 클릭하면 톡~ 튕기는 것 처럼 “뛰어 올랐다가 떨어지는 라벨”

낙하하는 물체는 중력 가속도라는 9.8m/s^2 이라는 물리적 관념은 지겨우실 테니...
단순하게 “매 초 속도가 더해진다(가속도)” 라는 것만 기억하시면 됩니다.

우리는 2개의 변수를 추가해 줄 필요가 있죠.
속도(speed)와 가속도(acceleration) 변수 입니다.

var speed = 0 # 물체의 속도 : 처음에는 멈춰 있을 테니, 기본 값은 0
var acceleration = 300 # 매 초마다 속도에 더해질 가속도입니다. 값을 조절하면서 가지고 놀아 보세요.




기존 코드
self.position.y = 300 * delta

에서 떨어지는 속도는 앞에 붙은 300의 값을 수정 했습니다. 그럼 우리가 준비한 speed를 300 대신 넣으면 떨어지는 속도를 설정할 수 있겠죠.

self.position.y = speed * delta

그리고 가속도는 “매 시간 속도에 추가되는 속도” = 속도에 가속도를 매번 (delta) 더해주기만 하면 됩니다.

speed += acceleration * delta



점차 아래로 가속되는 라벨이 완성되었습니다.

이번에는 튕기듯 날아가는 라벨로 한번 더 업그레이드 해 봅시다.
너무 쉽습니다. 그냥 “위쪽 방향으로 초기 속도(Speed)”만 추가해 주면 끝이거든요.
Y 좌표 기준 위쪽으로 튕기기 위해서는 - 값을 가져야 하겠죠?

var speed = 0
여기의 speed를 -150 정도를 입력해 봅시다.

비록 우리가 원하는 동작으로 정확하게 동작하고 있지만,
너무 빨리 사라져 버려서 결과를 확인하기 어렵네요.

그러니 인스턴스를 지워버리는 timer의 wait time을 3초까지 늘려주고,
텍스트를 투명하게 만들어 주는 modultae.a 값을 절반인 0.5로 낮춰줘 봅시다.




이제 위로 튕겼다가 아래로 떨어지는 라벨이 보이게 됩니다.
세로축으로만 움직이는게 조금 별로니, x축으로 관성운동 (그냥 옆으로 튕긴다는 말을 그럴듯하게 적어봤습니다)을 추가해 봅시다.

x축으로 움직이고 가속도 없다? 이건 우리가 처음 라벨이 떨어지게 만들었을 때와 굉장히 비슷하군요.
세로축인 y 대신 가로축인 x 값을 가진 움직임을 추가해 주면 됩니다.

self.position.x += 100 * delta








변수값을 크게 조절해 보면서 움직임의 변화를 보는 것도 좋은 경험이 될 겁니다.



글 읽어 주시는 분들에게 감사 인사 드리며, 이 글은 극 소수의 독자를 대상으로 작성되고 있습니다.

상호주의를 바탕으로 제 글에 찾아와서 댓글과 좋아요까지 눌러주시는 모든 분들께는 감사드리지만,

굳이 관심 없는 주제의 글까지 까지 찾아오지 않으셔도, 감사한 마음만 받겠습니다! 물론 좋아요와 댓글은 좋지만요 ㅋㅋㅋㅋ


여러분들의 즐거운 게임 개발을 응원하며,

다음편에서는 "크리티컬의 구현과 함수에 대한 이해"를 다뤄 볼까합니다.

따라하시는 와중에 막히거나 궁금하신 점은 언제든 댓글 남겨주세요 ^^


《 고도 엔진 입문글 모음 - https://page.onstove.com/indie/global/view/10204130


#godot #고도엔진 #입문 #튜토리얼 #게임만들기

촉촉한감자칩

🫡🫡🫡 즐겜을 위해 하루하루 살아가고 있습니다.

미소녀 게임, 건설 경영 게임을 사랑합니다!



로그인 후 댓글을 달아보세요!
문자 : 0/1000
배두나
24.06.0324.06.03 14:37 -00:00

게임쪽은 어릴때 포켓몬 개조버전 만들어 보겠다고 헥스코드 만져본게 다라.. 


촉촉한감자칩
24.06.0324.06.03 14:50 -00:00
작성자

이야... HEX 코드... 정말 골치 아픈 물건을 만지셨다니 ㅋㅋㅋㅋ

프로그래밍은 그래도 자연어(인간이 이해하기 쉬운 언어)에 가까운 언어지만,

HEX 코드나 어샘블리 같은 거의 직접적인 기계어는 진짜 너무 골아프던데요 ㅎㅎㅎㅎ


배두나
24.06.0324.06.03 15:31 -00:00

예전에 GBC 포켓몬 한글판 시리즈로 개조버전 만들던 1세대분이 헥스코드 유틸을 만드셔서  그래도 좀 쉽게 만졌던 것 같아요. 그래도 작업 하나하고 백업하고 계속 반복했던 것 같긴 하네요. 


구글드라이브에 사진 몇장 남아있네요 ㅋㅋ

예전에 보던 인터넷방송인 버전으로 만들려던거 같아요 ㅋㅋ

아인ii
24.06.0324.06.03 14:33 -00:00

끄얽....

방금 정독 했지만

그럼에도 언제나 어려운 프로그래밍의 세계네요


촉촉한감자칩
24.06.0324.06.03 14:48 -00:00
작성자

나름 쉽게 따라하실 수 있게 적으려 했지만... 역시 그 뿌리가 뿌리이니 ㅠㅠ

그래도 보면서 따라해보신다면 생각보다 별거 없이 척척 될겁니다 ㅎㅎㅎ


Sojeob
24.06.0324.06.03 14:27 -00:00


촉촉한감자칩
24.06.0324.06.03 14:28 -00:00
작성자


Chim
24.06.0324.06.03 10:52 -00:00

고전게임 프레임 이슈가 있는 줄은 몰랐네요

촉촉한감자칩
24.06.0324.06.03 11:14 -00:00
작성자

예전에는 아직 표준화가 덜 잡혀서 그랬는지, 정말 다양한 값을 갖고 게임의 속도를 결정했던 모양입니다 ㅎㅎ

도스 시절 게임들은 고정 프레임이 아닌 유동 프레임 (필요할 때만 새로 그리는 방식)으로, 요즘 방식으로 출력하면 그냥 게임이 울트라 스피드가 되어 버리기도.... ㅎㅎㅎㅎ

클럭이 고정된 콘솔 게임기는 CPU 클록을 기준으로 설계된 게임도 있어서, 에뮬에서 고정 클럭을 지원하지 않으면 초고속 게임이 되기도 하더라고요 ㅋㅋㅋ (PSP 철권이 대표적)