게임메이커 강좌

사용법 강좌에 앞서서 스크립트 사용을 편리하게 하기 위한 스크립트파헤치기 강좌를 2~3부정도 하겠다.

다운받아보니 양이 정말 방대하다..

그런데 그 중에는 불필요한 노가다로 용량을 떼워먹는 스크립트도 있었고 야 이건 정말 코딩이 잘 됬네!

하는 탄성이 절로 나오는 스크립트도 있었다.

 

지금부터 Easy RPG스크립트를 좀 더 보완하고 파헤쳐보면서 그 원리를 익혀보도록 하자.

 

-------------------------------------------------

일단 겜메를 열고 예제파일을 열자.

뭐든지 예제를 수정하면서 게임을 만드는게 편리하다.

 

우선 이것은 내가 스크립트를 몇개 둘러보면서 메모한 내용들이다.

오늘은 이것들 중 중요한 것 몇 개를 좀 파헤쳐 보겠다.

 

draw_ext
- draw_sprite_ext를 간단하게 쓰기 위한 스크립트
rpg_start
- 캐릭터 능력치 정의
*exp를 EXP로 교체
rpg_start_level
- 최대 레벨을 설정
rpg_stat
- 능력치 더하기
rpg_set_exp
- 레벨당 필요 경험치 설정
rpg_step_exp
- 레벨업 관리
*이런식으로 노가다를 할 필요를 없으므로 다르게 교체
rpg_striking
- 몹공격 스크립트

 

rpg_start와 rpg_stat, rpg_step_exp 등등 스크립트를 보니 크진 않지만 좀 치명적일 수 있는 결함이 보였다.

바로 경험치를 저장하는 변수인 exp.

크금이나 프금 유저들도 자주 하는 실수인데 이 exp는 이미 exp라는 함수가 정의되어 있다.

그런데 경험치를 저장한답시고 exp변수를 선언하고 그걸 사용한다면 에러가 나기 마련.

그러므로 스크립트들을 확인하면서 exp변수를 EXP변수로 바꿔주자.

겜메는 대소문자를 가리므로 EXP는 아무런 문제가 생기지 않는다.

(일일이 찾아서 바꾸지 말고 스크립트 편집창 위에 있는 돋보기아이콘을 클릭하여 나타나는 검색창을 이용하자)

 

자 이제 다음으로 rpg_step_exp스크립트를 살펴보자면, 이건 노가다가 너무 심각하다..

이렇게 되면 용량에도 부담이 가고 레벨이 조금만 더 방대해져도 작업량이 엄청나게 늘어나므로

노가다를 확 줄일 수 있는 방법이 필요하다.

아주 간단한 방법인데, 배열을 사용하면 편리하다.

지금부터 조금 복잡해질 것이다. 정신 똑바로 차리고 따라오길 바란다!

 

우선 rpg_set_exp스크립트부터 뜯어고쳐야 한다.

level1=argument0*1.1
level2=argument0*1.2
level3=argument0*1.3
level4=argument0*1.4
level5=argument0*1.5
level6=argument0*1.6
level7=argument0*1.7
level8=argument0*1.8
level9=argument0*1.9
level10=argument0*2.0
level11=argument0*2.1
level12=argument0*2.2
level13=argument0*2.3....

이렇게 되 있는데, 여기를 level[1]=~~~ 이런식으로 전부 바꿔주자.

조금 귀찮아도 나중에 편하려면 어쩔 수 없다.

이런 귀찮은 걸 시키면 너는 안하냐?! 하는 사람이 있을지도 모른다.

글 맨 아래에 인증샷을 올릴테니 꼭 봐라.(힘들긴 힘든데 오래걸리진 않는다)

 

좋다.다 됐는가?

이제 약간 손만 봐 주면 노가다 안녕~을 외치게 될 테니 조금만 더 힘을 내자.

 

rpg_step_exp스크립트를 열고, 전부 지우자.

이제 아까 그 방대했던 양을 단 두줄로 줄여보겠다.

얍!

if EXP>level[level]
{level+=1 EXP=0 attack+=50}

쨘~ 이러면 끝이다.

의심되면 경험치주는 옵젝 만들고 실험 해 봐라.

이러면 최고레벨을 늘릴때도 필요경험치와 최고레벨설정만 해주면 간단히 최고레벨을 늘릴 수 있다.

 

자, 이제 rpg_striking스크립트를 건드려보자.

if instance_exists(argument0)
{cris=random_range(0,1)

if cris=0
{{strk=floor((str*4)*attack/100)}
 if (argument0.mob_def<strg)
 {argument0.mob_hp-=strg-argument0.mob_def}
else
{instance_create(argument0.x,argument0.y+10,player_miss)}

if cris=1
{{strk=floor((str*5)*attack/50)}
 if (argument0.mob_def<strg)
 {argument0.mob_hp-=strg-argument0.mob_def}
else
{instance_create(argument0.x,argument0.y,player_miss)}}}}

내가 보기 편하게 줄을 좀 정리했다.

 

해석해보면서 조금씩 보완 해 보자.

 

만약 argument0에 입력된 인스턴스가 존재한다면

cris를 0,1사이의 수 중 랜덤하게 설정한다.

만약 cris가 0이라면  strk는 stk*4*attack/100 의 값으로 설정한다.

만약 argument0에 입력된 인스턴스의 mob_def보다 strg가 크다면

argument0에 입력된 인스턴스의 mob_hp에서 str-argument0에 입력된 인스턴스의 mob_def를 뺀다.

 

여기서 의문이 하나 드는데, strg는 어디서 날아온 변수인가?

아까 선언 된 변수는 분명 strk였다. 그래서 obj_player 옵젝을 둘러봐서 strg라는 변수가 있는지 찾아보았다.

없다.

또 하나, cris를 0과 1 사이의 수로 설정한다고 했다.

그럼 cris는 0.1이 될 수도 0.000134134235가 될 수도 있거늘 어찌 cris가 0또는 1일때만 공격이 되는가?

그렇다면 공격은 아~주 작은 확률로 들어간다는 말인가?

아니다. 이건 바람님의 실수일 것이다.

그래서 이 스크립트를 내 입맛에 맞게 조금 고쳐보겠다.

 

if instance_exists(argument0)
{cris=choose(0,1)

if cris=0
{{strk=floor(str*attack/200)}
 if (argument0.mob_def<strk)
 {argument0.mob_hp-=strk-argument0.mob_def}
else
{instance_create(argument0.x,argument0.y+10,player_miss)}

if cris=1
{{strk=floor(str*2*attack/200)}
 if (argument0.mob_def<strk)
 {argument0.mob_hp-=strk-argument0.mob_def}
else
{instance_create(argument0.x,argument0.y,player_miss)}}}}

 

이러면 몹이 공격을 받고 죽는 것을 볼 수 있다.

(데미지계산은 내가 조금 수정했다. 그대로 하면 데미지가 몹의 hp와 밸런스가 안맞아서..)

 

 

 

좋다!

이번 파헤치기는 이것으로 마치겠다.

파헤친 스크립트 말고도 맨 처음 메모했던 것 들 중 좀 파헤쳐 봤으면 좋겠다 하는 것이 있다면 덧글로 말하자.

 

 

 

 

 

 

 

배열 노가다 인증샷!

 

Who's 개촙포에버

profile

돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌돌

Comment '13'
  • profile
    개촙포에버 2013.02.28 13:16
    이 글은 바람님이 꼭 봐야 하므로 호출할테다!

    @은색바람
  • profile
    은색바람 2013.02.28 17:52
    아 저거 수정하면 안되요..ㄷㄷ
    저렇게 하면 에러나는데..
    그럴 필요 전혀 없어영
  • profile
    개촙포에버 2013.02.28 20:03
    어떤스크립트요?
    저는 에러가 안나던데요..
  • profile
    은색바람 2013.02.28 20:11
    저렇게 아래 노가다 하면 안되여
    그렇게 되면
    님은 더 끔찍한 노가다 해야됨
    아주 많이
  • profile
    개촙포에버 2013.02.28 20:14
    ?????
    레벨업스크립트를 두줄로 줄이기 위해서 []를 좀 붙였을 뿐입니다..
  • profile
    은색바람 2013.02.28 18:01

    exp는 바꾸든 말든 상관 없습니다.
    저거는 함수가 아니고 image_scale , image_angle 같은 변수도 아니기 때문에
    상관없습니다.

    exp(x) 자연대수의 바닥(e)의 x승을 반환합니다.
  • profile
    개촙포에버 2013.02.28 20:02
    앗 제 지식이 짧았군요!
    그래도 exp로 쓰면 찜찜하니 전 EXP로 쓰도록 하겠습니다 ㅋㅎ
  • profile
    은색바람 2013.02.28 20:12
    안되여
    이것은 이 스크립트에서 정해준 변수입니당.
    꼭 exp를 써야 exp는 반응을 합니당.
  • profile
    개촙포에버 2013.02.28 20:15
    아 제가 스크립트 찾아다니면서 다 EXP로 바꿨습니다.
    exp로 쓰는게 편한 사람은 exp로 쓰면 되고 EXP가 좋은 사람은 찾아다니면서
    exp를 EXP로 바꿔주면 되는거지요.
    크게 문제될 건 없다고 봅니다.
  • profile
    은색바람 2013.02.28 18:18
    근데 팀뷰어 있나요?
    qorwhddlrz@naver.com 으로 좀 추가해주시면 해서영...ㅎ
  • profile
    개촙포에버 2013.02.28 20:03
    팀뷰어는 들어본적도 없다능
  • profile
    BloodyRoyalBlueRoseKR357 2014.01.02 13:06
    으응?
  • profile
    개촙포에버 2014.02.09 20:16
    으으응?