Autor Beitrag
ConditionZero
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 190

Win XP
Delphi 7 PE, C++ (Dev-C++), HTML+PHP (Dreamweaver MX), JavaScript(MS FrontPage)
BeitragVerfasst: So 13.09.09 00:00 
Abend miteinander,

Ich glaube das wird jetzt relativ schwer euch zu erklären was ich denn genau machen möchte, aber ich probiers' einfach mal: :roll:

Ich möchte das Formular in ein Raster unterteilen. Jeder Rasterteil hat einen bestimmten (jedes gleichgroß und quadratisch) zuständigen Pixelbereich. Im Beispiel ist dieser 49x49 Pixel pro Koordinate. Später möchte ich auf Mausklicks in diesen Zuständigkeitsbereichen agieren. Für das MausClick-Event sollen also Integerwerte angegeben werden, welche die Beträge haben, als ob ein Pixel auf 49*49 Pixel gezehrrt wird.
(Verständlich ausgedrückt :!: :?: )
Demnach brauch ich ja eine Umrechnung von Pixel zu Koordinate und genau an dieser Scheitert es momentan.
Das Raster für die Events soll übrigens in einem 2-Dimensionalem Integer-Array gespeichert werden.
Ich dachte da an die Rechnung
Zuständige Koordinate = Rastergröße in Pixel / Koordinatenbreite/-höhe

Da ich für die Unterteilung in das Array "Raster" auf Anhieb nichts implementieren konnte, hatte ich es erstmal damit versucht, die Koordinate auf die geklickt wurde zu ermitteln.


So in etwa sah das aus: (Bekomme konstante Ergebnisse herau, egal wo geklickt wird, hatte heute Mittag noch dynamische Ergebnisse, welche aber auch falsch waren. Leider nach Programmabsturz Code weg...)

ausblenden volle Höhe Delphi-Quelltext
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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
//Globale Variablen
var
  GameForm: TGameForm;

  // Variablen für die Kartengröße
    // Kartengröße in Pixel
    MapsizeInPixel: TPoint;
    // Kartengröße in Rasterkoordinaten
    MapsizeGrid: TPoint;

  // Beinhaltet nach einem Mausklick die Koordinaten des Angeklickten Punktes.
  // Diese Koordinaten werden gelöscht wenn die Zielkoordinaten erreicht werden
  // oder durch einen neuen Zielpunkt den der EB z.L. anklickt erneuert.
  Walk_Zielpunkt: TPoint;


  // 2-Dimensionales Array, welches Koordinaten-Zuständigkeitsbereiche festlegt.
  Raster: Array of Array of Integer;


(*--------------------------------------------------------*)

procedure TGameForm.CreateGrid(LengthX,LengthY,Size: Integer);
begin
{Das Raster ist immer Quadratisch, deshalb muss nur
eine Höhe angegeben werden. LengthX und LengthY gibt
die Anzahl der Quadrate ein}


// Von Koordinaten mit Größenfaktor mulziplizieren um
// die Kartengröße in Pixel zu berechnen und in Variabel speichern
MapsizeInPixel.X:= LengthX * Size;
MapsizeInPixel.Y:= LengthY * Size;


// Das Rasterarray auf angegebene Größe ändern
SetLength(Raster,LengthX,LengthY);

(*--------------------------------------------------------*)

procedure TGameForm.Move;
var
Extractpath: String;

begin
// Pfad zum Projektordner ermitteln
Extractpath:= ExtractFilePath(ParamStr(0));

//Bewegungsanimation laden
Image1.Picture.LoadFromFile(Extractpath + '\data\gui\Walk.gif');


(*IM FOLGENDEM SITZT NUN DER FEHLER*)
// Bewegungzielpunkt von Pixelangabe in zuständige Koordinate umrechnen
Walk_Zielpunkt.X:= MapsizeInPixel.X div 24;
Walk_Zielpunkt.Y:= MapsizeInPixel.Y div 24;


WalkTimer.Enabled:= true;
(* DANACH WIEDER AUSSCHALTEN WENN AN ZIELPUNKT ANGEKOMMEN!!! *)

// Zu Testzwecken
ShowMessage(IntToStr(Walk_Zielpunkt.X)+' '+IntToStr(Walk_Zielpunkt.Y));
end;

Habe lieber mal zuviel Code als zuwenig reingepostet, also sorry wenn was unnötiges drin ist.

Hoffe ich versteht was ich will und könnt mir helfen

Grüße ConditionZero


Zuletzt bearbeitet von ConditionZero am So 13.09.09 13:01, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.09.09 08:40 
Genau so etwas mache ich z.B. bei meinem Periodensystem, wo ich alles in eine TPaintBox zeichne. Vielleicht gibt es dir ja Ideen.

Zum Thema selbst:
ausblenden Delphi-Quelltext
1:
Walk_Zielpunkt.X:= MapsizeInPixel.X div 24;					
MapsizeInPixel.X ist doch die Größe der Karte insgesamt, oder? Das heißt, wenn du den Wert durch 24 teilst, landest du doch immer ganz unten rechts auf der Karte. :gruebel:
Ist das wirklich der Zielpunkt?

Die Umwandlung an sich ist so schon richtig:
Gridkoordinate := Pixelkoordinate div GridSize;
Pixelkoordinate := Gridkoordinate * GridSize;
ConditionZero Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 190

Win XP
Delphi 7 PE, C++ (Dev-C++), HTML+PHP (Dreamweaver MX), JavaScript(MS FrontPage)
BeitragVerfasst: So 13.09.09 13:01 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Genau so etwas mache ich z.B. bei meinem Periodensystem, wo ich alles in eine TPaintBox zeichne. Vielleicht gibt es dir ja Ideen.


Danke, werd ich mir mal anschauen.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Zum Thema selbst:
ausblenden Delphi-Quelltext
1:
Walk_Zielpunkt.X:= MapsizeInPixel.X div 24;					
MapsizeInPixel.X ist doch die Größe der Karte insgesamt, oder? Das heißt, wenn du den Wert durch 24 teilst, landest du doch immer ganz unten rechts auf der Karte. :gruebel:
Ist das wirklich der Zielpunkt?


Hoppla, hatte nicht darauf geachtet das durch 24 geteilt wird. Hatte ich mal drinnenstehen um was auszuprobieren.
Das sollte eigentlich so aussehen
ausblenden Delphi-Quelltext
1:
Walk_Zielpunkt.X:= MapsizeInPixel.X div 49;					


Die 49 wird dann natürlich noch durch eine Variabel erstetzt welche die Länge und Höhe (identisch) einer Koordniate beinhaltet.


user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Die Umwandlung an sich ist so schon richtig:
Gridkoordinate := Pixelkoordinate div GridSize;
Pixelkoordinate := Gridkoordinate * GridSize;


Ja aber leider funktioniert das nicht, wenn ich es so implementiere :(
Aber Waurum?

Nervig, dass man an so einer simplen Sache oft ewig rumnagt.





//Edit:
Problem gelöst. Danke jaenike

Wie immer falls jemand über Suche darauf stößt der das selbe oder ähnliche Problem hat, hier die Lösung:
ausblenden Delphi-Quelltext
1:
2:
3:
// Bewegungzielpunkt von Pixelangabe in zuständige Koordinate umrechnen
Walk_Zielpunkt.X:= ScreenToClient(Mouse.CursorPos).X div 49;
Walk_Zielpunkt.Y:= ScreenToClient(Mouse.CursorPos).Y div 49;




Grüße Marc
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: So 13.09.09 17:51 
Hallo,

ich würde dir das TDrawGrid empfehlen. Hab mal ein Spiel angefangen zu schreiben, wo es auch darum geht auf welches Feld geklickt wird.

TDrawGrid hat einige Vorteile:

- einfache Handhabung beim Zeichnen da fertige Komponente
- schnelle Komponente (schneller als einzelne Elemente)
- der aber für deinen Fall größte Vorteil ist, es gibt die Funktion "MouseCoord()", diese Funktion gibt dir direkt die Werte für die Zeile und Spalte zurück auf die geklickt wurde :zustimm: :dance2:

Zum verwenden kannst du ja die inaktiven Zeilen ausblenden und das Grid auf die größe deines Form Fensters anpassen. Wenn du die einzelnen Kästen nicht sehen willst kannst du auch die Striche verstecken.

Hoffe ich konnte weiterhelfen

Gruß Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 13.09.09 17:54 
Dafür hat man halt auch ne zusätzliche visuelle Komponente. Wenn das so reicht, ist das ja ok.

Ich selbst wollte beim Periodensystem z.B. flexibler bleiben (verschiedene Rastergrößen und Abstände, ...), usw., das ging mit der PaintBox sehr viel einfacher.
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: So 13.09.09 18:06 
Da stimm ich dir zu für das Periodensystemproblem ist es nicht das optimale. Was aber in diesem Fall ja mit dem speziellen Aufbau zu tun hat.

Für das Problem, das man eine Fläche mit vielen gleichmäßigen Formen, ist das TDrawGrid eine sehr schnelle und unkomplizierte Lösung, da die Funktion die man braucht eigentlich alle schon in die Komponente gepackt sind.

Gruß Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.