질문과 답변

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 13187
RMXP XP상에서 타일셋 전환을 가능하게 하는 스크립트가 있나요? 1 칸타모 2012.08.12 746
RMVXA 대화창의 문자가 잘려서 나옵니다. 4 file 엘 티그레 2012.08.12 1509
RMVXA 스킬창에 소모mp와 tp가 둘중 하나만 표시됩니다 2 file 아몬드젤리 2012.08.12 1243
RMVX 화면에 돈뜨게하는법 2 우롸이언 2012.08.12 1639
RMVX 이 레버 실행시키고 좀 끄고싶네요. 6 file 카온 2012.08.11 1188
RMVX 스크립트 찾고있습니다. 1 아이리수 2012.08.11 1631
RMVX vampyr SBABS-Requiem ABS 9 디버프 적용법 2 미니프레시 2012.08.11 1191
RMVXA 데미지 공식에 난수를 더하려고 하는데요.. 1 엘 티그레 2012.08.11 1518
RMXP 장비가 바뀌엇을때 표현방법 1 말짱꽝이지롱 2012.08.09 1048
RMVXA 스크립트 상 변수 문제입니다. 2 아이미르 2012.08.08 1207
RMVXA srpg 컨버터 사용자 인데요 걷다가 전투걸려서 적이 먼저 아군발견(습격) 없엘수있나요 5 안경포스 2012.08.07 1038
RMVXA 퀘스트 스크립트 충돌 (언어) 2 file 세븐체크 2012.08.07 1307
RMVX 연동 이벤트 만드는 법 5 ®자이나스 2012.08.06 921
RMVXA RGSS 3 스크립트 다단공격 2 로브남 2012.08.05 2127
rpg한글하할수있는방법없나요? 3 2012.08.05 1045
RMVX 닿는순간 움직여지지 않는 버그 추가내용 4 file 카온 2012.08.04 1217
RMVXA VX ACE 마우스 스크립트 15 비비드 2012.08.04 1472
RMXP RGSS Cache 모듈 수정법! 4 지누준호 2012.08.03 1188
RMVX 플레이어와 접촉 상태에서도 움직이기 5 file 카온 2012.08.03 1106
RMVX VX로 작업하던것을 VXAce 3 테오 2012.08.03 972
Board Pagination Prev 1 ... 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 ... 517 Next
/ 517