[java] instances aanmaken / aanroepen met een variabele

Pagina: 1
Acties:

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Ik ben bezig om als vingeroefening om wat meer van Java te leren een simpele single user dungeon te maken. In principe draait vooralsnog alles wat ik in elkaar gezet, maar ik loop nu tegen het volgende probleem aan:

Ik heb een class Map, waarin onder andere bijgehouden wordt waar op de kaart de speler zich bevindt. Deze is gewoon uniek, omdat de speler natuurlijk maar op een plaats tegelijk kan zijn. Maar als de speler zich verplaatst van 99,01 naar 99,02 dan moet er een klasse aangeroepen worden die MapLocation heet, en een instance gemaakt worden van die klasse als die voor 99,02 nog niet bestaat en als die al wel bestaat aangeroepen kunnen worden om te achterhalen wat er allemaal op die locatie gebeurt. MapLocation kan daarvoor (tot nu toe) genummerde .txt files aanroepen waar specifiek voor die locatie informatie in staat.

Hoe gaat dat in zijn werk? Ik kan het voor een locatie laten werken, maar dan maakt hij gewoon steeds een nieuwe MapLocation aan, en daarom wordt ook steeds alles gereset van die specifieke MapLocation, als ik een bepaalde gebeurtenis al heb gehad:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    private void getMapEvent(int x, int y) {
        fileLocator = "" + x + y;
        MapLocation thisLocation = new MapLocation(fileLocator);
        if ((thisLocation.getEventType()).equals("encounter")) {
            String npc = thisLocation.getEventNpc();
            String action = thisLocation.getEventNpcAction();
            Encounter newEncounter = new Encounter(npc, action);
            System.out.println("Trying to get new event on this location.....");
            thisLocation.eventUp();
            thisLocation.foundFalse();
            getMapEvent(x, y);
        }
        else System.out.println("het werd niet begrepen");
    }


Ik wil dus eigenlijk zoiets doen als (maar dan met een ander soort aanroep voor die filelocator, waarmee een constructor wordt aangeroepen in de klasse MapLocation als die instance van MapLocation nog niet aangemaakt is):

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    private void getMapEvent(int x, int y) {
        fileLocator = "" + x + y;
        MapLocation (fileLocator) = new MapLocation(fileLocator);
        if (((fileLocator).getEventType()).equals("encounter")) {
            String npc = (fileLocator).getEventNpc();
            String action = (fileLocator).getEventNpcAction();
            Encounter newEncounter = new Encounter(npc, action);
            System.out.println("Trying to get new event on this location.....");
            (fileLocator).eventUp();
            (fileLocator).foundFalse();
            getMapEvent(x, y);
        }
        else System.out.println("het werd niet begrepen");
    }


Een paar goede links is ook welkom, soms weet je gewoon net niet waar je het kunt vinden!

[ Voor 27% gewijzigd door BikkelZ op 31-12-2004 12:52 ]

iOS developer


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

BikkelZ schreef op vrijdag 31 december 2004 @ 12:39:
Hoe gaat dat in zijn werk? Ik kan het voor een locatie laten werken, maar dan maakt hij gewoon steeds een nieuwe MapLocation aan, en daarom wordt ook steeds alles gereset van die specifieke MapLocation, als ik een bepaalde gebeurtenis al heb gehad:
Jij moet in een Map kijken of jij als een MapLocatie hebt op die positie:

COBOL:
1
2
3
4
5
MapLocation loc = mapLocationMap.get(new Position(x,y));
if(loc == null){
    loc = new MapLocation(x,y);
    mapLocationMap.put(new Position(x,y),loc);
}


Op deze manier verhinder je dat je iedere keer een nieuwe maplocatie wordt aangemaakt.

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Java:
1
2
3
4
5
MapLocation loc = mapLocationMap.get(new Position(x,y));
if(loc == null){
    loc = new MapLocation(x,y);
    mapLocationMap.put(new Position(x,y),loc);
}


Zo maak ik toch nog steeds de instance loc steeds aan van MapLocation?

[ Voor 57% gewijzigd door BikkelZ op 31-12-2004 13:26 ]

iOS developer


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

BikkelZ schreef op vrijdag 31 december 2004 @ 13:23:
Zo maak ik toch nog steeds de instance loc steeds aan van MapLocation?
Nee.. want je kijkt eerst of die er is (doe je met die get). Is die niet? Dan maak je even een nieuwe instantie aan en plaatst je voor toekomstig gebruik ff in die map.

  • Standeman
  • Registratie: November 2000
  • Laatst online: 10:51

Standeman

Prutser 1e klasse

Kan je MapLocation niet gewoon globaal definieren?

The ships hung in the sky in much the same way that bricks don’t.


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Wat bedoel je precies met "Position"? Die klasse komt bij mij niet voor namelijk.

Excuses voor de n00berigheid....het is waarschijnlijk wel heel basic om klasses aan te maken met een bepaalde naam als ze nog niet bestaan en die vervolgens te kunnen aanspreken via een algemene methode....

[ Voor 59% gewijzigd door BikkelZ op 31-12-2004 13:33 ]

iOS developer


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

BikkelZ schreef op vrijdag 31 december 2004 @ 13:31:
Wat bedoel je precies met "Position"? Die klasse komt bij mij niet voor namelijk.
Die moet je zelf ook maken ;)

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Pos{
   int x,y;

   //constructor
   
   //getters
   
   //toString(altijd handig)
   
   public int hashCode(){
        return x+31xy;
   }
   
   public boolean equals(Object that){                 
        if(that == this)
            return true;
        if(!(that instanceof Pos))
            return false;
            
        Pos thatPos = (Pos)that;
        return thatPos.x = this.x && thatPos.y = this.y;
   }
}

[ Voor 13% gewijzigd door Alarmnummer op 31-12-2004 13:38 ]


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Nog even voor de duidelijkheid / volledigheid:

- Wat is/doet mapLocationMap?
- "class Pos" (en alles wat daar bij zit) moet "class Position" worden?
- Hoe spreek ik die instance van MapLocation aan?

iOS developer


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

BikkelZ schreef op vrijdag 31 december 2004 @ 13:53:
Nog even voor de duidelijkheid / volledigheid:

- Wat is/doet mapLocationMap?
Dat is de opslagplaats voor al jouw maplocations. Jij kan daar maplocations vinden op basis van een position object.
- "class Pos" (en alles wat daar bij zit) moet "class Position" worden?
Yep :)
- Hoe spreek ik die instance van MapLocation aan?
Ligt eraan. Als je het meegeeft als methode kan je het aanspreken zoals iedere andere argument. En als het een field is dan kan je het aanspreken zoals ieder ander field.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Bla{
    
    private Map mapLocationMap = new HashMap();
    
    public void jouwLeukeFunctie(int x, int y){//je kan hier al met pos werken ;)
        MapLocation loc = mapLocationMap.get(new Position(x,y));
        if(loc == null){
            ... die code heb je al
        }
        
        
    }
}

[ Voor 4% gewijzigd door Alarmnummer op 31-12-2004 13:59 ]


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
OK, het begint duidelijk te worden wat wat zou moeten doen en waarom.

Ik ga hier eerst weer eens even mee spelen en dan meld ik me nog wel terug :)

iOS developer


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Daar is ie weer :)

Die hashCode kan natuurlijk nooit een int zijn.

iOS developer


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

BikkelZ schreef op vrijdag 31 december 2004 @ 14:13:
Daar is ie weer :)

Die hashCode kan natuurlijk nooit een int zijn.
Oh? :)

Check de javadoc eens bij hashCode

[edit]
Oeps.. een * ipv een x.
return x+31*y;

[ Voor 14% gewijzigd door Alarmnummer op 31-12-2004 14:16 ]


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Ik heb er dit van gemaakt ivm compiler errors, volgens mij was dit de bedoeling:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package sud;

import sud.*;

class Position{
    int x,y;

    //constructor

    //getters

    //toString(altijd handig)

    public int hashCode() {
        return (x + (31 * x * y));
    }

    public boolean equals(Object that) {
        if(that == this) {
            return true;
        }
        if(!(that instanceof Position)) {
            return false;
        }
        Position thatPosition = (Position)that;
        return thatPosition.x == this.x && thatPosition.y == this.y;
    }
}


Ik ga er van uit dat dit nu goed is, ik ga ff verder met Map.java :)

(Map lijkt trouwens een standaardklasse te zijn.....dat kan problemen opleveren of niet?)

[ Voor 9% gewijzigd door BikkelZ op 31-12-2004 14:28 ]

iOS developer


  • Standeman
  • Registratie: November 2000
  • Laatst online: 10:51

Standeman

Prutser 1e klasse

BikkelZ schreef op vrijdag 31 december 2004 @ 14:27:


Ik ga er van uit dat dit nu goed is, ik ga ff verder met Map.java :)

(Map lijkt trouwens een standaardklasse te zijn.....dat kan problemen opleveren of niet?)
In principe niet, maar ik vind het zelf altijd makkelijker om andere klasse-namen te gebruiken dan die in de SDK voorkomen.. Maakt de kans op vergissen wat kleiner :)

The ships hung in the sky in much the same way that bricks don’t.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

BikkelZ schreef op vrijdag 31 december 2004 @ 14:27:
Ik heb er dit van gemaakt ivm compiler errors, volgens mij was dit de bedoeling:

Ik ga er van uit dat dit nu goed is, ik ga ff verder met Map.java :)
Als je er maar voor zorgt dat iedere 2 gelijke positions... exact dezelfde hashcode terug stuurt. De allerslechtste goed werkende hashcode is bv een constante.
(Map lijkt trouwens een standaardklasse te zijn.....dat kan problemen opleveren of niet?)
Je moet gebruik maken van de standaard java.util.Map en java.util.HashMap :)

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Het zal vast iets simpels zijn, maar ik krijg nog één error bij het compilen:
Map.java:26: incompatible types
found : java.lang.Object
required: sud.MapLocation
MapLocation loc = mapLocationMap.get(new Position(x,y));
Dit is de code geworden:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    private HashMap mapLocationMap = new HashMap();
    private void getMapEvent(int x, int y) {
        MapLocation loc = mapLocationMap.get(new Position(x,y));
        if(loc == null){
            loc = new MapLocation(x,y);
            mapLocationMap.put(new Position(x,y),loc);
        }
        loc.triggerLoadLocation();
        if ((loc.getEventType()).equals("encounter")) {
            String npc = loc.getEventNpc();
            String action = loc.getEventNpcAction();
            Encounter newEncounter = new Encounter(npc, action);
            System.out.println("Trying to get new event on this location.....");
            loc.eventUp();
            loc.foundFalse();
            getMapEvent(x, y);
        }
        else System.out.println("het werd niet begrepen");
    }


en

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package sud;

import sud.*;

class Position{
    int x,y;

    //constructor

    public Position(int x, int y) {
        this.x = x;
        this.y = y;
    }

    //getters

    //toString(altijd handig)

    public int hashCode() {
        return (x + (31 * x * y));
    }

    public boolean equals(Object that) {
        if(that == this) {
            return true;
        }
        if(!(that instanceof Position)) {
            return false;
        }
        Position thatPosition = (Position)that;
        return thatPosition.x == this.x && thatPosition.y == this.y;
    }
}


Eigenlijk net het 'spannendste' stukje wat mis gaat lijkt het.

Ik zie die HashMap en die hashCode ook niet zoveel met elkaar doen, kan dat?

------------------

OK dat zie ik al.

Ben maar even dit gaan lezen:

http://java.sun.com/j2se/...tml#get(java.lang.Object)

[ Voor 8% gewijzigd door BikkelZ op 31-12-2004 15:02 ]

iOS developer


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Het toverwoord = cast:

MapLocation loc = mapLocationMap.get(new Position(x,y));

moet zijn:

MapLocation loc = (MapLocation)mapLocationMap.get(new Position(x,y));

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Alarmnummer schreef op vrijdag 31 december 2004 @ 15:08:
Het toverwoord = cast:

MapLocation loc = mapLocationMap.get(new Position(x,y));

moet zijn:

MapLocation loc = (MapLocation)mapLocationMap.get(new Position(x,y));
Yep! :D

Ik hou alleen nog dit over, maar volgens mij moet ik hier niet van wakker liggen:
Note: E:\studie\java\sud\Map.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Tool completed successfully
Ik begrijp nog niet helemaal 100% van wat er gebeurt en gedaan wordt maar dat komt vanzelf wel!

iOS developer


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 28-03 23:19
Het werkt zoals het zou moeten werken, hartelijk bedankt voor je tijd (of bedank mij voor de tijd die je niet bij saaie familie door hebt moeten brengen, dat kan ook nog ;))!

iOS developer


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

BikkelZ schreef op vrijdag 31 december 2004 @ 15:12:
Het werkt zoals het zou moeten werken, hartelijk bedankt voor je tijd (of bedank mij voor de tijd die je niet bij saaie familie door hebt moeten brengen, dat kan ook nog ;))!
Ik zat nog op mijn werk met erg veel en harde Hip Hop achter me ;)
Pagina: 1