Hallo, ich bin gerade dabei in kleines rundenbasiertes Strategiespiel zu programmieren. Ich habe also eine kleine Test-Karte, eine Ebene wenn man so will. Die Karte ist in quadratische Felder eingeteilt. Ich hab die komplette Karte schon gerastert, also ich habe die Koordinaten für jedes Feld. Nun ist mein Problem wie ich es hinkriegen, dass man ein Feld per klick auswählen kann. Mein Ansatz war, dass ich ja den Klick in der 2D Ebene des Bildschirms auf die 3D Ebene der Karte übertragen muss. Im Programm kann man sich in x und z Richtung bewegen und zoomen, wobei der Zoom parabel förmig ist. Über den tangens habe ich nun den Winkel berechnet mit der die Kamera auf die Karte guckt. Dann wollte ich abhängig von der Position des Klicks berechnen welchem Feld das entspricht. Vielleicht schwer zu verstehen, hier mal der code:
|
C-/C++-Quelltext
|
1
2
3
4
5
|
temp = vCameraPos.y/(abs(vCameraPos.z-vCameraLookAt.z));
winkel = RAD2DEG(atan(temp)); //Der Winkel in dem die Kamera auf die Karte guckt
schnittpkt.z = vCameraPos.z+ ( (600-pt_trans.y) / tan(winkel) ) ;
schnittpkt.x = pt_trans.x-400; //Schnittpunkte mit der Karte, die Höhe, also y ist immer 0. pt_trans ist eine POINT Struktur und beeinhaltet den Klick auf dem Bildschirm abhängig vom Fenster meiner Anwendung.
|
Das liefert mir allerdings nicht das was es soll. Die Zahlen 600 und 400 kommen übrigens daher, dass ich das ganze im Fenstermodus mit einer Auflösung von 800*600 teste. Ist der Ansatz falsch? Geht es leichter?
Wäre nett wenn mit jemand vielleicht noch mal nen Denkanstoß geben könnte.