lklslel2017.05.02 16:13
"code":311,
"indent":1,
"parameters":[1,1,1,0,4,true]

이 부분이 바로 문제의 부분입니다.

// Game_Interpreter.prototype.command311 실행 시작

// Change HP
Game_Interpreter.prototype.command311 = function() {
var value = this.operateValue(this._params[2], this._params[3], this._params[4]);
this.iterateActorEx(this._params[0], this._params[1], function(actor) {
this.changeHp(actor, value, this._params[5]);
}.bind(this));
return true;
};



this._params = [1,1,1,0,4,true];
//또는
//this._params = {};
//this._params[0] = 1;
//this._params[1] = 1;
//this._params[2] = 1;
//this._params[3] = 0;
//this._params[4] = 4;
//this._params[5] = true;


var value = this.operateValue(1,0,4);


// Game_Interpreter.prototype.operateValue 실행 시작

Game_Interpreter.prototype.operateValue = function(operation, operandType, operand) {
var value = operandType === 0 ? operand : $gameVariables.value(operand);
return operation === 0 ? value : -value;
};

operation = 1
operandType = 0
operand = 4

var value = 0 === 0 ? 4 : $gameVariables.value(4);
//0 이 0이 맞다면 4, 아니면 4번 변수값
return 1 === 0 ? 4 : -4;
// 결과값으로는 operation 값이 1이고, 0과 같지 않기 때문에 value의 값(4)을 음수로 넘겨줍니다

// Game_Interpreter.prototype.operateValue 실행 끝


this.iterateActorEx(1,1, function(actor) {
this.changeHp(actor, -4,true);
}.bind(this));


// Game_Interpreter.prototype.iterateActorEx 실행시작

Game_Interpreter.prototype.iterateActorEx = function(param1, param2, callback) {
if (param1 === 0) {
this.iterateActorId(param2, callback);
} else {
this.iterateActorId($gameVariables.value(param2), callback);
}
};

param1 = 1;
param2 = 1;
callback = function(actor) {
this.changeHp(actor, -4,true);
}.bind(this);

// param1 값이 1이기때문에 else 부분이 실행됩니다.

if (1 === 0) {
this.iterateActorId(1, callback);
} else {
this.iterateActorId($gameVariables.value(1), callback);
}

// Game_Interpreter.prototype.iterateActorId 실행시작

Game_Interpreter.prototype.iterateActorId = function(param, callback) {
if (param === 0) {
$gameParty.members().forEach(callback);
} else {
var actor = $gameActors.actor(param);
if (actor) {
callback(actor);
}
}
};

// 주인공의 체력변수에 있는 값이 20이므로 param의 값은 20이 됩니다.

param = 20;
callback = function(actor) {
this.changeHp(actor, -4,true);
}.bind(this);

// param 값이 0이 아니기 때문에 else 부분이 실행됩니다.

if (20 === 0) {
$gameParty.members().forEach(callback);
} else {

// 20번 액터의 정보를 불러옵니다.
// 하지만 20번 액터가 해당 액터일 경우에는 운 좋게 맞아 떨어지지만
// 맵 정보를 보게되면 "actorId":1 이라고 조건이 명시가 되어있기 때문에
// 올바른 액터의 ID가 아니게 됩니다.

var actor = $gameActors.actor(20);

// actor의 데이터가 존재한다면 callback(actor)를 실행합니다.

if (actor) {
callback(actor);
}
}


결론을 말씀드리자면 HP증감은 직접적으로 액터의

데이터에 접근하는 방식으로 작성이 되어있기 때문에

따로 체력변수를 두실 필요가 없고 바로 액터의 정보로

비교문의 사용과 함수의 사용을 하시면 된다는 겁니다.


조건분기시 주인공의 체력 변수가 아닌 주인공 자체를

선택하시고 체력 값으로 지정해주시면 제대로 됩니다.

그리고 실제 체력 데이터 값을 적용하실 때에도

주인공을 선택하시고 체력값에 바로 적용시키시면 됩니다.




정리를 하자면 실제 조건분기까지는 실행이 되었지만

변수가 가르키고 있던 체력의 데이터를 액터의 ID로

잘못 접근하여 조작하려고 했던 것이 문제였습니다.

이어서 마지막 변수 조작이 되어서 16으로 된 것은

해당 액터의 체력값을 가르키고 있었기 때문에

그 부분만 정상적으로 작동을 한 것처럼 보인 겁니다.
파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)