질문과 답변

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 12456
RMVXA rpgvxace 사이드뷰 오류 2 file 라테일gm 2014.06.11 615
RMVXA rpgvxace 사이드뷰 오류 질문 3 슈퍼울트라그레이트딜리셔스 2014.06.11 660
RMVXA rpgvxace 상태 아이콘 바꾸는 방법 3 슈퍼울트라그레이트딜리셔스 2015.09.15 242
RMVXA RPGVXACE 설명 잘해주는곳 2 코버넌트 2015.11.11 193
RMVXA rpgvxace 아무것도없는곳에서 이벤트후 건물 생성(짓기) 6 CJY 2014.01.04 935
에러 해결 RMVXA RPGVXAce 에러 해결방법좀 알려주세요... 21 file KangHG 2019.02.28 2247
RMVXA RPGVXACE 전투스크립트 궁금증이있습니다. 2 moopu 2012.05.12 4347
RMVXA RPGVXACE 전투중 능력강화 능력약화 아이콘 변경 질문 1 file 겜맨602 2016.05.19 134
RMVXA RPGVXace 질문 드립니다. 4 CrazyMaker 2013.12.02 1696
RMVXA RPGVXACE 타이틀 화면없이 시작하는법. 2 카로 2013.01.25 939
RMVXA RPGVXACE 턴제 전투시 파티원 위치설정(전위,중간,후위) 1 겜제작광 2014.06.11 863
RMVXA rpgvxace 합성 스크립트 적용법좀요.. 6 CJY 2014.01.04 942
게임 배포 RMVXA RPGVXAce가 없으면 실행이 안된대요 1 뮹입니다 2020.07.01 162
RMVXA RPGVXACE에 조작키 바꾸는법 2 쿠르스 2013.01.25 868
RMVXA RPGVXAce에는 원래 타일셋이 4개 뿐인가요?? 3 비두 2016.04.15 402
RMVXA RPGVXACE에서 맵만들때요. 6 file by오브 2013.01.01 1926
RMVXA rpgvxace제작문의입니다 아메를아메아메 2014.12.24 178
RMVXA rpgvxace최대 레벨 증가하는 방법 1 돼지와함께영광을 2014.05.02 956
RMVXA RPGVXA로 온라인 턴제전투 할수있음 ? 2 NewSet 2013.11.24 1022
RMVXA rpgvxa를 배포했을때 플레이하는 사람이 RTP같은게 없어도 실행가능한가요? 2 시옷전사 2014.09.19 693
Board Pagination Prev 1 ... 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ... 150 Next
/ 150