질문과 답변

Extra Form

제가 상점 시세 스크립트 때문에 골머리를 앓고 있습니다.

 

이전에 올렸던 버전은 테스트를 해보니까 명령어가 제대로 안먹히길래 왜 그런가 했더니

 

모듈의 데이터가 클래스의 데이터랑 같이 변동하더라고요;;;

 

무슨 소린고 하니...

 

module IMIR_SHOP
  
  SHOP = [] # 상점 번호에 따른 초기 상품 갯수 자료.
 
  SHOP[0] = []
  SHOP[0][0] = [] # 0 : 아이템
  SHOP[0][0][0] = nil # 0번 아이템은 없으므로 nil 처리
  for id in 1..ITEM_MAX
    SHOP[0][0][id] = [ 0, 100]
  end

end

 

대충 이런 식으로 기초 데이터를 설정하고

 

class Game_Shop
  #--------------------------------------------------------------------------
  # ● 공개 인스턴스 변수
  #--------------------------------------------------------------------------
  attr_accessor :commodity # 상점 상품 목록
 
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    @commodity = []
    set_commodity
  end
 
  #--------------------------------------------------------------------------
  # ● 자료 초기화
  #--------------------------------------------------------------------------
  def set_commodity
    @commodity = []
    @commodity = IMIR_SHOP::SHOP
  end

end

이런 식으로 클래스의 변수를 초기화 할때 모듈의 데이터값을 @변수에 줬습니다.

 

그리고 자료 초기화 이후에는 원본 자료가 필요할 때 모듈의 데이터값을 가져가다 비교대상으로 써먹었습니다.

 

그러면 제 생각에는 모듈의 데이터는 그대로 있고 클래스의 @변수 값만 변해야 정상일 텐데

 

이벤트의 스크립트를 이렇게...

 

n=$game_shop.commodity[1][0][1][0]
l=IMIR_SHOP::SHOP[1][0][1][0]

$game_variables[2] = n
$game_variables[3] = l

 

이 아래에 변수를 문장의 표시로 나타내게 해봤더니 물건을 구매하니 ( @변수를 건드렸더니 

물론 Scene_Shop에서는 $game_shop.commodity[1][0][1][0]를 움직이게 했습니다)

IMIR_SHOP::SHOP[1][0][1][0]값도 같이 변하더군요.

 

이 부분을 도통 이해할 수가 없네요;;;

 

덤으로 어떻게 안될까... 하고 시행착오를 하다가

 

Game_Temp클래스에다

 

  attr_accessor :commodity               
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  alias com_ini initialize
  def initialize
    com_ini
    @commodity = []
  end

 

이런 @변수를 만들어서

 

class Game_Shop

  #--------------------------------------------------------------------------
  # ● 자료 초기화
  #--------------------------------------------------------------------------
  def set_commodity
    @commodity = []
    @commodity = IMIR_SHOP::SHOP
    $game_temp.commodity = IMIR_SHOP::SHOP
  end

end

 

이런 식으로 초기화를 시켰더니 $game_temp.commodity는 변하질 않더군요.

즉, 원하던 결과를 얻긴 했는 데 이게 제대로 얻어 걸린 건지... 아니면 이렇게 했을 때 어떤

문제가 발생할런 지 걱정입니다. 가뜩이나 전공 공부한다고 이쪽에 쓸 시간이 없는데,

아이디를 달고 올린 스크립트는 엉망이니 부끄럽기만 하고 ...;;;

 

도대체 클래스의 @변수와 모듈은 어떤 관계이길래 사람을 이렇게 당혹스럽게 하는 건가요;;;

 

oTz

 

 


Who's 아이미르

?

허루쿠... 임용고시 공부해야되는데 이러고 있다....

 

알만툴의 중독성은 쩔어준다는;;;

Comment '2'
  • ?
    허걱 2012.08.09 00:06
    해결이 됐나요? 제가 볼때는 여전히 같이 변할것 같은데...

    아무튼, 그렇게 같이 연동되는 이유는 배열이나 해쉬같은 집합의 경우
    변수에 대입을 해줬을 때 내용이 복사되는게 아니라 주소값이 할당되는걸로 알고 있습니다.

    예를들어 위와 같은 경우처럼 var = IMIR_SHOP::SHOP 이라고 해줬을 때
    var 은 [...] 이라는 내용이 들어가는게 아니라 IMIR_SHOP::SHOP 을 나타낸다고 할 수 있죠.

    음...비슷하게 들릴지도 모르겠지만...;;;
    결론을 말하자면 배열등을 변수에 대입할 때는 내용이 아니라 주소가 할당되게 됩니다.
    (같은 소리를...ㄷㄷ;)

    주소가 아니라 내용을 대입하고 싶은 경우는 .dup 라는 메소드를 사용하면 됩니다.
    var = IMIR_SHOP::SHOP.dup
    이와 같이 해주면 var 에 IMIR_SHOP::SHOP 가 가지고 있는 내용이 대입되게 됩니다.

    (일단 결론을 말하긴 했는데 이해가 안가면 다시 댓글달아 주시면 다시 알려드릴께요)
  • ?
    아이미르 2012.08.09 18:04
    음.. 저 방법도 완전 해결은 아니었습니다. 저장하고 새로 불러오기하면 초기치를 유지하는 데 작성한 직후나 작성한 뒤 타이틀로 이동하고 끄지 않은 채로 바로 새게임을 시작하면 같은 값이 따라다니네요.

    가르쳐 주신 대로 IMIR_SHOP::SHOP.dup나 IMIR_SHOP::SHOP.clone ( 도움말에서 찾았습니다 )을 실험해봤지만 이번에는 배열 내부의 nil값에서 데이터가 꼬이더군요;;; nil값일 때 정의되지 않았다나 어쨌다나;;

    그래서 무식하게 해결했습니다..

    for i in 0..IMIR_SHOP::SHOP_MAX
    @com_list[i] = []
    @com_list[i][0] = []
    @com_list[i][1] = []
    @com_list[i][2] = []
    for j in 1..IMIR_SHOP::ITEM_MAX
    @com_list[i][0][j] = []
    @com_list[i][0][j][0] = @commodity[i][0][j][0]
    @com_list[i][0][j][1] = @commodity[i][0][j][1]
    end
    for j in 1..IMIR_SHOP::WEAPON_MAX
    @com_list[i][1][j] = []
    @com_list[i][1][j][0] = @commodity[i][1][j][0]
    @com_list[i][1][j][1] = @commodity[i][1][j][1]
    end
    for j in 1..IMIR_SHOP::ARMOR_MAX
    @com_list[i][2][j] = []
    @com_list[i][2][j][0] = @commodity[i][2][j][0]
    @com_list[i][2][j][1] = @commodity[i][2][j][1]
    end
    end

    이렇게요;;;; 가르쳐 주신 게 배열은 변수처럼 등호로는 대입이 안되니까
    아예 배열 값 하나하나 대입하게 만들었네요.

List of Articles
종류 분류 제목 글쓴이 날짜 조회 수
공지 묻고 답하기 가이드 습작 2014.06.14 12441
RMVXA 스크립트 에디터의 내용을 필드 이벤트에 있는 스크립트로 바꾸는 방법? 몽롱하다 2016.02.14 146
RMXP 스크립트 에디터에서 정해진 수치를 다양하게 변경할수 있는 방법(?)에 관해서 질문합니다 1 브라우니 2012.12.13 846
RMVXA 스크립트 에디터에서 게임오버시... 3 BeNew 2016.09.08 145
RMVXA 스크립트 에디터를 한글화 할수 없나요? 3 한한 2012.03.13 2616
RMXP 스크립트 에디터 둘다 먹통입니다 왜이런느지 아시는분? file 붉은 원숭이 2013.12.31 985
RMVXA 스크립트 에디터 내에서 조건분기를 사용하고 싶습니다. 8 ifeve 2016.03.09 193
RMVXA 스크립트 에디터 1 통룡전사 2018.04.29 186
RMVXA 스크립트 없이 체력 숫자 표시해주는 방법? 2 명상합시다 2013.09.24 976
RMVXA 스크립트 없이 전등에 불빛효과 넣는 방법 좀 알려주세요. 1 치느 2015.10.01 461
RMMV 스크립트 없이 이런건 불가능 한가요?? 3 라케냐 2015.12.28 206
RMVXA 스크립트 없이 8방향(대각선)이동 하는 법 없나요? 무명시절 2015.09.30 260
RMXP 스크립트 언어에대한 궁굼증 2 삼팸스튜디오 2013.05.12 726
RMXP 스크립트 액알에서 공격범위는 설정못하나요? 1 질풍처럼 2010.12.05 635
RMXP 스크립트 아시는분들 이부분 해석좀 해주세요 5 EE!! 2010.10.14 604
RMVX 스크립트 쓸때 alias 1 EuclidE 2011.10.15 1561
RMVXA 스크립트 수치 표기 연동 방법 질문. file 꼭해볼테다 2013.10.20 881
RMVXA 스크립트 수정해주실분 찾아요.. 환장 2015.08.04 150
RMXP 스크립트 수정하고 싶은데 도와주세요. 1 아미상 2014.04.05 610
RMXP 스크립트 소수(실수)를 정수로 하는 방법.. 3 코아 코스튬 2010.10.16 1007
RMVXA 스크립트 설명 좀 해주실분 ㅠ.ㅠ 1 메리리의 2014.06.27 520
Board Pagination Prev 1 ... 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 ... 516 Next
/ 516