Autor |
Beitrag |
kindliche kaiserin
Hält's aus hier
Beiträge: 2
|
Verfasst: Mi 17.02.10 12:23
Hallo,
ich habe folgendes Problem. Wie der Thread-Titel schon sagt, möchte ich gerne das Spiel Schiffe versenken programmieren. Nur komme ich jetzt nicht weiter.
Ich habe auf meinem Formular zwei Image-Felder...einmal das Spielfeld des Computergegners und einmal eigene Feld. Außerdem noch fünf unterschiedlich große Imagefelder, die die Schiffe darstellen. Wenn man nun auf ein Schiff klickt, werden die Höhe und Breite der Felder in den Speicher geladen. Dann soll man auf das eigene (Image-)Spielfeld klicken, damit dort das Schiff an der jeweiligen Stelle eingesetzt wird.
Beim Klick auf das Spielfeld werden auch die Koordinaten des Mausklicks in den Speicher geladen, damit man dann den Startpunkt für das Rechteck hat, welches dann mithilfe der Variablen Höhe und Breite vom Schiff in das Spielfeld gezeichnet wird.
Nur funktioniert das nicht alles so, wie ich es mir vorstelle. Wenn ich in die linke obere Ecke des Feldes klicke, welche ja die Koords (0,0) haben müssten, werden aber die Koords (737,437) geladen.
Hier der Quellcode:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.img_menschClick(Sender: TObject); var mouse_pos: TPoint; x, y: integer; begin getcursorpos(mouse_pos); x:=mouse_pos.X; y:=mouse_pos.y; img_mensch.canvas.pen.color:=clblack; img_mensch.Canvas.Pen.Width:=1; img_mensch.canvas.brush.color:=clgreen; img_mensch.canvas.moveto(x,y); img_mensch.Canvas.Rectangle(x,y,laenge,hoehe); end; |
Die Variablen "laenge" und "hoehe" habe ich global deklariert.
Kann mir bitte jemand sagen, wo bei mir der Fehler liegt?
Danke!
Zuletzt bearbeitet von kindliche kaiserin am Mi 17.02.10 12:48, insgesamt 1-mal bearbeitet
|
|
Gausi
Beiträge: 8538
Erhaltene Danke: 475
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 17.02.10 12:34
Hallo und in der Entwickler-Ecke!
Zuersteinmal sind die Namen Width und Height für die Variablen ungünstig, da die Form auch schon Eigenschaften mit diesem Namen hat. Was dann genau genommen wird, ist nicht immer unbedingt klar.
Zu getcursorpos: Verschiebe mal das Programmfenster woanders hin und probier das nochmal. Dann wirst du sehen, dass getcursorpos die globalen Mauskoordinaten liefert. Der Punkt (0,0) liegt also links oben auf dem Desktop.
Du kannst entweder mit dem Event OnMouseDown arbeiten, wo dir die lokalen Mauskoordinaten mitgeliefert werden, oder die Koordinaten mit ScreenToClient bzw. ClientToScreen umrechnen.
_________________ We are, we were and will not be.
|
|
Boldar
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mi 17.02.10 12:34
width und height gibt es bereits als Felder in TForm.
Ausserdem sind globale Variablen absolut schlechter Stil.
Benenne die um und deklariere sie als private...
Edit: shiiit... zu langsam...
|
|
kindliche kaiserin
Hält's aus hier
Beiträge: 2
|
Verfasst: Mi 17.02.10 12:47
Verzeihung, mir ist ein Fehler unterlaufen. Die Variablen heißen bei mir nicht mehr width und height. So habe ich sie anfangs benannt. Damit bekam ich dann schon Probleme und hatte sie dann einfach mal in laenge und hoehe umbenannt. Das hatte ich hier jetzt falsch gepostet.
|
|
mimi
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 18.02.10 17:29
Warum so umständlich ?
Leichter wird es, wenn du Beispielweise Andorra verwenden würdest. Dann hast du nicht nur OpenGL, DirectX und SDL(Da bin ich mir nicht sicher) zuverfügung sondern auch noch eine Praktische Sprite Engine, die dir Ziel sehr vereinfachen würde.
Wenn du Trotzdem, Canvas verwenden möchtest, solltest du anders vorgehen:
01: Du erstellst verschiedene Objekte, diese könnten Record oder Klassen sein
02: Diese Objekte sind jetzt alle gleich Groß und du speicherst sie in einem 2D Array
03: Bei Diesen Arten von Spielen ist der zwei Spieler Modus Problematisch. Weil, wenn zwei Spieler am PC-Spielen, sehen sie beide, beide Spiel-Hälften. Daher würde ich eine CPU-KI Vorschlagen, was in diesen Fall auch relativ einfach sein sollte.
04: Das Zeichnen würde ich am besten in eine PaintBox auslagern, aber ein TImage geht natürlich auch.
05: Wenn du jetzt auf die Komponente klickst kannst du sehr leicht die Positionen bestimmen. Dazu musst du nur das OnMouseDown der verwenden Komponenten Abfangen und z.b. folgendes schreiben:
Map[x div SizeW, y div SizeH]....
Vorausgesetzt deine Karte heißt Map und ist ein zwei Array. SizeW und SizeH ist deine Größe.
Vielleicht hilft dir das etwas weiter. Wenn du Andorra Verwendest müsstest du anders vorgehen. Bei Bedarf kann ich dir die einzelnen Schritte aber auch erklären(Allgemein gehalten)
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Jakob_Ullmann
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Do 18.02.10 18:23
mini, ich weiß jetzt nicht, warum Andorra die Sache leichter machen sollte? Hört sich für mich aufwendiger an, als einfach den Code so umzuändern, dass die X und Y verwendet werden, die das Ereignis mitbringt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.img_menschClick(Sender: TObject); var x, y: integer; begin img_mensch.canvas.pen.color:=clblack; img_mensch.Canvas.Pen.Width:=1; img_mensch.canvas.brush.color:=clgreen; img_mensch.canvas.moveto(x,y); img_mensch.Canvas.Rectangle(x,y,laenge,hoehe); end; |
|
|
mimi
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 18.02.10 18:24
Nun ja, dass muss jeder für sich selbst wissen. Es währe eine Alternative. Ob es jetzt unbedingt Einfacher ist, ist vielleicht etwas übertrieben, da hast du durchaus recht.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Jakob_Ullmann
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Do 18.02.10 18:32
Ja, es wäre eine Alternative, die ich besonders bei anspruchsvollen Grafiken vorziehen würde. Aber wenn man nur mit Rechtecken arbeitet, sollte es doch mit Canvas einfacher gehen, und bei heutigen Rechnern müssen die ja nicht unbedingt hardwarebeschleunigt dargestellt werden.
Wenn sie das eher als ihr erstes Spiel ansieht denn als Übungsprogramm, gebe ich dir recht, dann wäre Andorra einen Blick wert.
|
|
mimi
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 18.02.10 18:37
Zitat: | Wenn sie das eher als ihr erstes Spiel ansieht denn als Übungsprogramm, gebe ich dir recht, dann wäre Andorra einen Blick wert. |
Ich gebe dir recht: Es kommt drauf an, was sie genau möchte und wie die Grafiken aussehen. Ich dachte jetzt halt nur an die Sprite Engine, ich habe jedoch auch eine 2D Engine erstellt, die komplett auf Canvas aufbaut.... Für einfache Spiele sollte das ausreichen. Klar, ein Age of Emprie wirst du damit nicht Entwickeln können oder sagen wir nur sehr schwer...
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Teekeks
Beiträge: 211
Erhaltene Danke: 23
|
Verfasst: Do 18.02.10 22:26
|
|
mimi
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 18.02.10 23:16
Dreist.... und dann das nicht mal angeben....
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
guinnes
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Fr 19.02.10 10:15
mimi hat folgendes geschrieben : | Dreist.... und dann das nicht mal angeben.... |
btw: Hier gibts noch einen
Ist auch interessant
|
|
|