Avatar billede quiw Nybegynder
30. september 2011 - 21:19 Der er 11 kommentarer

Isometrik.

Jeg leger lidt med noget isometrik:

Først laver jeg et loop, som generere 10x10 tiles:
        for(int x = 0; x<10;x++){
            for(int y = 0; y<10;y++){
                new Tile(x,y);
            }
        }

Sådan opretter jeg min tile:
    public Tile(int x, int y){
        if(y%2==0){
            this.setX(new Integer(x*64));
        }else{
            this.setX(new Integer(x*64-32));
        }
        this.setY(new Integer(y*16));
    }

Det generere et tile der ser således ud:
http://img29.imageshack.us/img29/2139/isoh.png

Ud fra et museklik, vil jeg nu gerne vide hvilket tile jeg har klikket på, og ved at "omvende" overstående, har jeg lavet følgende funktion:

    public String getTile(int x, int y){
        int tileX;
        int tileY;
       
        tileX = x/64;
        tileY = y/16;
       
        if(y%20 == 0){
            tileY=y/16-32;
        }
       
        return tileX+","+tileY;
    }
Mit problem er blot, at jeg ikke heeeelt får fat i de direkte tiles. Jeg kan ikke rigtigt gennemskue, hvordan jeg skal få fat i mine tiles.

(Jeg har googlet en masse isometriske eksempler, men ingen fungerer som mit eksempel)
Avatar billede Slettet bruger
30. september 2011 - 21:29 #1
i den getTile metode, prøv i omvendt rækkefølge af hvad du gør i din Tile constructor:

tileY = y/16;
if (tileY%2==0) {
  tileX = x/64;
} else {
  tileX = (x+32)/64
}
Avatar billede quiw Nybegynder
30. september 2011 - 21:33 #2
Det er nogenlunde det jeg har gjort. Resultatet er det samme i dit eksempel :/. Jeg tror muligvis modulu ikke er løsningen til at generere dem.

Jeg vil gerne kunne oprette 1 tile, et tilfældigt sted (uden at loope en masse frem), og derefter fange den igen, ved at klikke på den.
Avatar billede quiw Nybegynder
30. september 2011 - 21:34 #3
Jeg har fundet et fantastisk eksempel:
http://gameprogrammingstepbystep.blogspot.com/2011/05/isometric-map-example-with-mouse.html

Men problemet er, at han looper dem alle frem på 1 gang, jeg vil gerne kunne oprette dem enkeltvis, hvor jeg har lyst.
Avatar billede Slettet bruger
30. september 2011 - 21:50 #4
Det virker ellers fint når jeg afprøver det. Bortset fra et semikolon jeg glemte efter:
tileX = (x+32)/64;

Hvor får du dine (x, y) værdier fra? Er det fra museklik? Og bruger du (x, y) koordinater til at skrive din tekst med Graphics (husk på at (x, y) er i forhold til baseline for teksten, så der skal tilføjes en lille korrektion i forhold til y koordinaten fra musen).
Avatar billede quiw Nybegynder
30. september 2011 - 21:56 #5
Har du prøvet at tegne firkanterne op, og teste ved at klikke nøjagtigt? Jeg ved at det virker i grove træk, men den klikker til tider på den tile ved siden af, selvom jeg vælger den rette.

- Jeg tror ikke det er musens unøjagtighed, jeg har haft eksemplet (fra linket) kørende med samme input, som kører smooth.

Har du evt. et forslag til hvordan tiles kan placeres, uden modulu? Det kan være, at det er løsningen til nøjagtighed.
Avatar billede Slettet bruger
30. september 2011 - 21:56 #6
Og hvis det er ud fra museklik skal der også tages højde for at dine firkanter er "skæve".
Avatar billede quiw Nybegynder
30. september 2011 - 22:08 #7
Jeg har skrevet min tile om til:
  this.setX((x * 64 / 2) + (y * 64 / 2));
  this.setY((y * 32 / 2) - (x * 32 / 2));

Nu mangler jeg blot hjælp til at "omvende" den.
Avatar billede quiw Nybegynder
30. september 2011 - 22:16 #8
Problemet er løst:
Opret tile med:
        this.setX((x * 64 / 2) + (y * 64 / 2));
        this.setY((y * 32 / 2) - (x * 32 / 2));

Beregn med:
        int x0 = 130 + 64/2, y0 = 0;
        int mtilex = (int)Math.floor( (y - y0)/(double)32 - (x - x0)/(double)64 );
        int mtiley = (int)Math.floor( (y - y0)/(double)32 + (x - x0)/(double)64 );

        return (mtiley+2)+","+(mtilex*(-1)+2);


Mange tak for hjælpen alligevel, smid gerne et svar :)
Avatar billede Slettet bruger
30. september 2011 - 22:24 #9
Ellers tak. :)
Avatar billede arne_v Ekspert
02. oktober 2011 - 03:03 #10
Nu har jeg slet ikke forstaaet det med de tiles.

Men jeg er maget skeptisk overfor om det er noedvendigt med double og Math.floor !

Eksempel paa ren integer beregning:

public class Convert {
    public static Pos ExtToInt(Pos p) {
        return new Pos(p.getX() * 32 + p.getY() * 32, p.getY() * 16 - p.getX() * 16);
    }
    public static Pos IntToExt(Pos p) {
        return new Pos((p.getX() - 2 * p.getY()) / 64, (p.getX() + 2 * p.getY()) / 64);
    }
    public static void main(String[] args) {
        Pos p1 = new Pos(39, 117);
        System.out.println(p1);
        Pos p2 = ExtToInt(p1);
        System.out.println(p2);
        Pos p3 = IntToExt(p2);
        System.out.println(p3);
    }
}

class Pos {
    private int x;
    private int y;
    public Pos() {
        this(0, 0);
    }
    public Pos(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    @Override
    public String toString() {
        return "(" + x + "," + y + ")";
    }
    @Override
    public boolean equals(Object obj) {
        return obj != null
                && obj instanceof Pos
                && x == ((Pos)obj).x
                && y == ((Pos)obj).y;
    }
    @Override
    public int hashCode() {
        return x + y;
    }
}
Avatar billede arne_v Ekspert
27. november 2011 - 01:44 #11
quiw??
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
Kurser inden for grundlæggende programmering

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