Avatar billede razmuz_dk Nybegynder
09. april 2006 - 00:51 Der er 6 kommentarer og
1 løsning

Hvilken "metode" skal jeg vælge?

Hejsa javacript-eksperter,

Jeg har læst et par bøger om Javascript her på det seneste. Jeg regner med i den nærmeste fremtid, at skulle starte et nyt webbaseret spil op hvori der indgår meget Javascript. I den forbindelse tror jeg, at jeg kommer til at jeg i mange tilfælde kan drage nytte af at bruge Javascript's OOP-muligheder. Men jeg er endnu ikke helt sikker på hvornår det er en god idé at bruge OOP og hvornår det ikke er. Jeg har skrevet tre stykker kode som gør akkurat det samme - disse er postet herunder. De tre kodestykker benytter sig af 3 vidt forskellige metoder/teknikker. Jeg vil blive glad hvis I - med udgangspunkt i eksempler - kunne fortælle hvilke metoder der er bedst, hvornår og hvorfor. De tre stykker kode er adskilt af /////...

var fields = new Array();

function create_field(x, y, color, walkable) {
    fields[x + ',' + y] = [color, walkable];
}

function is_walkable(x, y) {
    if(fields[x + ',' + y][1]) return true;
    else return;
}

create_field(1, 1, 'black', 1);
create_field(1, 2, 'green', 1);
create_field(2, 1, 'yellow', 1);
create_field(2, 2, 'brown', '');

if(is_walkable(1 ,2)) alert('1,2 is walkable...');
if(is_walkable(2 ,2)) alert('2,2 is walkable...');

////////////////////////////////////////////////////////////

var fields2 = new Array();

field.prototype.walkable = false;
field.prototype.is_walkable = function() {
    if(this.walkable) return true;
    else return;
}
function field(color, walkable) {
    this.color = color;
    this.walkable = walkable;
}

fields2['1-1'] = new field('black', 1);
fields2['1-2'] = new field('greenk', 1);
fields2['2-1'] = new field('yellow', 1);
fields2['2-2'] = new field('brown', '');

if(fields2['1-2'].is_walkable()) alert('1,2 is walkable');
if(fields2['2-2'].is_walkable()) alert('2,2 is walkable');

////////////////////////////////////////////////////////////

var fields = {
    field: new Array(),
    create_field: function(x, y, color, walkable) {
        this.field[x + ',' + y] = [color, walkable];
    },
    is_walkable: function(x, y) {
        if(this.field[x + ',' + y][1]) return true;
        else return;
    }
}

with(fields) {
    create_field(1, 1, 'black', 1);
    create_field(1, 2, 'green', 1);
    create_field(2, 1, 'yellow', 1);
    create_field(2, 2, 'brown', '');
   
    if(is_walkable(1, 2)) alert('1,2 is walkable..');
    if(is_walkable(2, 2)) alert('2,2 is walkable..');
}


Hvis du ser en endnu nemmere måde at udføre ovenstående handlinger, vil jeg meget gerne høre om den :-)

På forhånd tak,
- Rasmus
Avatar billede roenving Novice
09. april 2006 - 10:22 #1
For det første generer det mit øje, at du bruger 'kunstige' dimensioner i dit aray, det ville vel være bedst, hvis du havde dine dimensioner fr sig selv ?-)

-- for det andet er det vel fornuftigt at have en boolean property (sand/falsk) som boolean ...

-- for det tredje ville jeg selv have et objekt, der var hele området og et andet objekt til felterne inde i det område !o]

-- så f.eks.

<script type="text/javascript">
function Area(xSize, ySize, defColor){
  this.fields = new Array();
  for(i=0;xSize>i;i++){
    this.fields[i] = new Array();
    for(j=0;ySize>j;j++){
      this.fields[i][j] = new Field(defColor,false);
    }
  }
}
function Field(color, walkable){
  this.color = color;
  this.walkable = walkable;
}
Area.prototype.setField = function(x, y, color, walkable){
  this.fields[x][y].color = color;
  this.fields[x][y].walkable = walkable;
}
/*
Area.prototype.setField = function(x, y, color, walkable){
  this.fields[x][y] = new Field(color, walkable);
}
*/
Field.prototype.is_walkable = function(){
  return this.walkable;
}
var myArea = new Area(2,2,'white');
myArea.setField(0,0,'black',true);
myArea.setField(0,1,'green',true);
myArea.setField(1,0,'yellow',true);
myArea.setField(1,1,'brown',false);
alert("Felt 1,1 er " + (myArea.fields[0][0].is_walkable() ? "walkable" : "ikke walkable"));
alert("Felt 2,2 er " + (myArea.fields[1][1].walkable ? "walkable" : "ikke walkable"));
</script>

-- jeg har så benyttet javascripts nulbasering i arrays med videre, men det er ikke det, der tager mest tid at lave om ...

-- bemærk de to forskellige setFields, i forhold til større objekter er det nok den brugte, der er den mindst arbejdsintensive, men den udkommenterede jo er nemmest at overskue ...

-- bemærk også at benyttelse af en boolean property helt overflødiggør is_walkable-funktionen, da man jo bare kan aflæse propertyen !-)
Avatar billede roenving Novice
09. april 2006 - 10:24 #2
-- og afhængig af benyttelsen af objekterne skal der jo nok indbygges noget fejlhåndtering !-)
Avatar billede razmuz_dk Nybegynder
09. april 2006 - 20:26 #3
Hej roenving. Mange tak for dit indlæg - det hjalp mig meget.

Dog tvivler jeg på om din idé om at oprette samtlige fields i area'et til at starte med er en god en idé, da "kortet" i praksis indeholder rigtig mange felter (hvilket du ud fra mit oplæg ikke kunne vide noget om) - og der vil derfor blive oprettet lige så mange objekter (hvilket jo vil tage en hulens masse ram).

Når man "logger ind" vil man på skærmen kun se fx 0,5% af hele "verdenens" felter. Meningen er, at felterne i mit spil først skal loades/oprettet efterhånden som man bevæger sig rundt på kortet (color, walkable og lignende indstillinger hentes via noget AJAX).

Men umiddelbart er det vel relativt nemt at lave sådan, at det kun er nogle felter indenfor et givent område af kortet der oprettes (evt. ud fra områdets "diagonal-hjørne-punkter").

Et tillægsspørgsmål:
Jeg forstår godt meningen med .prototype - og jeg kan godt se det smarte i det du bruger den til. Dog synes jeg ikke den er særlig logisk i den visuelle stuktur i koden. I PHP plejer jeg at smide hele objekt-typens kode ind i
<?php
class klassenavn() {
  // HER - altså ind i mellem to tuborg'er
}
?>

Det giver visuelt godt overblik at det HELE står indenfor { og }. Tilsvarende overblik synes jeg umiddelbart ikke at føle når jeg ser på den måde man bruger prototype på. Men det er måske bare mig?

Men hvert fald, mange tak for hjælpen indtil videre:-)
Avatar billede roenving Novice
11. april 2006 - 17:02 #4
I javascript skal (hrm, måske bør !-) du sådan noget, hvis du vil have det inde i klasse-definiionen:

function Field( ... ){
  //...
  this.enFunktion = function(parm1,parm2){
    //gør noget med parm1 og parm2 i objektet !o]
  }
}
Avatar billede razmuz_dk Nybegynder
22. juni 2006 - 15:09 #5
Tak for dine indlæg. Svar for point :)
Avatar billede roenving Novice
25. juli 2006 - 00:04 #6
Velbekomme '-)
Avatar billede roenving Novice
10. august 2006 - 16:15 #7
-- og tak for point ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester