Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.06.2010, 15:31

Pixel2Tile

Hallo,

ich habe angefangen ein 2d spiel in isometrischer ansicht zu programmieren. jetzt bin ich gerade dabei zu programmieren, dass man gebäude bauen kann. Das Problem ist, ich möchte bestimmen auf welchem Tile der Mauszeiger sich gerade befindet. Die Tiles sind um 45° gedrehte Quadrate, das heißst, das bild ist doppelt so breit wie hoch. Dadurch das die Tiles gedreht sind, überlappen sich die Bilder jetzt logischerweise, wie bekomme ich also raus auf welchen sich die Maus befindet. Ich habs mal so versucht:

C-/C++-Quelltext

1
2
pTile->X = (pPixel.X+pCamera.X)/128;
    pTile->Y = (pPixel.Y+pCamera.Y)/32;


Das ist aber irgendwie sehr ungenau...

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

19.06.2010, 16:11

hi. du zeichnest die tiles doch oder? wie positionierst du diese? gibt es keine möglichkeit die berechnung umzustellen?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

19.06.2010, 16:30

das berechnen sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
for(int i=0;i<pTilesX;i++)
    {
        for(int j=0;j<pTilesY;j++)
        {
            Tiles[i][j].Position.X = (j%2==0)?i*128:i*128-64;
            Tiles[i][j].Position.Y = j*32-32;
        }
    }


ein tile ist 128pixel breit und 64 hoch.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

19.06.2010, 16:32

Hallo!

Also, ich persönlich kann dir nicht helfen, aber habe einfach mal "maus auf isometrischer tilemap" gegooglet und folgendes gefunden:
http://www.developia.de/forum/frage125825.html

Vielleicht hilft es dir ja weiter :)
WIP Website: kevinheese.de

5

19.06.2010, 17:21

hm, habs jetzt so gelöst:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void PixelToTile(SVector pPixel, SVector pCamera, SVector* pTile)
{
    pTile->Y = (pPixel.Y+pCamera.Y+32)/32;
    pTile->X = (pTile->Y%2==0)?(pPixel.X+pCamera.X)/128:(pPixel.X+pCamera.X+64)/128;
}

void TileToPixel(SVector pTile, SVector pCamera, SVector* pPixel)
{
    pPixel->X = (pTile.Y%2==0)?pTile.X*128-pCamera.X:pTile.X*128-64;
    pPixel->Y = pTile.Y*32-32-pCamera.Y;
}

MasterK

Frischling

Beiträge: 92

Wohnort: Koblenz

Beruf: Teamleiter Softwareentwicklung

  • Private Nachricht senden

7

22.06.2010, 14:33

Zitat von »MasterK«


Kann man das eigentlich immernoch mit Mousemaps machen? Oder ist die Technik irgendwie veraltet oder in irgendeiner Forum unschön?
stɪl traɪ tuː θɪŋk ˈpɒzətɪv

8

18.07.2010, 13:13

leute, ich bin mal wieder am verzweifeln :wacko:

ich hab meinen code jetzt so geändert, dass er eine raute erzeugt, so:

C-/C++-Quelltext

1
2
3
4
5
void TileToWorld(SVector pTile, SVector pSize, SVector* pWorld)
{
    pWorld->X = pSize.X/2-pTile.X*64+pTile.Y*64-64;
    pWorld->Y = (pTile.X+pTile.Y)*32;
}


wieder das gleiche problem: anhand der weltkoordinaten das tile bestimmen. Ich versuchs gerade so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void WorldToTile(SVector pWorld, SVector pSize, SVector* pTile)
{   
    //Punkt um 45° rotieren
    float Angle = 45.0f*D3DX_PI/180.0f;
    float Radius = sqrt(pow(pWorld.X-pSize.X/2.0f, 2.0f) + pow(pWorld.Y-pSize.Y/2.0f, 2.0f));
    int X = static_cast<int>(pWorld.X + sin(Angle)*Radius);
    int Y = static_cast<int>(pWorld.Y + cos(Angle)*Radius);

    int lenght = static_cast<int>((pSize.X-sqrt(pow(pSize.X/2.0f, 2.0f) + pow(pSize.Y/2.0f, 2.0f)))/2.0f);
    X -= lenght;
    Y -= lenght;

    X/=72; //bei Rautengröße 128*64 ist das die Seitenlänge
    Y/=72;

    pTile->X = X;
    pTile->Y = Y;

}


ich drehe den punkt um 45°, was auch funktioniert, jetzt versuch ich mir vorzustellen, das ganze feld zu drehen und dann einfach zu gucken in welchen quadrat der punkt liegt, was bei quadraten ja deutlich einfacher ist als bei rauten... geht aber nicht, ich hab irgendwelche fehler drinn, könnt ihr mir vielleicht tipps geben, wie das besser geht? (oder überhaupt erstmal geht :) )

Werbeanzeige