🤔 Para Refletir :
"Todos projetos não são unicamente meu, pois cada sugestão e critica, recursos e sugestões fazem me ver que ele leva um pedaço de cada pessoa nele"
- riquecamarg0

Capturar ID das Armors usadas pelo Actor

fabrizio

Plebeu
Membro
Membro
Juntou-se
28 de Março de 2017
Postagens
45
Bravecoins
2
Cá estou eu com mais uma dúvida!  :^^':

Seguinte, estou tentando fazer um forEach para pegar as IDs das armors que o jogador estiver usando. Meu primeiro chute foi esse código: (sei que o resultado está retornando para o console, fiz de propósito)

Código:
Fabrizio.armorArray = function() {
    var armorID = 0;
    $gameActors.actor(1)._equips.forEach(function(l) {
        if(l._dataClass === "armor"){
            var id = l._itemId;
            if(id != 0){
                console.log(id);
                armorID = id;
            };
        };
    }, this);
    return "ID: " + armorID;
};

Mas o valor retornado não é a ID da armor. Também sei que o comando a seguir, retorna corretamente a ID:

Código:
$gameActors.actor(actorId).equips()[n].id; //actorId -> ID Heroi | n -> slot do equip

Mas eu não queria preencher isso manualmente. Queria que fosse um forEach mas até agora não consigo imaginar como, pois os valores presente em equips mistura ID de armas com os outros, dai não sei como criar um "filtro". Isso está retornando tudo!

Fico no aguardo. Abraço!
 
Realmente, os objetos dos equipamentos possuem mais de um id, não que se refiram ao mesmo, mas já é o suficiente pra confundir um pouco. Enfim, não me dou bem com forEach, e por ser uma quantidade bem pequena de equipamentos, acho que não há problema em usar um for aí:

Código:
var startSlot = $gameParty.members()[0].isDualWield() ? 2 : 1;
for (a = startSlot; a < $gameParty.members()[0].equips().length; a++) {
  if ($gameParty.members()[0].equips()[a]) {
    console.log($gameParty.members()[0].equips()[a].id);
  };
};

Isso vai printar no console os ids dos equipamentos na ordem equipada e a partir do primeiro equipamento que é uma armadura.
 
[member=45]King Gerar[/member] funcionou perfeitamente. Mas dai eu quis fazer da seguinte forma:

- Dentro do IF eu fiz ele alimentar um ARRAY;
- Utilizo esse ARRAY só para realizar outra função (até aqui tudo bem);
- Pensei em chamar o teu comando (o FOR), na função Game_Actor.prototype.changeEquip desse jeito:
Código:
var _Alias_GameActor_changeEquip = Game_Actor.prototype.changeEquip;
Game_Actor.prototype.changeEquip = function(slotId, item) {
	_Alias_GameActor_changeEquip.call(this,slotId,item);
	Fabrizio.armorArray(); // -> Função do FOR
};
Assim, toda vez que ele tentar alterar algum equipamento, seria chamado o Fabrizio.armorArray() que realiza a função FOR, mantendo meu ARRAY atualizado.

O PROBLEMA!
Ele da erro ao iniciar o projeto. Acredito que seja porque tem muita coisa ainda não iniciada. Ainda pensei em colocar um IF antes de chamar a minha função que realiza o FOR, assim:
Código:
var _Alias_GameActor_changeEquip = Game_Actor.prototype.changeEquip;
Game_Actor.prototype.changeEquip = function(slotId, item) {
	_Alias_GameActor_changeEquip.call(this,slotId,item);
	if(tudoIniciado()) Fabrizio.armorArray(); // -> Função do FOR
};

Daí, o tudoIniciado() ganharia um valor (TRUE) somente após os Initialize ocorrerem. Pensei em usar o Initialize do Scene_Map, mas ainda não testei, para setar o valor TRUE.
 
Eu acho que essa "chamada" da sua classe aí precisaria de um call, não?
De qualquer forma, se a ideia é manter uma array atualizada, tu não precisa ter um objeto todo para isso, tu pode ter só uma $fabrizio.armorArray, que é mais simples me manusear.
 
King Gerar comentou:
Eu acho que essa "chamada" da sua classe aí precisaria de um call, não?
De qualquer forma, se a ideia é manter uma array atualizada, tu não precisa ter um objeto todo para isso, tu pode ter só uma $fabrizio.armorArray, que é mais simples me manusear.

[member=45]King Gerar[/member] Não entendi muito bem. Eu fiz um call para _Alias_GameActor_changeEquip. É isso?

Mas olha, eu podia desisti do Game_Actor.prototype.changeEquip. Coloquei a chamada da minha função Fabrizio.armorArray() para dentro do Scene_Map.prototype.start e deu certo. Fico na dúvida se pode afetar o desempenho do jogo, por isso queria chamar ela (minha função) só se houvesse mudança nos equipamentos do personagem.

Scene_Map ficou assim:
Código:
_Alias_Scene_Map_start = Scene_Map.prototype.start;
Scene_Map.prototype.start = function() {
	_Alias_Scene_Map_start.call(this);
	// Chamar função do Array de Armors
	Bizu.armorArrayID();
};

O problema é que só atualiza o ARRAY quando sair do Menu e volta para o mapa.
 
Aí vai depender da finalidade que essa array tem. Se a partir do início do mapa ela continuar funcional pra ti, tá bom assim. Quanto a desempenho, se for realmente só o tempo de ela mudar seus valores, o impacto que isso vai ter é irrelevante.
Só que, se bastou tu colocar o código e ela foi chamada, ela também deveria ter sido chamada onde estava previamente. Confere se o código onde ela estava tava sendo lido antes, porque talvez ele não estava sendo lido e por isso não era chamada.
 
Eu finalmente consegui manipular melhor isso. Coloquei um IF antes da minha função e só daria pra "passar" por ele, se o Scene_Map estivesse carregado, evitando erros.

Enfim, muito obrigado novamente pela ajuda! Abraço.
 
Voltar
Topo Inferior