질문과 답변

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 13179
RMVX rei paperdoll 스크립트관련 (설명有) 3 반내림 2012.11.13 947
기타 재편성?! 2 향연의꽃 2012.11.12 818
RMXP 아이템 색깔 스크립트 1 뱅뱅뱅 2012.11.11 805
기타 C++ 변수값에 대한 질문 하나 6 슈팅스타* 2012.11.11 1246
기타 게임 프로그래머 고용하려고 생각 중인데 얼마면 될까요? 1 탐험가 2012.11.11 1146
RMVX 카드슬롯 스크립트 2 빙하 2012.11.11 793
RMVX '어둠 그 안에서'처럼 PDA에 저장기능이 있는 기능 3 IB광팬~ 2012.11.11 1095
RMVX 액알이 무엇인가요? 3 IB광팬~ 2012.11.11 1006
RMXP 스크립트 작성 중... 설정하든 안하든 선택인 값(false → true) 넣기 13 하진 2012.11.11 829
RMVX AVANGS님의 합성샵 스크립트에서 계속 오류가 납니다. 2 file 빙하 2012.11.11 770
RMVXA VX ace는 사이드뷰배틀이없나요? 2 WOL 2012.11.10 1234
RMVX 도라에몽 바이오하자드처럼 하는 법 3 IB광팬~ 2012.11.10 1266
RMVX 허걱님의 글씨 표시 스크립트에서 글씨가 표시된 상태에서 저장 시 오류 1 톨톨 2012.11.10 843
RMVXA '아이템 소지수'의 스크립트 언어... 2 쿠쿠밥솥 2012.11.10 1053
RMVXA 액터 그래픽 변경 투명해지는 현상 4 xzrjs 2012.11.10 826
RMVXA rpg만드는데 초보나 다름없는 사람입니다. 6 너굴너굴 2012.11.10 724
RMVXA OGV 파일변환기가 존재하는지 알고싶습니다;; 2 xzrjs 2012.11.09 2606
RM2k3 RPG2003에 특정 로고가 뜨게 하는것 1 엑스트라 2012.11.08 1012
RMVXA 캐릭터 종범화 관련 질문입니다 3 file 테일리우스 2012.11.08 848
RMVXA 대화창에 나오는 얼굴사진 크기조절 문제 4 file xzrjs 2012.11.08 1359
Board Pagination Prev 1 ... 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 ... 517 Next
/ 517