Autor Beitrag
kindliche kaiserin
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 17.02.10 12:34 
Hallo und :welcome: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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.

ausblenden 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;
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 211
Erhaltene Danke: 23



BeitragVerfasst: Do 18.02.10 22:26 
*grml* CP
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 18.02.10 23:16 
Dreist.... und dann das nicht mal angeben....

_________________
MFG
Michael Springwald, "kann kein englisch...."
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Fr 19.02.10 10:15 
user profile iconmimi hat folgendes geschrieben Zum zitierten Posting springen:
Dreist.... und dann das nicht mal angeben....
btw:Hier gibts noch einen
Ist auch interessant