질문과 답변

Extra Form


우선... 준돌 님의 스크립트를 참고해서 간단히 아래처럼 만들고 있었습니다.

한 이벤트의 범위 내에 들어가서 결정키를 누르면, 스위치 / 셀프스위치 / 변수가 조작되도록 하는 것인데요.

예를 들면

 

1) EV001의 이동경로 설정에 스크립트로 (1, "스위치", 270, "on") 을 넣으면

    EV001의 범위 1칸 안에 들어가 (=올라서서) 결정키를 눌렀을 때, 스위치 270번이 ON 됩니다.

 

2) EV050의 이동경로 설정에 스크립트로 (3, "셀프스위치", [3, 50, "A"], "on") 을 넣으면

    EV050의 범위 3칸 안에 들어가 결정키를 눌렀을 때, 3번 맵의 50번 이벤트(이 이벤트)의 셀프스위치 "A"가 ON됩니다.

 

이런 식입니다.

 

 

그런데 문제는...

위의 예시처럼 "스위치"와 "셀프스위치"는 잘 작동하는데,

"변수" 부분이 안 됩니다.

설정한 '값'만큼 조작(+-)되도록 하려는데... 안 먹히네요. ('값'은 설정하든 안하든 선택)

일단 문제인 것 같은 부분을 빨간표시 해봤는데... 어느 부분이 잘못된 걸까요?

 

이하 스크립트 내용입니다.

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

class Game_Character
  def 범위안결정(dist_n, 조작대상, 조작대상아이디, 방식, 값 = false)
    dist = (self.x - $game_player.x).abs
    dist += (self.y - $game_player.y).abs
  if dist < dist_n
    @조작대상 = 조작대상
    @조작대상아이디 = 조작대상아이디
    @방식 = 방식 
    @값 = 값

    # C 버튼(결정키)이 눌렸을 경우
    if Input.trigger?(Input::C)
      if @조작대상 == "스위치"
        case @방식
        when "on"
          $game_switches[@조작대상아이디] = true
        when "off"
          $game_switches[@조작대상아이디] = false
        end
      end
      if @조작대상 == "셀프스위치"
        case @방식
        when "on"
          $game_self_switches[@조작대상아이디] = true
        when "off"
          $game_self_switches[@조작대상아이디] = false
        end
      , if @값 == true
        if @조작대상 == "변수"
          case @방식
          when "플러스"
            $game_variables[@조작대상아이디] += 값
          when "마이너스"
            $game_variables[@조작대상아이디] -= 값
          end
        end
      end
    end
  end
end
end
end 
-----------------------------------------------------------------------------------------------------------------------------------------

 

저렇게 설정한 "변수"가 '값'만큼 조작되게 하려면, 어떻게 고쳐야 할까요?

 

*ps. 이걸 만드는 이유는... 이벤트 내용 (실행 내용)을 통하지 않고, 스크립트만을 통해서 스위치/변수 등의 조작이 이루어지게 하기 위함입니다. (사용중인 메시지스크립트의 일부 기능과 병용하려면, 이런 방식으로 가야 해서요)

Comment '13'
  • profile
    습작 2012.11.11 14:07

    0.

     

      위 스크립트 문에서 조건문을 여닫는 것이 잘 못 되었습니다. 스위치 관련 조건문 이후 셀프스위치 관련 조건문을 작성하셨는데, 닫지 않은채로 이어서 변수 관련 조건문을 작성하셔서 셀프스위치 관련 조건문 속에 변수 관련 조건문이 포함되어 버렸습니다. 저는 if문으로 나열해도 되겠지만, 어짜피 해당 조건들이 동시에 작동할 일이 없는 관계로 그냥 case 문으로 정리해 보겠습니다. 그럼 수고하세요.^^


    class Game_Character 

      def 범위안결정(dist_n, 조작대상, 조작대상아이디, 방식, 값 = false) 

        dist = (self.x - $game_player.x).abs 

        dist += (self.y - $game_player.y).abs 

        if dist < dist_n 

          @조작대상 = 조작대상

          @조작대상아이디 = 조작대상아이디

          @방식 = 방식 

          @값 = 값

          # C 버튼(결정키)이 눌렸을 경우

          if Input.trigger?(Input::C)

            case @조작대상

            when "스위치"

              case @방식

              when "on"

                $game_switches[@조작대상아이디] = true

              when "off"

                $game_switches[@조작대상아이디] = false

              end

            end

            when "셀프스위치"

              case @방식

              when "on"

                $game_self_switches[@조작대상아이디] = true 

              when "off"

                $game_self_switches[@조작대상아이디] = false

              end

            when "변수"

              if @값 != false

                case @방식

                when "플러스"

                  $game_variables[@조작대상아이디] += 값

                when "마이너스"

                  $game_variables[@조작대상아이디] -= 값

                end

              end

            end

          end

        end

      end

    end



  • ?
    하진 2012.11.11 20:53
    헉...! 셀프스위치 하고서 if문을 안 닫아서였군요!;; 이런.. 내 눈은 옹이구멍인가;;;
    아예 이렇게 case case 해서 정리해주시니 더 깔끔해졌네요. 당장 넣어보겠습니다
    항상 속시원한 답변 감사합니다, 습작님!!
  • ?
    하진 2012.11.11 21:44

    그런데 습작님

    여기에 연계해서 하나만 더 질문해도 될까요...?

     

    지금 여기선 '액터와 이벤트 사이의 거리가 이러이러하면' 이 첫 조건(if)이죠...

    근데 대신에, '액터가 이 이벤트를 향하고 있으면' 을 넣을 수도 있을까요? 가능할까요...??; 뭐라고 써야 가능할까요??

     

    일단 손을 대려면

    dist = (self.x - $game_player.x).abs
    dist += (self.y - $game_player.y).abs
    if dist < dist_n

    이 부분인 것 같은데...... 이런 건 뭘 어디서부터 어떻게 써야 될 지.......... 아니 과연 가능은 한 건지;;; 모르겠네요.

     

    (왜 굳이 이렇게 하려고 하냐면...
    사용중인 메시지스크립트의 \pass기능과 병용하기 위해서입니다. 그러려면 조작내용(스위치/변수 등)이 이벤트 실행 내용을 통해서 동작하면 안 되고, 스크립트를 통해(이동경로설정+병렬처리 등으로만) 동작되어야 하기 때문이지요)

    이게 가능해지면, 특정메시지가 표시되는 도중에도 플레이어가 돌아다니며 이것저것 들추고 조사하고... 하는 게 가능해지거든요. 그래서 꼭 구현하고 싶습니다.

     

    뭐가 또 길어져버렸네요... 되시는 대로만 답변 주시면 돼요! 읽어주셔서 고맙습니다!!

  • profile
    습작 2012.11.12 09:29
    1.


      아래처럼 작성해나가면 되지 않을 까요? 테스트는 하지 못해서 제대로 작동할지는 잘 모르겠네요. 시험해보시고 답변주세요.^^

     

    sx = $game_player.x - @x
    sy = $game_player.y - @y
    if sx == 0 and sy == 0
      direction_check = false
    elsif sx.abs > sy.abs
      direction_check = sx > 0 ? $game_player.direction == 4 $game_player.direction == 6
    else
      direction_check = sy > 0 ? $game_player.direction == 8 : $game_player.direction == 2
    end
    if direction_check

  • ?
    하진 2012.11.13 01:24

    지금 막 넣어보고 왔습니다.
    돼요...... 진짜 돼요...!!! 허헐 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
    저 설정하는 괄호()안에 disn_n 없애고 껴넣으니까, 바로 되네요. 아......

    덕분에 또 중요한 기능 하나를 구현을 했네요. 항상 고맙습니다 습작님. 혼자서 헤매가지곤 절대 이렇게 쉽게 못했을 텐데...
    잘 쓰겠습니다.

    ps. 아 근데 이 스크립트, 언제한번 전문을 게시판에 올려서 공유하면 어떨까 싶은데요. 습작님 이름은 뭐라고 넣는 게 좋으세요...? ('습작' 'etude87' 중) 혹시 원치 않으시면 그냥 안 쓸 수도 있고요.

  • profile
    습작 2012.11.13 01:31
    질답게에 적는 코드들에 대해서 딱히 관리하고 있지 않기 때문에 원하시는 대로 하시면 될 것 같네요.^^
  • ?
    하진 2012.11.13 02:42
    

    알겠습니다.

    저 근데 습작님... 죄송하지만 한 번 더 질문을 해야 할 것 같습니다. orz

    짜주신 저 부분을 넣어서 적용시켰더니... 처음에 오오 된다 했는데,

    '액터가 맵의 어디에 서 있든간에, 그 이벤트를 향하고만 있으면' 그 이하의 조작이 이행되더라고요.

    (심지어 그 이벤트들이 화면에서 완전히 벗어나도... 그냥 방향만 그쪽을 향하고 있으면, 조작내용이 이행됩니다)

     

    그래서, 1칸 앞에 서서 향했을 때에만 동작하도록  disn_n 부분을 다시 끼워넣었는데...... 그랬더니 안 되네요. 아무것도. ㅠㅠ

    그냥 if가 한 번 더 들어간 것 뿐인데, 전혀 동작을 안 하게 되는 이유를 모르겠습니다.

    이하 끼워넣은 상태의 스크립트입니다. (빨간글씨가 끼워넣은 부분)

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

    class Game_Character
      def 향하고결정(dist_n, 조작대상, 조작대상아이디, 방식, 값 = false)
        dist = (self.x - $game_player.x).abs
        dist += (self.y - $game_player.y).abs
        if dist < dist_n
        sx = $game_player.x - @x
        sy = $game_player.y - @y
        if sx == 0 and sy == 0
          direction_check = false
        elsif sx.abs > sy.abs
          direction_check = sx > 0 ? $game_player.direction == 4 : $game_player.direction == 6
        else
          direction_check = sy > 0 ? $game_player.direction == 8 : $game_player.direction == 2
        end
        if direction_check
          @조작대상 = 조작대상
          @조작대상아이디 = 조작대상아이디
          @방식 = 방식
          @값 = 값
          # C 버튼(결정키)이 눌렸을 경우
          if Input.trigger?(Input::C)
            case @조작대상
            when "스위치"
              case @방식
              when "on"
                $game_switches[@조작대상아이디] = true
              when "off"
                $game_switches[@조작대상아이디] = false
              end
            when "셀프스위치"
              case @방식
              when "on"
                $game_self_switches[@조작대상아이디] = true
              when "off"
                $game_self_switches[@조작대상아이디] = false
              end
            when "변수"
              if @값 != false
                case @방식
                when "플러스"
                  $game_variables[@조작대상아이디] += 값
                when "마이너스"
                  $game_variables[@조작대상아이디] -= 값          
                end
              end
            end
          end
        end
      end
    end
    end

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

    저렇게 끼워넣으면 안 되나요..?? 뭔가 다른 조치가 더 필요한 걸까요?

    으아 자꾸 긴 질문을 해서 죄송합니다ㅠㅠ 혹시 안 되면 그냥 이제껏 된 기능이랑 절충해서 쓰든가 하겠습니다. 고맙습니다.

  • profile
    습작 2012.11.13 11:47

    2.

     

      댓글이 계속되어 폭이 좁아지는 관계로 이곳에 새로 댓글을 남깁니다. 아래와 같이 하시면 되리라 생각됩니다. 그럼 수고하세요.


    class Game_Character 

      def 범위안결정(dist_n, 조작대상, 조작대상아이디, 방식, 값 = false) 

        dist = (self.x - $game_player.x).abs 

        dist += (self.y - $game_player.y).abs 

        sx = $game_player.x - @x

        sy = $game_player.y - @y

        if sx == 0 and sy == 0

          direction_check = false

        elsif sx.abs > sy.abs

          direction_check = sx > 0 ? $game_player.direction == 4 : $game_player.direction == 6

        else

          direction_check = sy > 0 ? $game_player.direction == 8 : $game_player.direction == 2

        end

        if direction_check && dist < dist_n 

          @조작대상 = 조작대상

          @조작대상아이디 = 조작대상아이디

          @방식 = 방식 

          @값 = 값

          # C 버튼(결정키)이 눌렸을 경우

          if Input.trigger?(Input::C)

            case @조작대상

            when "스위치"

              case @방식

              when "on"

                $game_switches[@조작대상아이디] = true

              when "off"

                $game_switches[@조작대상아이디] = false

              end

            end

            when "셀프스위치"

              case @방식

              when "on"

                $game_self_switches[@조작대상아이디] = true 

              when "off"

                $game_self_switches[@조작대상아이디] = false

              end

            when "변수"

              if @값 != false

                case @방식

                when "플러스"

                  $game_variables[@조작대상아이디] += 값

                when "마이너스"

                  $game_variables[@조작대상아이디] -= 값

                end

              end

            end

          end

        end

      end

    end


  • ?
    하진 2012.11.14 02:04
    이.. 것은...
    이렇게저렇게 갖다붙여 보면서 해봤던 조합이네요... 근데.. 안 됐죠......ㅠㅠ
    이걸로 해봐도 마찬가지네요. syntax error(중간에end) 없애고 나서도... 그냥 작동을... 안 해요......

    뭔가 더 복잡한 조치가 필요한가보네요 이건... 좀 헤매보다보면 알 수 있겠죠. ㅠㅠ
    그래도 우회할 방법이 전혀 없는 건 아니니까요, 되는 기능들로 절충안을 찾아가야겠습니다.
    앞서 알려주신 것부터 해서, 많은 도움이 되었습니다. 감사합니다.
  • profile
    습작 2012.11.14 08:54

    3.

     

      시간이 나거든 테스트 해보도록 하겠습니다. 테스트 해보고 문제해결 되거든 댓글로 달아드리거나 첨부파일로 올려드릴게요. 그럼 수고하세요.^^


  • profile
    습작 2012.11.14 15:43 Files첨부 (1)

    4.


      중간에 end 지우고, 더 손댄것이 있는지는 조금 가물가물하긴 한데, 아무튼 일단 프로젝트에 넣고서 돌려보았습니다. 한번 확인해 주시고, 문제 있거든 피드백 부탁드릴게요.^^

     

    XP QA Project.zip



  • ?
    하진 2012.11.15 02:52

    알겠습니다 해볼게요...!!
  • ?
    하진 2012.11.16 21:49
    확인해보았습니다!
    이번엔 꼼꼼하게 다 봤어요. 도입후 여러 이벤트에서 테스트해보고, 예제에 해주신 대로 이벤트 병렬처리로도 해보고, 이동경로 설정으로도 해보고...... 전부 다 잘 되더군요.
    (근데, 이게 제가 했을 때 안 됐던 이유가..... 이제보니 이벤트 설정할 때, dist_n에 2가 아니라 1을 넣어놯었더라고요.;; 그러니 당연히.........ㅠㅠ 근데 예제에서 보여주신 대로 2로 하니까 딱 되네요. 시작조건(트리거)을 '결정 버튼 눌렀을 때'로 했을 때와 마찬가지로 작동해요. 단지, 반응속도가 좀 느릴 뿐...)

    반응 속도는... 이렇게 병렬처리(or이동경로설정)시킬 경우, '결정 버튼 눌렀을 때'보다는, 많으면 한 1초? 정도 늦더라고요. (매번 달라요. 근데 늦으면... 예를 들어 셀프스위치"A"on 후, 병렬처리로 문장이 표시되게 해뒀다면 → 결정키 누르고 몇 걸음 움직이다보면 문장이 뜨는 정도...?) 그런데 이 부분은, 병렬처리의 특성상 시간이 걸릴 수밖에 없는 거겠죠? 아무래도...

    근데 지금으로선, 이런 식의 조작이 가능하기만 해도 충분하니까요. 덕분에 필요한 기능을 완전히 갖추고... 사용상 주의점까지ㅋㅋ 알 수 있게 되었습니다. 예제로 뙇 보여주시지 않았음 또 한참 헤맬 뻔 했네요...

    정리가 되는 대로, 게시판 등을 통해서 공유할 수 있도록 해보겠습니다. 항상 세심한 도움 주셔서 감사합니다...! (_ _)

List of Articles
종류 분류 제목 글쓴이 날짜 조회 수
공지 묻고 답하기 가이드 습작 2014.06.14 12391
RMXP 대화 형식 이벤트 3 오늘밤어때 2012.11.14 717
RMXP 아이템 색깔 스크립트 1 뱅뱅뱅 2012.11.11 801
RMXP 스크립트 작성 중... 설정하든 안하든 선택인 값(false → true) 넣기 13 하진 2012.11.11 827
RMXP 이 스크립트 실행 될까요? 1 file 생초짜 2012.11.03 834
RMXP 겹쳤을때 이벤트 발생하기 / 이벤트변수 참조법 질문입니다. 1 한우형 2012.11.01 1102
RMXP 알만툴에서 수식을 사용할 수 있나요?? 2 맵만드는중.. 2012.10.28 928
RMXP 윈도우 스킨 형태 자체를 바꿀수는 없나요? 2 file 네츄랄미네랄 2012.10.27 2090
RMXP 게임을 하고 있지 않은경우 라는 조건 1 CJYG* 2012.10.27 652
RMXP 특정 일본어나.. 특정한자를쓰면 물음표로..표시되는거.... 1 루미니아스 2012.10.27 1462
RMXP 이벤트 - 스크립트로 애니메이션표 실행하는법좀 알려주세요. 세르젠 2012.10.26 699
RMXP xp에서 이벤트로 은행 작성중 오류발생 5 file 율페 2012.10.25 875
RMXP 이거 왜이렇죠;;; 3 file 미친킴'S 2012.10.24 1039
RMXP 게임창 비활성화시 Pause되지 않도록 할 수 있나요? (동작이 계속되도록) 1 하진 2012.10.24 1232
RMXP 페이스 메이커... 2 file 아아방스임 2012.10.23 1223
RMXP 대화창 크기 조절 1 오뚱담 2012.10.20 939
RMXP 소리가 나질 안아요 ureazy 2012.10.19 663
RMXP 케릭터가 가만히 있을 때 움직이게 하는방법 2 하얀솜털 2012.10.15 743
RMXP 대화할때 딱딱 끊어서 말하는 거요 4 오늘밤어때 2012.10.14 1163
RMXP VX캐릭터를 XP캐릭터로 전환하는 방법 (또는 2003 캐릭터를 XP로) 2 KimRocial 2012.10.13 1329
RMXP 스위치쓰면 멈춰요ㅠ 3 내생의맥쥬 2012.10.13 1015
Board Pagination Prev 1 ... 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 ... 90 Next
/ 90