![]() |
Informatik-Projekt: 4x4x4
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute :)
Ich hab da mal eine Frage. Wir sollen uns im Rahmen eines Informatik-Projektes der Klasse 13 ein (Strategie-)Spiel programmieren. Meine Gruppe hat sich für das Spiel 4x4x4 entschieden, eine Art dreidimensionales Vier-Gewinnt. Ein Bild des Spielfeldes befindet sich im Anhang. Die Felder können per Eingabe der Koordinaten in Edit-Felder schon aufgerufen und markiert werden. Es handelt sich dabei um einzelne Polygone. Meine Frage nun: Wie könnte es man anrichten, die Felder mit der Maus anwählbar zu machen? Ich habe dazu leider nichts gefunden, und bin hinsichtlich dieses Gebietes, genauso wie meine Mitschüler, kaum bewandert. Wie könnte man dies möglichst einfach anstellen? Vielen Dank für eure Hilfe! Gruß btw: Falls der Thread hätte doch woanders hingehören sollen, dann tuts mir Leid. :( |
Re: Informatik-Projekt: 4x4x4
hmm, man könnte für die felder ganz normale panels nehmen, diese dann in deiner rautenform ausschneiden und dann ist auch der mausbereich dazu passend, samt den events.
|
Re: Informatik-Projekt: 4x4x4
Hi,
wenn du die Polygone selbst zeichnest, solltest du ja die Koordinaten der Eckpunkte kennen und daraus (einfacherweise in der Zweipunktform) die Geradengleichung herleiten können. Diese formst du in die Hessesche Normalform um, bzw. es reicht, sie in die Normalform umzuwandeln und das Vorzeichen HNF-gemäß anzupassen. Dann kannst du durch Einsetzen des geklickten Punktes ermitteln, ob die Koordinaten in einem Polygon waren, indem du für die Begrenzungsgeraden das Vorzeichen so überprüfst, dass der Punkt dazwischen sein muss. War jetzt nur so eine Idee. Da du ja gerade in der 13. Klasse bist, solltest du verstehen, was ich meine*, und die Idee in Code umwandeln können. Vielleicht bekommst du auch noch eine Idee beim weiter darüber nachdenken, wie du das Problem noch vereinfachen/die Lösung optimieren kannst. Mfg FAlter *) Mir fällt jedenfalls keiner ein bei uns, der in der 13. noch Info gemacht hat und nicht im Mathe-LK war. |
Re: Informatik-Projekt: 4x4x4
Der Einfachheit halber könntest du auch Begrenzungsrechtecke für die Polygone anlegen, und dich von hinten nach vorne durcharbeiten, ob der Cursor auf so einem Rechteck liegt. Wäre IMHO einfacher. :mrgreen:
|
Re: Informatik-Projekt: 4x4x4
Es geht wohl noch einfacher:
Ich nehme mal an, daß die Koordinaten der linken, unteren Ecken der jeweiligen Spielflächen, die Breite und Höhe bekannt sind. Dann läßt sich aus dem Y-Wert der Maus schon mal ermitteln, in welcher Spielfläche man sich eventuell befindet. Jetzt zieht man den Basis-Y-Wert der Spielfläche ab, dividiert durch 4 und rundet das Ganze. Nun hat man eine Zahl im Bereich 0..3, die die Zeile wiedergibt. Dem Anschein nach wird hier eine Micky-Maus-Perspektive {(X,Y) -> (X+Y/2,Y/2} verwendet. Demnach muss man jetzt einfach die im vorigen Schritt errechnete Y-Differenz nach links gehen und den so korrigierten X-Wert vom Basis-X-Wert abziehen. Liegt der neue Wert im gültigen X-Bereich, wird wieder durch 4 dividiert und gerundet. Das wars dann. |
Re: Informatik-Projekt: 4x4x4
Hallo,
erst einmal danke für die Ideen. Die letzte von Uwe Raabe erscheint mir am sinnvollsten. @Jakob Ullman: Wie lege ich denn solche 'Begrenzungsrechtecke' an? Bedenke, die Spielfelder ragen in die Tiefe. Allerdings habe ich noch ein kleines Problem. Wie kann ich denn die Mauskoordinaten herausfinden? Die Idee von hier klappt bei mir nicht so ganz: ![]() Vielen Dank nochmal! |
Re: Informatik-Projekt: 4x4x4
|
Re: Informatik-Projekt: 4x4x4
Alternative: Für das Zeichnen der Polygone müssen dir ja die Eckpunkte bekannt sein. Mithilfe einer PointinPoly-Funktion kannst du dann schnell überprüfen, ob ein Punkt (der Mauszeiger) in einem Polygon liegt. Bei 4x4x4 Polygonen dürfte das ausreichend schnell sein. Wenn es noch schneller sein muss, kannst du erstmal überprüfen, über welcher Ebene dein Mauszeiger ist (grob, anhand des umgebenden Rechtecks). Dann musst du nur noch 16 Polygone vergleichen. Du könntest nun nochmal z.B. auf vier Quadranten einschränken, so dass du im Zweifelsfall ~6 Polygone mit PointinPoly überprüfen musst. Ob sich der Aufwand aber für die Geschwindigkeit lohnt, wage ich zu bezweifeln - es sei denn, du willst aus 4x4x4 später mal 200x200x200 machen :mrgreen: .
Delphi-Quellcode:
PolyArray ist dabei ein Array of TPoint, AnzahlPunkte ein Integer mit der Anzahl der Punkte im Array. WINDING eine Windows-Konstante (ALTERNATE wäre die andere, passt aber hier nicht).
function PointinPoly(P: Tpoint): boolean;
var hnd: hdc; begin hnd := CreatePolygonRgn(PolyArray, AnzahlPunkte, Winding); // Polygonregion erstellen Result := PtInRegion(hnd, p.x, p.y); // Testen, ob Punkt drin DeleteObject(hnd); // freigeben Objekt end; Mfg Codewalker |
Re: Informatik-Projekt: 4x4x4
Zitat:
|
Re: Informatik-Projekt: 4x4x4
@Uwe Raabe: Danke, das hab ich gesucht. Hab's mal in einem extra Programm getestet, funktioniert wunderbar. Zeichenfläche ist ein Image. :)
@All: Hatte heute nicht wirklich viel Zeit. Das übrige werde ich morgen testen, und nochmals herzlichen Dank :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz