Autor Wątek: Pomocy, Javascript się pali!  (Przeczytany 1278 razy)

Offline darthtomi

  • Użytkownik

# Lipiec 09, 2012, 00:15:17
Jestem naprawdę początkujący i naprawdę banalne rzeczy dla was, dla mnie są czarną magią. Proszę się nie śmiać, wiem że ten kod jest topornie napisany. 

Z baraku weny przekleje tutaj opis problemu jaki zamieścił gdzie indziej:

Here are 3 functions: MakeNPC, CreateNPC and NPCAI. CreateNPC runs once at start up and sends data to MakeNPC so they show up in game. NPCAI runs every second and makes the NPC move in game. When CreateNPC calls MakeNPC everything is OK. Problem occurs when the MakeNPC function gets a call from NPCAI, an error pops up: can't convert undefined to object.

Line in which the error is reported by Firebug to come up is in first line of MakeNPC:

Previous_bead_NPC[NPCid][0] = x;
Here is the whole code of these 3 functions. I wasted whole day trying to solve this and I'm about to cry myself to sleep any minute:(

var Previous_bead_NPC = new Array(10);
for (var i = 0; i < 10; i++)
{
Previous_bead_NPC[i] = new Array(7);
};

var NPC = new Array(10);
for (var i = 0; i < 10; i++)
{
NPC[i] = new Array(7);
};


//inserts NPC into world
var MakeNPC = function (x, y, c, g, NPCid, dx, dy, s)
{
    "use strict";
Previous_bead_NPC[NPCid][0] = x;
Previous_bead_NPC[NPCid][1] = y;
Previous_bead_NPC[NPCid][2] = PS.BeadColor(x, y);
Previous_bead_NPC[NPCid][3] = PS.BeadGlyph(x, y);

PS.BeadColor(x, y, c);
PS.BeadData(x, y, "blocked");
PS.BeadGlyph(x, y, g);

NPC[NPCid][0] = x; //x
NPC[NPCid][1] = y; //y
NPC[NPCid][2] = c; //color
NPC[NPCid][3] = g; //glyph
NPC[NPCid][4] = dx; //destination x
NPC[NPCid][5] = dy; //destination y
NPC[NPCid][6] = s; //status - 0: arrived, 1: en route
};

//defines NPCs
var CreateNPC = function ()
{
"use strict";
//var i;
for (NPCid = 0; NPCid < 10; NPCid++)
{
var x = PS.Random (30);
var y = PS.Random (30);
var c = COLOR.human;
var g = " ";

var r = PS.Random (100);

if (r < 50)
{
c = COLOR.human;
}
else if (r < 75)
{
c = COLOR.nigro;
}
else
{
c = COLOR.asian;
}

r = PS.Random (19);
g = letters[r];

while (PS.BeadData(x, y) === "blocked")
{
x = PS.Random (30);
y = PS.Random (30);
}

MakeNPC(x, y, c, g, NPCid, x, y, 0);
}
};

// NPC pathfinding
var NPCAI = function(NPCid)
{
"use strict";
debugger;
//choosing destination for NPC
if (NPC[NPCid][6] == 0)
{
var r = PS.Random (100);
var idx = Math.floor(r / 10);

NPC[NPCid][4] = locations[idx][0];
NPC[NPCid][5] = locations[idx][1];
}

//checking if NPC isn't already at its destination
if (NPC[NPCid][4] == NPC[NPCid][0] && NPC[NPCid][5] == NPC[NPCid][1])
{
NPC[NPCid][6] = 0;
}
else
{
NPC[NPCid][6] = 1;
}


//pathfinding logic
if (NPC[NPCid][6] == 1)
{

var pointAx = NPC[NPCid][0]; //current position x
var pointAy = NPC[NPCid][1]; //current position y

var pointBx = NPC[NPCid][4]; //destination x
var pointBy = NPC[NPCid][5]; //destination y

var adjacent_squareNx = pointAx;
var adjacent_squareNy = pointAy - 1;

var adjacent_squareEx = pointAx + 1;
var adjacent_squareEy = pointAy;

var adjacent_squareSx = pointAx;
var adjacent_squareSy = pointAy + 1;

var adjacent_squareWx = pointAx - 1;
var adjacent_squareWy = pointAy;

var G = new Array(4); //cost of moving to given adjacent square
var H = new Array(4); //cost of movimg to pointB from given adjacent square
var F = new Array(4); //total cost of a move = G + H


G[0] = 10; //N
G[1] = 10; //E
G[2] = 10; //S
G[3] = 10; //W


H[0] = 10*(Math.abs(adjacent_squareNx-pointBx)+Math.abs(adjacent_squareNy-pointBy));
H[1] = 10*(Math.abs(adjacent_squareEx-pointBx)+Math.abs(adjacent_squareEy-pointBy));
H[2] = 10*(Math.abs(adjacent_squareSx-pointBx)+Math.abs(adjacent_squareSy-pointBy));
H[3] = 10*(Math.abs(adjacent_squareWx-pointBx)+Math.abs(adjacent_squareWy-pointBy));


F[0] = G[0]+H[0];
F[1] = G[1]+H[1];
F[2] = G[2]+H[2];
F[3] = G[3]+H[3];

var path = Math.min(F[0], F[1], F[2], F[3]); //WARPATH LOL

//choosing the right path
if (path == F[0])
{
//go N
if (pointAy > 0)
{
if (!(PS.BeadData(pointAx, pointAy - 1) === "blocked"))
{
// Set bead to Previous State
PS.BeadColor(pointAx, pointAy, Previous_bead_NPC[NPCid][2]);
PS.BeadData(pointAx, pointAy, 0);
PS.BeadGlyph(pointAx, pointAy, " ");                 
// Increment
pointAy -= 1;
// Place NPC
MakeNPC(pointAx, pointAy, NPC[NPCid][2], NPC[NPCid][3], NPC[NPCid][4], NPC[NPCid][5], 1);
}
}
}
else if (path == F[1])
{
//go E
if (pointAx < 31)
{
if (!(PS.BeadData(pointAx + 1, pointAy) === "blocked"))
{
// Set bead to Previous State
PS.BeadColor(pointAx, pointAy, Previous_bead_NPC[NPCid][2]);
PS.BeadData(pointAx, pointAy, 0);
PS.BeadGlyph(pointAx, pointAy, " ");                 
// Increment
pointAx += 1;
// Place NPC
MakeNPC(pointAx, pointAy, NPC[NPCid][2], NPC[NPCid][3], NPC[NPCid][4], NPC[NPCid][5], 1);
}
}
}
else if (path == F[2])
{
//go S
if (pointAy < 31)
{
if (!(PS.BeadData(pointAx, pointAy + 1) === "blocked"))
{
// Set bead to Previous State
PS.BeadColor(pointAx, pointAy, Previous_bead_NPC[NPCid][2]);
PS.BeadData(pointAx, pointAy, 0);
PS.BeadGlyph(pointAx, pointAy, " ");                 
// Increment
pointAy += 1;
// Place NPC
MakeNPC(pointAx, pointAy, NPC[NPCid][2], NPC[NPCid][3], NPC[NPCid][4], NPC[NPCid][5], 1);
}
}
}
else if (path == F[3])
{
//go W
if (pointAx > 0)
{
if (!(PS.BeadData(pointAx - 1, pointAy) === "blocked"))
{
// Set bead to Previous State
PS.BeadColor(pointAx, pointAy, Previous_bead_NPC[NPCid][2]);
PS.BeadData(pointAx, pointAy, 0);
PS.BeadGlyph(pointAx, pointAy, " ");                 
// Increment
pointAx -= 1;
// Place NPC
MakeNPC(pointAx, pointAy, NPC[NPCid][2], NPC[NPCid][3], NPC[NPCid][4], NPC[NPCid][5], 1);
}
}
}


}

//checking if NPC has arrived
if (NPC[NPCid][4] == NPC[NPCid][0] && NPC[NPCid][5] == NPC[NPCid][1])
{
NPC[NPCid][6] = 0;
}
else
{
NPC[NPCid][6] = 1;
}
};

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xion

  • Redaktor
    • xion.log

  • +2
# Lipiec 09, 2012, 00:39:00
Pomiąchały ci się indeksy w tej twojej tablicy z danymi NPCa. NPC[NPCid][4] to raz jest (chyba?) współrzędna X NPCa, ale do MakeNPC() z NPCAI() jest to przekazywane jako NPCid; gdy wartość NPCid jest większa niż 10, to pierwsze indeksowanie Previous_bead_NPC zwraca undefined (bo element nie istnieje w tej tablicy) więc kolejne rzuca błędem.

Zamiast tych dziwnych tablic i funkcji z siedmioma parametrami, dane NPCa trzymaj w obiekcie z atrybutami x, y, etc. Wtedy w ogóle nie miałbyś takich błędów jak ten.

Offline darthtomi

  • Użytkownik

# Lipiec 09, 2012, 02:22:37
O ja pierdole...

Ja tu jakieś skrypty do konsoli Firebuga pisze cały dzień, debuguje jak szalony, a to mózg powinienem sobie zdebugować...

Nawet nie wiesz jak bardzo jestem Ci wdzięczny Xion :płacz_ze_szczęścia:

Jak zaczynałem to pisać to nie wiedziałem, że istnieje jakaś alternatywa dla tablic:( Następnym razem będę mądrzejszy.

Offline Xion

  • Redaktor
    • xion.log

# Lipiec 09, 2012, 14:19:45
Nie ma sprawy. Polecam się na przyszłość ;)