O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Corrigir a estrutura desses códigos [RMMV]

Iniciado por Naemegashi Yokohuro, 22/02/2017 às 00:01

22/02/2017 às 00:01 Última edição: 22/02/2017 às 17:15 por Alisson
Como eu faria para esses códigos funcionarem? Já os salvei como plugin, mas não parece funcionar.
E como eu faria para chamar o coinchange por eventos?
O primeiro código, contem as informações das cartas e das moedas.
var allcards = [{name: "Werewolf", atk: 70, def: 30, type:[1,2], atkbuff: 0, defbuff: 0, price: 60}];
var allcoins = [{name: "Ilha", type: 0, mapstrongness[0], mapweakness:[2], atkbuff: 200, defbuff: 200, backgroundpicture: "Camp Island", coinpicture: "Coin Island", bgm: ["Town1", 90, 100, 0], bgs: ["Sea", 70, 100, 0], price: 110},
            {name: "Espaço", type: 0, mapstrongness[1], mapweakness:[0,2,3], atkbuff: 200, defbuff: 200, backgroundpicture: "Camp Space", coinpicture: "Coin Space", bgm: ["Dungeon1", 50, 100, 0], bgs: ["", 0, 0, 0], price: 210}];


Já esse, faz as alterações necessárias quando se troca a moeda.

function Coinchange() {
  if (allcoins[activecoin].type == 0) {
    for(i = 0; i < 3 ; i++) {
      for (j = 0; j < allcoins[activecoin].mapstrongness.length - 1; j++) {
        if (allcards[enemycards[i]].type.indexOf(j) !== -1) {
          allcards[enemycards[i]].atkbuff = allcoins[activecoin].atkbuff;
          allcards[enemycards[i]].defbuff = allcoins[activecoin].defbuff;
        };
        if (allcards[playercards[i]].type.indexOf(j) !== -1) {
          allcards[playercards[i]].atkbuff = allcoins[activecoin].atkbuff;
          allcards[playercards[i]].defbuff = allcoins[activecoin].defbuff;
        };
      };
      for (j = 0; j < allcoins[activecoin].mapweakness.length - 1; j++) {
        if (allcards[enemycards[i]].type.indexOf(j) !== -1) {
          allcards[enemycards[i]].atkbuff = -allcoins[activecoin].atkbuff;
          allcards[enemycards[i]].defbuff = -allcoins[activecoin].defbuff;
        }
        if (allcards[playercards[i]].type.indexOf(j) !== -1) {
          allcards[playercards[i]].atkbuff = -allcoins[activecoin].atkbuff;
          allcards[playercards[i]].defbuff = -allcoins[activecoin].defbuff;
        };
      };
    };
    $gameScreen.showPicture(1, allcoins[activecoin].backgroundpicture, 0, 0, 0, 100, 100, 255, 0)
    $gameScreen.showPicture(17,	allcoins[activecoin].coinpicture, 0, 409, 331,	100, 100, 255, 0);
    var mapbgm = { name: allcoins[activecoin].bgm[0], volume: allcoins[activecoin].bgm[1],pitch: allcoins[activecoin].bgm[2], pan: allcoins[activecoin].bgm[3]};
    var mapbgs = { name: allcoins[activecoin].bgs[0], volume: allcoins[activecoin].bgs[1],pitch: allcoins[activecoin].bgs[2], pan: allcoins[activecoin].bgs[3]};
    AudioManager.playBgm(mapbgm);
    AudioManager.playBgs(mapbgs);
  };
};


Os códigos estão exatamente desse jeito, gostaria de saber como faze-lo funcionar, como o initialize ou o update no VX e VXA.
Obrigado.

Quando você adiciona esse código à lista de plugins, ele automaticamente será executado, sem precisar de initialize, visto que o código acima seria global, e você pode acessar via qualquer lugar.

Você pode usar o comando chamar script para utilizar a função Coinchange que ele funciona sem precisar de um update.
Agora pra te ajudar mais, seria legal saber onde você pretende utilizar isso.

Então eu tentei assim e deu o erro:
Coinchange() is not defined

Eu estou fazendo um TCG, e toda vez que uma nova Moeda for inserida, ele rode esse código.

Eu fiz um teste aqui, e deu certo. Verificou se o plugin com o código está instalado?

E uma screenshot do console na hora do erro seria uma boa também.

Esta instalado sim.
Aqui os prints.
Plugin
[close]
Console
[close]
Esses plugins, são os únicos que não funcionam, qualquer outro que eu testo funciona normalmente.

22/02/2017 às 15:06 #5 Última edição: 22/02/2017 às 15:08 por Alisson
Eu reparei no primeiro código alguns erros que possivelmente podem estar causando o problema.
Em allcoins, no mapstrongness[0], precisa ter um ":" .
Tipo:
mapstrongness: [0],

E ainda tem outros com o mesmo problema. Tenta corrigir isso aí e vê se vai.

E outra, na função Coinchange, o activecoin foi definido?

22/02/2017 às 15:12 #6 Última edição: 22/02/2017 às 15:13 por Naemegashi Yokohuro
Então, no codigo reformulado, eu substitui todos os activecoin por this._params[0]

Coinchange(this._params[0])


Edit.
Esqueci de falar, eu testei e mesmo corrigindo o mapstrongness não funcionou

No caso, ali o this se refere ao objeto Coinchange, e ele não possui uma propriedade de _params.

Meio que essa parte deu certo Alisson, mas ele apareceu:
Cannot read property 'type' of undefined

Acho que o problema agora é no allcoins e no allcard.
Quando tentei declarar eles via eventos, ele da erro, por eles serem array object acho, por causa do [{.
Aqui o codigo novamente.
var allcards = [{name: "Werewolf", atk: 70, def: 30, type:[1,2], atkbuff: 0, defbuff: 0, price: 60}];
var allcoins = [{name: "Ilha", type: 0, mapstrongness:[0], mapweakness:[2], atkbuff: 200, defbuff: 200, backgroundpicture: "Camp Island", coinpicture: "Coin Island", bgm: ["Town1", 90, 100, 0], bgs: ["Sea", 70, 100, 0], price: 110},
                  {name: "Espaço", type: 0, mapstrongness:[1], mapweakness:[0,2,3], atkbuff: 200, defbuff: 200, backgroundpicture: "Camp Space", coinpicture: "Coin Space", bgm: ["Dungeon1", 50, 100, 0], bgs: ["", 0, 0, 0], price: 210}];

Ah sim, quando você declara eles via eventos (chamar script), eles só existem naquele momento, depois deixam de existir, sendo deletadas da memória.
O sábio seria fazer uma variável que fosse guardando elas na memória, tipo algo parecido com isso:
var deposito = new Object() // ou simplesmente {}

Daí no chamar script, você poderia usar:
deposito["identificador"] = meuObjeto;

E você pode acessar via qualquer lugar aquele objeto que foi criado pelo evento.

Citação de: Alisson online 22/02/2017 às 15:55
Ah sim, quando você declara eles via eventos (chamar script), eles só existem naquele momento, depois deixam de existir, sendo deletadas da memória.
O sábio seria fazer uma variável que fosse guardando elas na memória, tipo algo parecido com isso:
var deposito = new Object() // ou simplesmente {}

Daí no chamar script, você poderia usar:
deposito["identificador"] = meuObjeto;

E você pode acessar via qualquer lugar aquele objeto que foi criado pelo evento.
Na verdade, eu declarei elas via Plugin, no evento foi só pra testar.
Para criar as cartas e afins, eu teria que criar um novo objeto, pra cada? Ou teria como fazer tudo direto, dentro de uma variável?
Exemplo:
var allcards = new Object();
var allcoins = new Object();
var allcards = [{name: "Werewolf", atk: 70, def: 30, type:[1,2], atkbuff: 0, defbuff: 0, price: 60}];
var allcoins = [{name: "Ilha", type: 0, mapstrongness:[0], mapweakness:[2], atkbuff: 200, defbuff: 200, backgroundpicture: "Camp Island", coinpicture: "Coin Island", bgm: ["Town1", 90, 100, 0], bgs: ["Sea", 70, 100, 0], price: 110},
                  {name: "Espaço", type: 0, mapstrongness:[1], mapweakness:[0,2,3], atkbuff: 200, defbuff: 200, backgroundpicture: "Camp Space", coinpicture: "Coin Space", bgm: ["Dungeon1", 50, 100, 0], bgs: ["", 0, 0, 0], price: 210}];

22/02/2017 às 16:20 #11 Última edição: 22/02/2017 às 16:27 por Alisson
Bom, uma maneira que eu gosto de fazer é usar o bom e velho sistema de classes do ace no mv (sim, mv também possui classes, à partir do ECMAScript 6).
"use strict"; // Sim, eu programo no strict mode.
class Card {

    constructor () { // Isso é a mesma coisa do initialize do ruby.
        this.name = "Werewolf";
        this.atk = 70;
        this.def = 30;
        this.type = [1, 2];
        this.atkbuff = 0;
        this.defbuff = 0;
        this.price = 60;
    };
};

var card1 = new Card();
console.log(card1.name) // Werewolf
var card2 = new Card();
card2.name = "Robot";
console.log(card2.name) // Robot


Você também pode fazer da seguinte forma:
function Card () {
        this.name = "Werewolf";
};
var card1 = new Card();
console.log(card1.name) // "Werewolf"
var card2 = new Card();
card2.name = "Robot";
console.log(card2.name) // "Robot"


E também pode fazer tipo:
const Card = function () {
        this.name = "Werewolf";
};
Object.defineProperty(Card, "name", {
        get: function () { return this.name },
        set: function (value) { this.name = value }
});

var card1 = new Card();
console.log(card1.name) // "Werewolf"
var card2 = new Card();
card2.name = "Robot";
console.log(card2.name) // "Robot"


No seu caso, como você está usando um formato JSON, você pode simplesmente usar o new para criar novas instâncias dos objetos.

Entendi, mas não teria um jeito que fazer como no codigo la em cima? Sem ter que usar functions ou class?
Ou se eu fizesse assim funcionaria?
allcards = []
allcars[0] = {
this.name = "Werewolf";
        this.atk = 70;
        this.def = 30;
        this.type = [1, 2];
        this.atkbuff = 0;
        this.defbuff = 0;
        this.price = 60;
}

Pois todo o codigo usa esse modelo.
array[posição].nome

Sim, sim. Usei os métodos lá acima como exemplo.

Você pode acessar eles desse jeito mesmo.
var allCards = [
	{
		name: "Werewolf",
		atk: 70
	},
	{
		name: "Robot",
		atk: 20
	}
];

console.log(allCards[0].name);



Acho que me acostumei tanto com o codigo dar erro, que nem havia testado direito.
Essa parte ai esta mesmo funcionando, o problema parece ser mesmo na hora de chamar o script, que ele diz:
Cannot read property 'type' of undefined

Mesmo eu definindo o activecoin antes de chamar o Coinchange()
Estou chamando da seguinte maneira:
activecoin = 0
Coinchange()

Esta certo assim?