메뉴 건너뛰기

창조도시 기록보관소

  • 이어하기예제.zip (634.7KB)(0)


  •  

     


     


    블로그 포스팅용으로 쓰던거 살짝 수정해 갖고 왔습니다 ;ㅅ;


     


    http://blog.naver.com/superrogin


     


     


    *** 주의 ***


    아래 스크립트는 알만툴 원래의 스크립트를 수정하는, 왕초보에게는 조금 위험한 작업이 될 수도 있습니다.


    잘 보고 따라만 하면 크게 오류날 일은 없을거예요. 아마.....


     


    오랫만에 알만툴 버닝좀 해봤지 말입니다.


    찰스형의 우라질볼프로젝트를 좀 돕다가 오랫만에 알만툴을 보니 참을 수 없어 스크립트 좀 건드려봤지 말입니다.


    도움말이 모두 영어및 일본어로 되어 있어서 반쯤은 감으로 끼워맞췄지 말입니다. ;ㅅ;


    (VX매뉴얼이나 그런것도 없이 그냥 C언어만 하던 근성으로 써봤습니다 ;ㅅ; 틀린부분은 지적바랍니다.)



    <적용전>(우라질볼中)


     



    <적용후>(몰라 그냥 새 프로젝트 한거임中)


    왼쪽 메뉴 화면에 '이어서 하기'가 추가되었다 ^^


    겉보기엔 매우 간단해 보인다 ^^


    자 그럼 스크립트로 표현하면? 



     



    *빨간색 부분만 바꿔주면 됩니다.


     


    1.우선 우리가 새로 만든 메뉴의 로딩의 언어를 새로 정의해 줄 필요가 있다. 


    다음 항목을 모듈란의 Vocab에 추가하자. Vocab모듈은 어휘를 뜻하는 Vocabulary 의 줄임말로, 말 그대로 게임내에서의 어휘들을 정의 해주는 스크립트들이다.


     


       # 메뉴에서 고른이어서 하기 
      def self.menu_continue
        return "이어서 하기"
      end


     


     우선 살펴볼 것은 스크립트에서 #으로 표시되는 부분이다 이는 C언어에서 //와 같은 역할을 한다. 즉 #이 있는 줄의 #이후부분은 주석 처리 된다는것. 능률적인 코딩을 위해선 주석을 자주 애용하자.


    def 는 definition으로 추정된다. (말했지만 도움말을 안읽었으므로 어디까지나 추정에 의해서만 ㄱ-;) 현재 C언어의 함수와 비슷한 기능을 하는것으로 추정중이다. 다시 말해 위 스크립트 전체를 해석하면 menu_continue라는 함수를 정의 하는데 이 함수는 "이어서 하기"라는 문자열을 리턴하고 종료된다는 뜻이다. 여기서 자신의 취향에 따라 "이어서 하기" 대신 "로드" 나 "카리스님 멋저요"등을 넣어보자.


    end는 함수및 앞으로 여러가지것들의 종료를 위해 사용되니 기억해두자.


     


    2.다음으로는 메뉴화면에 '이어하기'를 추가해야한다.


    먼저 이어하기가 유효한지 확인하여야 한다. 다시말하면 세이브파일이 있는지 없는지 확인해봐야 한다는 듯이다.


    이는 Scene_Title란에 동일한 기능을 수행하는 함수가 있으므로 그대로 카피해오면 된다.


    메뉴 화면은 Scene_Menu항목에 있다. 이제 Scene_Menu의 제일 위에 다음 스크립트를 추가하자.


     


      # 이어서 하기 유효 판정
      def check_continue
        @continue_enabled = (Dir.glob('Save*.rvdata').size > 0)
      end


     


    def 를 definition으로 해석한 이유다.


    여기서 def여기서 def는 함수라기 보다는 continue_enabled 라는 변수를 정의하기 위해 사용되어졌기 때문이다.


    잘은 모르겠지만 continue_enabled앞의 @는 아마도 변수를 뜻하는 접두어로 추정된다. 아니 어떨 때는 스위치로 쓰이기도 하는것 같다...


    좀 더 파헤쳐 본뒤 다음을 기약하겠다.


    Dir.glob('Save*.rvdata').size > 0


    이부분은 그 의미는 추측이 가지만 문법은 아직 파악하지 못했다. Dir는 Directory를 의미하는 것 같은데...


    대충 의미는 디렉토리 내부에 있는 Save*.rvdata라는 파일중 *에 해당하는 숫자가 0보다 큰 숫자를 가진 파일이 있는가, 있으면


    true 없으면 false를 리턴하라는 뜻인것 같다.


     


     


    3. 다음으로는 이어하기라는 명령을 만들어줘야 한다.


       다음을   # 이어서 하기 유효 판정 밑에 추가해보자.


     


    #이어하기 명령
      def command_continue
        if @continue_enabled
          Sound.play_decision
          $scene = Scene_File.new(false, false, false, true)
        else
          Sound.play_buzzer
        end
      end


     


    여기서 if 문이 쓰였는데 단순히     if @continue_enabled이렇게만 쓰여서... 아마  @continue_enabled 이것이 참이라면.... 이라는 뜻인것 같다.


    그래서 @는 스위치인것 같기도 하다고 언급한것.


    Sound.play_decision는 Sound 모듈내에 있는 play_decision 함수를 참조하라는 것으로 play_decision는 확인음을 재생하는 함수이다.


    그후 $scene 이건 현재 보이는 화면을 의미하며 $scene = Scene_File.new(false, false, false, true)


    은 장면 항목의 Scene_File를 기반으로 하는 장면을 새로 만들어서 현재 화면 위에 덧씌우라는 소리로 추정된다. 뒤에


    (false, false, false, true) 이건 밑에서 다시 설명하겠다.


    else는 C언어를 해본 분이라면 알겠지만 if에 해당하는 조건을 충족시키지 못했을 때이다.


    그럴때는 Sound.play_buzzer, 즉 경고음을 재생하는 것이다.


    그리고 if문의 끝에도 end를 붙이는것에 주의해야한다.


     


    다시말해 이 항목은 해석하자면, 이어하기가 가능할 경우 확인소리와 함께 이어하기 화면으로 장면을 전환하고, 그렇지 않으면 버저음만 울리고


    말라는 뜻이다.


     


    4. 이어하기 체크 명령을 만들어줬으면 체크를 해줘야 한다.


    따라서 Scene_Menu에서 def start라는 함수를 찾아보자. 이는 C언어에서 말하자면 일종의 int main() {  과 비슷한 의미로 생각해도 될것이다.


    즉 start라는 함수명은 이 항목의 시작을 알리는 함수인것이다. 이 항목의 시작에 우리는


     


    check_continue


     


    라는 것을 살짝 끼워넣어두어 아까 2번에서 정의해두었던 함수를 써먹기로 하자.


     


    5. 다음으로는 본질적으로 항목에 이어하기라는 것을 추가해보자.


    메뉴화면 왼쪽의 선택창을 띄우는 기능을 하는 함수는 def create_command_window 이다.(정확히는 @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6]) 이부분)


    역시 컨트롤 f로 이부분을 찾아보자.


    이것은 타이틀 화면이든 대화창에서든 선택지를 띄울 때 항상 필요한 것이므로 주의해서 잘 기억해두자.


    이 함수를 다음과 같이 수정해보자.


     


      def create_command_window
        s1 = Vocab::item
        s2 = Vocab::skill
        s3 = Vocab::equip
        s4 = Vocab::status
        s5 = Vocab::save
        s6 = Vocab::menu_continue
        s7 = Vocab::game_end
        @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6,s7])
        @command_window.index = @menu_index
        if $game_party.members.size == 0          # 파티 인원수가 0 명의 경우
          @command_window.draw_item(0, false)     # 아이템을 무효화
          @command_window.draw_item(1, false)     # 스킬을 무효화
          @command_window.draw_item(2, false)     # 장비를 무효화
          @command_window.draw_item(3, false)     # 스테이터스를 무효화
        end
        if $game_system.save_disabled             # 세이브 금지의 경우
          @command_window.draw_item(4, false)     # 세이브를 무효화
        end
        if not @continue_enabled                    # '이어서 하기'가 유효하지 않은 경우
          @command_window.draw_item(5, false)   # 커멘드를 반투명 표시로 한다
        end
      end


     


    달라진 부분은 s6,s7부분일것이다. 원래는 s6까지만 있었던 것에 s6에 해당하는 게임종료를 s7항목으로 미뤄버리고


    s6자리에는 이어하기 칸을 만든것이다.또한 맨 밑에


    if not @continue_enabled                    # '이어서 하기'가 유효하지 않은 경우
          @command_window.draw_item(5, false)   # 커멘드를 반투명 표시로 한다
    end


    부분도 추가되었는데, 이는 @continue_enabled 의 값이 false일 경우 (접두어가 if가 아닌 if not임에 주의하라.)


    @command_window.draw_item(5, false) 를 실행하라는 의미인데, 이는 6번째 항목을(숫자가 0부터 시작되었기에, 5는 6번째다) 반투명하게 하라는 뜻이다. 이와 관련해서는 Window_Command의 draw_item함수를 참조하라. '.'은 몇변씩 쓰였는데, 아마 in 정도의 뜻이 아닐까 생각한다.


    전체적으로 해석하자면 s1~s7이라는 항목을 정의해주고(여기서 s6의 항목이 바로 우리가 1번에서 정의해주었던 이름이다.)


    @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6,s7])


    여기서 총 7개의 선택지를 만든다. 160은 창의 너비(가로길이)이고 s1~s7은 선택지 항목이다.


    밑에부분은 주석에 상세히 설명되어 있으므로 생략한다.


     


     


    6.항목을 만들었으면 그 항목을 실행했을 경우 어떤 일이 일어날지 정의해주자.


    자 이제   # ● 커멘드 선택의 갱신 부분을 찾아보자. 여기서는 선택한 선택지가 어떤 기능을 하는지를 보여준자.여기를 통째로 다음과 같이 바꿔보자


     


      def update_command_selection
        if Input.trigger?(Input::B)
          Sound.play_cancel
          $scene = Scene_Map.new
        elsif Input.trigger?(Input::C)
          if $game_party.members.size == 0 and @command_window.index < 4
            Sound.play_buzzer
            return
          elsif $game_system.save_disabled and @command_window.index == 4
            Sound.play_buzzer
            return
          end
          Sound.play_decision
          case @command_window.index
          when 0      # 아이템
            $scene = Scene_Item.new
          when 1,2,3  # 스킬, 장비, 스테이터스
            start_actor_selection
          when 4      # 세이브
            $scene = Scene_File.new(true, false, false, false)
          when 5      #로드
            command_continue
          when 6      # 게임 종료
            $scene = Scene_End.new 
          end
        end
      end


     


     


    바뀐 부분은 마지막 몇줄인


          when 5      #로드
            command_continue
          when 6      # 게임 종료
            $scene = Scene_End.new 


    이다. command_continue는 우리가 3번에서 만들어준 이어하기 명령을 실행하는 부분이며


    when 6을 추가하여 (순서로는 7번째지만 다시한번 0부터 시작되었음을 상기하라) 원래 6번째 항목이던 게임 종료화면으로의 이동을


    7번째순서로 밀어넣은것이다.


     


     


     


     


    ***자 사실 여기까지만 하면 잘 되는것을 확인할 수 있다. (3번의 $scene = Scene_File.new(false, false, false, true)를 $scene = Scene_File.new(false, false, false)로 바꾸고 6번의 $scene = Scene_File.new(true, false, false, false)를 $scene = Scene_File.new(true, false, false)로 바꿔줘야 한다. 다음 과정을 하고 싶다면 바꾸지 않길 바란다.)


    그러나 완벽함을 추구하자면 아직 멀었다. 왜냐? 여기까지만 하고 이어하기를 눌렀다가 취소를 누르면 메인화면으로 돌아가버린다는 것을 알 수 있다. 이는 애초에 이어하기는 메뉴에서 할 수 밖에 없기때문에 게임화면으로 돌아가는 기능이 없는 것이다.


    완벽에 완벽을 기하자면 이 또한 바꿔주자.


     


     


     


     


    7. 이어하기 화면에서 취소를 누르면 타이틀이 아닌 메뉴화면으로 되돌아가게 만들어보자!


    이를 위해서 이제 Scene_File항목을 살펴보자 이곳은 이어하기및 저장하기를 관리하는 곳이다.


    먼저   # ● 오브젝트 초기화 항목을 살펴보자. 이것을 다음과 같이 바꿔주자


     


      def initialize(saving, from_title, from_event, menu_load)
        @saving = saving
        @from_title = from_title
        @from_event = from_event
        @menu_load = menu_load
      end


     


    바뀐 부분은  def initialize(saving, from_title, from_event, menu_load)와 @menu_load = menu_load이다


    C언어를 해본 사람이라면 알겠지만 함수를 선언할 때는 매개변수를 이용할 수 있으며, 그것은 루비어(rgss,즉 알피쥐 만들기 씨리즈의 언어)에서도 마찮가지다. 여기선 매개변수라기보단 매개스위치라는 말이 어울릴듯 하다. 원래는 saving, from_title, from_event 즉, 세이브인지, 타이틀에서 온건지 이벤트에서 온건지를 묻는다. 역시 메뉴화면에서 왔냐고 묻는건 없으므로 우리는 menu_load로드라는 항목을 추가해 준것이다.


    그 아래부분은 매개 스위치를 Scene_File에서 쓸 수 있게 받아준것 같다. 제대로 이해했다면 ***에서 괄호안에 말한바를 이해할 것이다.


     


     


    8.  돌아가보자


      # ● 원래의 화면에 돌아온다 항목을 찾아 다음으로 대체해주자.


     


     def return_scene
        if @from_title
          $scene = Scene_Title.new
        elsif @from_event
          $scene = Scene_Map.new
        elsif @menu_load
          $scene = Scene_Menu.new(5)
        else
          $scene = Scene_Menu.new(4)
        end
      end


     


    여기서 바뀐 사항은     elsif @menu_load
          $scene = Scene_Menu.new(5)
        else
          $scene = Scene_Menu.new(4)


    이부분이다.  이쯤되면 눈치챘겠지만 @menu_load가 true값일경우(우리는 3번에서 $scene = Scene_File.new(false, false, false, true)명령을 통해 메뉴에서 이어하기를 누르면 4번째 매개 스위치, 즉 menu_load에 true값을 넣어줬다.) Scene_Menu.new(5), 즉 메뉴화면의 6번째 항목으로 이동하라는 소리가 된다. (몇변씩 말하지만 숫자 0부터 시작하므로 5는 6번째를 뜻한다.)


     


     


     


     


    ****자 이쯤 되면 실행해도 별다른 오류가 없는것처럼 보인다. 그러나 눈치빠른 사람이라면 벌써 눈치챘겠고, 그렇지 않은 사람이라면 게임만들고


    한참 후에야 눈치챌 수도 있다. 문제는 스크립트란이 아닌 맵위의 이벤트 상에서 나타난다. 맵위의 이벤트를 통해 세이브화면을 열게 되면 오류가 나타나는 것이다. 이것은 원래는 저장화면을 불러올 때 3개의 매개 스위치를 이용했는데 우리는 이것을 4개로 바꿔주었다. 그러나 맵상에서 세이브를 하려할 땐 아직 매개스위치가 3개인 상태이므로 이것을 안바꿔줬기 때문이다. 마무리로 이것 까지 바꿔주자.


     


     


    9. 맵상에서 세이브를 할 때의 매개스위치를 4개로 바꿔주자.


    맵상에서 이뤄지는 세이브므로 이에 해당하는 항목은 Scene_Map에 있다.


    Scene_Map에서    # ● 세이브 화면으로 변환 항목을 찾아 다음과 같이 바꿔주자.


     


      def call_save
        $game_temp.next_scene = nil
        $scene = Scene_File.new(true, false, true, false)
      end


     


    또한 타이틀 화면에서 이어하기를 할 때도 적용 되므로 Scene_Title● 커멘드 : 이어서 하기부분도 바꿔준다.


     


     def command_continue
        if @continue_enabled
          Sound.play_decision
          $scene = Scene_File.new(false, true, false, false)
        else
          Sound.play_buzzer
        end
      end


     


    역시 눈치빠른 사람이라면 이미 알아차렸겠지만 맨 마지막에 false항목이 추가 되었다. 맨 마지막은 메뉴화면에서 로드화면을 불러왔는지인데 여기서는 맵상에서 불러왔기 때문이다.


     


     


    자 여기까지 수고하셨습니다 ^^ 궁금한점은 댓글로 남겨주세요 ^^




     


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


     


    블로그 포스팅용으로 쓰던거 살짝 수정해 갖고 왔습니다 ;ㅅ;


     


    http://blog.naver.com/superrogin




     
    번호 제목 글쓴이 날짜 조회 수
    469 액션게임만들기(Action Game Maker) HELP파일 번역 [1] 다프트캣 2009.08.04 1523
    468 본문 스크랩ㅡ 언리얼 엔진2 [1] 세죠 2009.07.19 1427
    467 본문 스크랩ㅡ 게임 브리오 엔진 소개 세죠 2009.07.19 787
    466 본문스크랩- rpg 제작툴 NWN [1] 세죠 2009.07.07 979
    465 넷플레이 스크립트 2.0 사용법 [3] 독도2005 2009.05.03 1450
    464 알만툴에서 윤년표현 file 엘류트 2009.04.23 899
    463 커맨드입력 [4] 엘류트 2009.04.16 1107
    462 잠입액션에서 적의 시야 설정하기 (예제有) [4] file rhj 2009.03.15 1361
    461 자동 길찾기 기능을 만들어보자 [3] file Black-☆ 2009.02.14 1279
    460 게임을 시작한다음 튕기게 해보자(?) [5] file 켈군 2009.02.04 1222
    » [VX] 메뉴화면에 이어하기를 넣는 스크립트... 카리스 2008.12.15 1222
    458 [RPG XP]스크립트를 이용한 SRPG 이동범위 산출 및 범위 보여주기 [4] file 신덴 2008.11.19 1561
    457 [vx]주인공들 체력 변수로 관리하기 (스크립트) 나나야츠루 2008.10.02 1260
    456 0.0초를 다룰때 조심할점 [2] A. 미스릴 2008.10.02 1148
    455 SRPG 만들기 강의 - 0. SRPG는 무엇일까? [6] contect 2008.07.23 2390
    454 주인공들의 유형. [1] [3] 히트맨 2008.07.10 1459
    453 [아이디어, 기획] 쿠소게임의 대반란 A. 미스릴 2008.07.09 1271
    452 [VX] 창문으로 빛이 뚫고 나오게 하기 [뽀샵] [2] 정의로운녀석! 2008.06.22 1873
    451 [VX] 집안의 블라인드 다듬기 ~2차 블라인드 [1] 정의로운녀석! 2008.06.22 1197
    450 엔진 제작중...... 랜스 2008.05.20 1088