질문과 답변

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 12460
RMVXA 능력치강화와레벨업시 커먼이벤트발생을이용해 스탯분배 레드륨 2014.10.15 390
RMVXA 스크립트로 페이드 아웃, 인 11 게임잘날아가는닝겐 2015.07.16 393
RMVXA 아이템을 특정위치에서 사용할때 변수질문 6 파랑빛 2017.04.27 394
RMVXA 이벤트 접촉 시 데미지 처리 시스템 17 수프림 2017.05.07 395
RMVXA SceneManager 스크립트 오류 ㅠㅠ 4 아무리 2014.10.14 395
RMVXA VX Ace그림의 표시 문의입니다. 3 file 황금시계 2015.07.28 395
RMVXA 상태창 스크립트에 초상화대신 일러스트 나오게 하는방법 알려주세요... 1 Lamiassss3 2018.08.28 395
RMVXA 데이터를 읽어오는데 실패했습니다 1 BeNew 2015.02.01 397
RMVXA 알수없는 파일 포맷 메익게임 2014.10.04 398
RMVXA 캐릭터칩(xp→vx)의 배경 칠하기 2 file ifeve 2015.01.20 400
RMVXA 초기화면에서 캐릭터 선택을 할수 있을까요? 5 계닭 2015.03.28 400
RMVXA npc를 이벤트상에서 이동하게 하는중에 질문드립니다. 1 killcoro 2018.04.21 400
RMVXA RPGVXAce에는 원래 타일셋이 4개 뿐인가요?? 3 비두 2016.04.15 402
RMVXA 맵 일부를 복사붙여넣기 하는데 오류가 생깁니다ㅜㅜ 1 file 한소 2015.12.09 403
RMVXA 대화 분기 질문 2 cdefgba 2014.10.16 404
RMVXA 아이템이나 스킬, 장비 등의 설명창 크기를 늘리는 방법이 궁금합니다. file 선스트라이더 2015.12.27 404
RMVXA 혹시 특정 스테이트에 걸렸을 때 또 다른 스테이트를 강제로 추가하는 스크립트가 있습니까? 3 복돌류 2014.10.19 405
RMVXA 저장 시 캐릭터칩이 너무 커서 몸이 잘린 채로 표시됩니다. 4 file 라니에타 2015.07.12 405
RMVXA rpg vx ace에서 화면에 각주(자막)를 다는 방법을 알고싶어요!!! 2 file 오니으리 2015.10.20 409
RMVXA (생초보) 제한된 맵 타일 리스트의 수를 늘릴 수 있나요?(스크립트라던가...) 1 file angelan98 2016.02.19 410
Board Pagination Prev 1 ... 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 ... 150 Next
/ 150