Corrigir a estrutura desses códigos [RMMV]

17 Respostas   449 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Naemegashi Yokohuro

  • *
  • Posts: 414
  • Ouros: 374
Tópico criado em: 22/02/2017 às 00:01 - Última modificação por Alisson em 22/02/2017 às 17:15

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.
Código: [Selecionar]
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.

Código: [Selecionar]
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.

Syureri

Resposta 1: 22/02/2017 às 13:31

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.

Naemegashi Yokohuro

  • *
  • Posts: 414
  • Ouros: 374
Resposta 2: 22/02/2017 às 14:40

Então eu tentei assim e deu o erro:
Código: [Selecionar]
Coinchange() is not definedEu estou fazendo um TCG, e toda vez que uma nova Moeda for inserida, ele rode esse código.

Syureri

Resposta 3: 22/02/2017 às 14:54

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.

Naemegashi Yokohuro

  • *
  • Posts: 414
  • Ouros: 374
Resposta 4: 22/02/2017 às 15:04

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.

Syureri

Resposta 5: 22/02/2017 às 15:06 - Última modificação por Alisson em 22/02/2017 às 15:08

Eu reparei no primeiro código alguns erros que possivelmente podem estar causando o problema.
Em allcoins, no mapstrongness[0], precisa ter um ":" .
Tipo:
Código: [Selecionar]
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?

Naemegashi Yokohuro

  • *
  • Posts: 414
  • Ouros: 374
Resposta 6: 22/02/2017 às 15:12 - Última modificação por Naemegashi Yokohuro em 22/02/2017 às 15:13

Então, no codigo reformulado, eu substitui todos os activecoin por this._params[0]

Código: [Selecionar]
Coinchange(this._params[0])
Edit.
Esqueci de falar, eu testei e mesmo corrigindo o mapstrongness não funcionou

Syureri

Resposta 7: 22/02/2017 às 15:44

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

Naemegashi Yokohuro

  • *
  • Posts: 414
  • Ouros: 374
Resposta 8: 22/02/2017 às 15:51

Meio que essa parte deu certo Alisson, mas ele apareceu:
Código: [Selecionar]
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.
Código: [Selecionar]
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}];

Syureri

Resposta 9: 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:
Código: [Selecionar]
var deposito = new Object() // ou simplesmente {}
Daí no chamar script, você poderia usar:
Código: [Selecionar]
deposito["identificador"] = meuObjeto;
E você pode acessar via qualquer lugar aquele objeto que foi criado pelo evento.

Naemegashi Yokohuro

  • *
  • Posts: 414
  • Ouros: 374
Resposta 10: 22/02/2017 às 16:05

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:
Código: [Selecionar]
var deposito = new Object() // ou simplesmente {}
Daí no chamar script, você poderia usar:
Código: [Selecionar]
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:
Código: [Selecionar]
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}];

Syureri

Resposta 11: 22/02/2017 às 16:20 - Última modificação por Alisson em 22/02/2017 às 16:27

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).
Código: [Selecionar]
"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:
Código: [Selecionar]
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:
Código: [Selecionar]
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.

Naemegashi Yokohuro

  • *
  • Posts: 414
  • Ouros: 374
Resposta 12: 22/02/2017 às 16:31

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?
Código: [Selecionar]
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.
Código: [Selecionar]
array[posição].nome

Syureri

Resposta 13: 22/02/2017 às 16:38

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

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

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


Naemegashi Yokohuro

  • *
  • Posts: 414
  • Ouros: 374
Resposta 14: 22/02/2017 às 16:50

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:
Código: [Selecionar]
Cannot read property 'type' of undefinedMesmo eu definindo o activecoin antes de chamar o Coinchange()
Estou chamando da seguinte maneira:
Código: [Selecionar]
activecoin = 0
Coinchange()
Esta certo assim?