Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Problem]Zmiana w tablicy X zmienia również dane w tablicy Y
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Kongo
@EDIT: NAPRAWIONE ,lecz jeśli ktoś wie dlaczego tak się dzieje prosiłbym o wytłumaczenie!
Jak naprawiłem:
Zdefiniowałem 2 zmienną (arrka2) i zrobiłem pętlę na kolumny arrka. później dałem arrka2[cs] = arrka[c]; i jest okey.
###########################

Witam! Piszę sobie skrypt w NodeJS (w którym piszemy w JavaScript) i mam mianowicie taki problem iż przy zmianie pozycji x lub y w tablicy MapMobs zmienia również dane w tablicy MapMobsOrginal.

Sposób tworzenia tablicy MapMobsOrginal i MapMobs:
Kod
var i = Array();
for(c in MAPMOBS) {
if(i[MAPMOBS[c]['Map_ID']] == undefined) i[MAPMOBS[c]['Map_ID']] = 0;
if(MapMobs[MAPMOBS[c]['Map_ID']] == undefined) MapMobs[MAPMOBS[c]['Map_ID']] = {};
if(MapMobsOrginal[MAPMOBS[c]['Map_ID']] == undefined) MapMobsOrginal[MAPMOBS[c]['Map_ID']] = {};
  //MapMobs - my array
  //MAPMOBS - MySQL Array
  var kn;
  for(ka in Mobs) {
   if(Mobs[ka]['Id'] == MAPMOBS[c]['Mob_ID']) {
    kn = ka;
    break;
   }
  }
  var arrka = {
   '0': i[MAPMOBS[c]['Map_ID']]+1,     //Id
   '1': 1,       //Hp Mobs[kn]['Hp']
   '2': MAPMOBS[c]['x'],      //x
   '3': MAPMOBS[c]['y'],      //y
   '4': Mobs[kn]['Name'],     //Name
   '5': Mobs[kn]['Level'],    //Level
   '6': Mobs[kn]['Hp'],       //Max-Hp
   '7': 'WALKING',            //What he do
   '8': MAPMOBS[c]['Mob_ID'], //Mob Id in General
   '9': MAPMOBS[c]['Id']      //Mob Id in Game
  };
  //jak tu zmieniasz to pamiętaj o lini ok. 387 w nw_functions
  MapMobs[MAPMOBS[c]['Map_ID']][i[MAPMOBS[c]['Map_ID']]] = arrka;
  MapMobsOrginal[MAPMOBS[c]['Map_ID']][i[MAPMOBS[c]['Map_ID']]] = arrka;
  i[MAPMOBS[c]['Map_ID']]++;
}


To jak zmieniam x i y nie ma znaczenia ,ale wrzucę:
(stworek nie może się ruszyć więcej niż o 2 pola od miejsca w którym został utworzony (czyli max zmiana x o 2 i y o 2)
Kod
var MobsPosChange = setInterval(function() {
for(a in MapMobs) {
if(a == 0 || a == 2) continue;
  //S- tam jakies moby. 20% szansy na ruch :
//Rozpier... tablicę:
var nox = MapMobs[a];
for(b in nox) {
var Mob = nox[b];
if(Mob[7] == 'WALKING') {
//console.log('Split for map: '+a+'\nMobKey: '+b+'\nMob Id: '+Mob[0]);
// if(rand(1,2) == 1) { //
   //Okey lecim.
   //Wybierz w jakim kierunku : 2 3
  var directs=Array('',true,true,true,true); //żaden, góra, dół, lewo, prawo
var Mob2= MapMobsOrginal[a][b];    // 3 - y, 2 - x
   if(parseInt(Mob[3]) == parseInt(Mob2[3])-2) directs[1]=false; //Nie moze isc do gory
   if(parseInt(Mob[3]) == parseInt(Mob2[3])+2) directs[2]=false; //Nie moze isc do dolu
   if(parseInt(Mob[2]) == parseInt(Mob2[2])-2) directs[3]=false; //Nie moze isc do lewo
   if(parseInt(Mob[2]) == parseInt(Mob2[2])+2) directs[4]=false; //Nie moze isc do prawo
   var i = 1;
   console.log(directs);
   console.log("Up: "+parseInt(Mob[3])+' == '+(parseInt(Mob2[3])-2));
   console.log("Down: "+parseInt(Mob[3])+' == '+(parseInt(Mob2[3])+2));
   console.log("Left: "+parseInt(Mob[2])+' == '+(parseInt(Mob2[2])-2));
   console.log("Right: "+parseInt(Mob[2])+' == '+(parseInt(Mob2[2])+2));
   console.log("############################");
   for(i>0;i<=2;) {
   var direct = rand(1,4);
   if(direct == 1 && directs[1] == true) { MapMobs[a][b][3]--; break; } //Up
   if(direct == 2 && directs[2] == true) { MapMobs[a][b][3]++; break; } //Down
   if(direct == 3 && directs[3] == true) { MapMobs[a][b][2]--; break; } //Left
   if(direct == 4 && directs[4] == true) { MapMobs[a][b][2]++; break; } //Right
   }
//  }
}
//Tu daj nową warto
console.log(MapMobsOrginal);
}
for(sendall in CLIENTS_MAP[a]) {
if(CLIENTS_MAP[a][sendall] != undefined) {
CLIENTS_MAP[a][sendall].emit('map', {'what': 'MobsOnMap', 'data': MapMobs[a]});
  }
}
}
}, 10000); //TRUE - 10000


Jeśli ktoś czegoś nie rozumie to wytłumaczę wink.gif.

Wielkie dzięki za pomoc!

Jeszcze dorzucę jak wygląda to z poziomu konsoli:

tam gdzie mamy Up/Left/Right/Down:.... to po lewej jest jego aktualna koordynata x lub y ,a po prawej stronie jest wartość stała!
lukasz1985
Proste - dlatego, że tablice są przypisywane przez referencję, a nie przez kopiowanie.


[JAVASCRIPT] pobierz, plaintext
  1. // kopiowanie:
  2.  
  3. var a = 0;
  4. var b = 0;
  5.  
  6. a = 10;
  7. b; // wciąże jest 0
  8.  
  9. // referencja
  10.  
  11. var tab1 = [0,1,2,3,4];
  12. var tab2 = tab1;
  13.  
  14. tab2[0] = 10;
  15.  
  16. tab1[0] ; // 10;
  17.  
  18.  
[JAVASCRIPT] pobierz, plaintext



Piszę o tym tutaj:

http://kursjs.net76.net/spis-tresci/82-pro...ja-i-kopiowanie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.