![]() |
Labyrinth Spiel-Ist das Möglich?
Hallo zusammen
Ich bin auf die Idee gekommen, ein kleines Spiel zu programmieren. Es sollte so aussehen: Man läd eine "Karte" hoch, die ein Labyrint darstellt. Durch dieses Labyrinth muss man dann mit gedrückter Linker Maustaste mit dem Zeichenstift durch und bis ans Ziel kommen (welches ein Button darstellt, der dann anzeigt: "Gewonnen"). Nun ist die Frage ob es überhaupt möglich ist, z.B. eine "Game Over" MEldung anzuzeigen, wenn der Spieler mit dem Stift aus dem Labyrinth rausgeht. Danke für die Antworten im voraus... Grüße Edit: Mir fällt ein, es müsste auch einen Start-Button geben, den man mit dem Ziel-Button irgendwie verknüpft, dass es nur "Gewonnen" anzeigt, wenn die ganze Zeit über von "Start-Button-Move" bis "Ziel-Button-Move" der Pen "aktiviert war und gemalt wurde. |
AW: Labyrinth Spiel-Ist das Möglich?
Warum sollte das nicht möglich sein?
|
AW: Labyrinth Spiel-Ist das Möglich?
Jap, ist möglich.
btw: Hättest du in deinem alten Thread zwischen den Zeilen gelesen, wären schon ein Teil deiner Fragen beantwortet. |
AW: Labyrinth Spiel-Ist das Möglich?
Ja, das hab ich schon gelesen:
"Image1.Picture.LoadFromFile(fileName); TImage.OnMouseLeave" Wie man ein Bild öffnet hab ich ja schon. Nur das Ereignis TImage.OnMouseLeave find ich nicht. Ich hatte auch eher an etwas gedacht wie, "Wenn pen auf schwarzer hintergrund: Game OVer" Oder so ähnlich. |
AW: Labyrinth Spiel-Ist das Möglich?
Ich glaube die OnMouseLeave-Ereignisse gibt es erst seit neueren Delphi-Versionen ...
|
AW: Labyrinth Spiel-Ist das Möglich?
Falls es die Events erst in neueren Versionen gibt, einfach selbst einbauen:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TImage=Class(ExtCtrls.TImage) private FOnMouseLeave: TNotifyEvent; FOnMouseEnter: TNotifyEvent; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; published Property OnMouseLeave:TNotifyEvent read FOnMouseLeave Write FOnMouseLeave; Property OnMouseEnter:TNotifyEvent read FOnMouseEnter Write FOnMouseEnter; End; TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TImage } procedure TImage.CMMouseEnter(var Message: TMessage); begin if Assigned(FOnMouseEnter) then FOnMouseEnter(Self); inherited; end; procedure TImage.CMMouseLeave(var Message: TMessage); begin if Assigned(FOnMouseLeave) then FOnMouseLeave(Self); inherited; end; end. |
AW: Labyrinth Spiel-Ist das Möglich?
Also ich hab mir das jetzt mal so überlegt:
Ich hab einen Start- und einen Ziel-Button. WENN ich auf den StartButton geklickt habe, aktivierts den Pen und wenn ich über das Image fahre zeichent es. Wenn ich beim Ziel-Button angelangt bin, klick ich dort drauf, den Pen deaktivierts und man hat gewonnen. Nun hab ich da schon ein wenig rumprobiert, aber komm auf keinen grünen Zweig... |
AW: Labyrinth Spiel-Ist das Möglich?
Lass die Buttons weg, reagiere auf Mousedown im Bild, wenn an der richtigen Stelle da wo Start steht die Maus gedrückt wird aktivierst Du den Pen, jedes Mausmove führt zu einem Paint, nachdem Du geprüft hast ob die Maus nicht schon die Wand berührt(dann Abbruch). Ein MouseUp an der falschen Stelle (da wo nicht Ende steht) führt ebenfalls zum Abbruch.
|
AW: Labyrinth Spiel-Ist das Möglich?
Okay klingt gut...Wie kann ich so Felder bestimmen? Wenn hier gedrückt, dann...?
|
AW: Labyrinth Spiel-Ist das Möglich?
Die Position hast Du ja im MouseDown, entweder Du weißt wo Start und Ende sind, dann ala
Delphi-Quellcode:
oder Du hast das Startfeld eindeutig Farblich markiert, dann könntest Du prüfen ob Pixels[x,y]=StartFarbe.
HitStart := (x >= sx1) and (x <= sx2) and (y >= sy1) and (y <= sy2)
|
AW: Labyrinth Spiel-Ist das Möglich?
hmm...ich bekomm das einfach nicht hin. Hab es mal mit einem Panel versucht aber dann lief es nicht und einen Bereich festzulegen hab ich auch nicht hinbekommen...Könntest du vielleicht mal den ganzen Code posten? Vielleicht versteh ichs dann besser
|
AW: Labyrinth Spiel-Ist das Möglich?
Gegenvorschlag: poste doch einfach Deinen Code, dann können wir sehen, wieso es nicht läuft.
|
AW: Labyrinth Spiel-Ist das Möglich?
Hey, also ich habe noch nichtmal viele Ideen, wie ich das mit Codes anwenden könnte, deshalb hab ich es einfach mal so dazugeschrieben, wie ich mir es ungefähr vorstell. Vielleicht könnt ihr mir ja ein wenig helfen.
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin {wenn Farbe blau, fängt Pen an zu zeichnen} {Versuch: if Pixel[x,y] := blue then} Image1.Canvas.MoveTo (X, Y); end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin begin {wenn Pen "aktiviert", dann} if ssLeft in Shift then Image1.Canvas.LineTo(X, Y) end; end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {wenn farbe rot, dann pen deaktivieren) {ShowMessage(Gewonnen!)} end; |
AW: Labyrinth Spiel-Ist das Möglich?
Ich halte es eigentlich für keine gute Idee, die Farbe der Zeichenfläche auszuwerten, aber wenn es denn sein muss:
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if Image1.Canvas.Pixels[x,y] = clBlue then begin //PenActive soll eine private Variable sein PenActive := true; Image1.Canvas.MoveTo (X, Y); end; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if PenActive and (ssLeft in Shift) then Image1.Canvas.LineTo(X, Y) end; |
AW: Labyrinth Spiel-Ist das Möglich?
OKay, danke schonmal :)
|
AW: Labyrinth Spiel-Ist das Möglich?
Also ich hab das jetzt so weit...Mein Code für ein 'Game Over' klappt aber noch nicht ganz. Er sieht so aus:
Delphi-Quellcode:
Kann ich die beiden ifs nochmal zusammen fassen mit einem finally oder so?
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin begin if PenActive and (ssLeft in Shift) then {if ssLeft in Shift then} Image1.Canvas.LineTo(X, Y); end; begin; if Image1.Canvas.Pixels[x,y] =clyellow then PenActive := false; end; begin if PenActive and (Image1.Canvas.Pixels[x,y] =clyellow) then ShowMessage('Game Over'); end; end; Und dann sollte ja auch, wenn GameOver kommt, die Spur gelöscht werden. das müsste ja auch noch in diese Abfrage rein...if PenActive and (Image1.Canvas.Pixels[x,y]=clyellow) then Image1.Canvas.Pen.Destroy...oder so ähnlich? |
AW: Labyrinth Spiel-Ist das Möglich?
Da würde ich einmal durchsteppen. Deine Setzung von "begin"s und "end"s ist sehr kreativ, daran wird es vermutlich liegen.
|
AW: Labyrinth Spiel-Ist das Möglich?
Hab jetzt einfach bei MouseMove nur die Message anzeigen, wenn die gelbe Linie berührt wird und bei MouseUp dann PenActive:=false...so klappt das!
Ich schließe aber gleich meine nächste Frage an, die ich noch hab. Ich möchte, nachdem ein "Level" abgeschlossen ist, direkt das nächste laden. Ich zeige ja dann eine MEssage und wenn ich dann auf okay klicke, sollte das nächste geladen werden...Code bis dato:
Delphi-Quellcode:
Ich hab keine Ahnung, wie ich das dort einbinden könnt...
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if PenActive and (Image1.Canvas.Pixels[x,y] = clred) then ShowMessage('Herzlichen Glückwunsch! Sie haben dieses Level geschafft! Weiter gehts mit dem Nächsten!'); {Image1.Picture.Bitmap.LoadFromFile('C:\Dokumente und Einstellungen\Jäger\Desktop\Delphi7\Bilder\Labyrinth2.bmp');} PenActive := false; end; Grüße und danke für die Hilfe von euch... |
AW: Labyrinth Spiel-Ist das Möglich?
Bild laden
gegf. suchen wie ClientToScreen tickt SetCursorPos(x,y) und weiter gehts... |
AW: Labyrinth Spiel-Ist das Möglich?
DAs hab ich jetzt so halbwegs hinbekommen. Auf eine etwas andere Art und Weise.
Jetzt noch eine Frage. Ist es möglich in einem Bereich im Image per prozedur die Farbe zu ändern? Könnte dies für Checkpoints bei dem SPiel gebrauchen. |
AW: Labyrinth Spiel-Ist das Möglich?
Genauso wie Du ein einzelnes Pixel auslesen kannst, kannst Du es auch setzen.
|
AW: Labyrinth Spiel-Ist das Möglich?
Okay das probier ich später mal...Wichtiger ist mir jetzt wie ich prüfen kann ob ein bestimmtes Bild geladen ist. Ich find den Code nicht.
Weil ich ja immer wieder das nächste Level laden muss, muss ich ja irgendwie sagen: Wenn dieses Bild geöffnet ist, dann öffne das nächste...usw. EDIT: DAs mit dem Wechseln der Farbe funktioniert nicht wirklich..Hab das mal so versucht:
Delphi-Quellcode:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if Image1.Canvas.Pixels[x,y] = clgray then set Image1.Canvas.Pixels[x,y] = clgray to Image1.Canvas.Pixels[x,y] = clbue; end; |
AW: Labyrinth Spiel-Ist das Möglich?
Bevor man sich an ein Spiel wagt, sollte man zumindest die elementaren Grundlagen beherrschen :?
Wie wird denn ein Wert zugewiesen? Jedenfalls nicht mit "set wert to irgendwas", dafür gibt es den einfachen Zuweisungs-Operator. |
AW: Labyrinth Spiel-Ist das Möglich?
Im sorry...aber wer nicht wagt, der nicht gewinnt. Und wo kann ich denn die Grundlagen lernen?
if Image1.Canvas.Pixels[x,y] = clgray then Image1.Canvas.Pixels[x,y] := clbue; Ich verstehs nicht... |
AW: Labyrinth Spiel-Ist das Möglich?
|
AW: Labyrinth Spiel-Ist das Möglich?
Okay...Also. Ich hätte jetzt trotzdem noch eine Frage, die ich mir so jetzt nicht schnell erschließen kann, aus den Tutorials. Ich hab jetzt einen Button gemacht, der aktiviert wird, wenn ein Level geschafft ist und über den man die neue Map läd.
Jetzt muss ja der Code für die folgenden Maps irgendwie so lauten: "Wenn xy Bild geöffnet, dann öffne xy2 Bild" Dieses: "Wenn xy Bild geöffnet" beokmm ich nicht hin! Grüße |
AW: Labyrinth Spiel-Ist das Möglich?
Das wirst Du Dir schon selber merken müssen (Pfad zum Bild oder sowas).
|
AW: Labyrinth Spiel-Ist das Möglich?
So...ein letztes mal:
Ich hab es jetzt so:
Delphi-Quellcode:
Levelx eben als Variable deklariert. Jetzt kann ich aber nicht noch Level5 z.B. dazu machen, mit dieser Technik. Ich habe keine andere Ideen mehr...
procedure TForm1.BitBtn3Click(Sender: TObject);
begin if Level4 = true then Image1.Picture.Bitmap.LoadFromFile('C:\Dokumente und Einstellungen\Jäger\Desktop\Delphi7\_RealProject\Level5.bmp'); BitBtn3.Enabled := false; if Level1 = true then Image1.Picture.Bitmap.LoadFromFile('C:\Dokumente und Einstellungen\Jäger\Desktop\Delphi7\_RealProject\Level4.bmp'); BitBtn3.Enabled := false; Level1 := false; Level4 := true; end; |
AW: Labyrinth Spiel-Ist das Möglich?
Statt zig Boolean-Variablen bietet sich eine einzige Integer an.
Delphi-Quellcode:
const Pfad := 'C:\Dokumente und Einstellungen\Jäger\Desktop\Delphi7\_RealProject\';
var Level: Cardinal; Bildname: string; ... Bildname := ''; case Level of 1: Bildname := 'Level1.bmp'; 2: Bildname := 'Level2.bmp'; 3: Bildname := 'Level3.bmp'; end; if Bildname <> '' then Image1.Picture.LoadFromFile(Pfad + Bildname); |
AW: Labyrinth Spiel-Ist das Möglich?
Danke hierfür. Kann den Code gut nachvollziehen, hab alles eingebaut. Aber es passiert einfach garnichts wenn ich dann auf den Button klick. Brauch ich einen bestimmten hierfür?
Woher soll Delphi wissen, was Level = 1 oder Level = 2 bedeutet? |
AW: Labyrinth Spiel-Ist das Möglich?
Das Level musst Du selbst festlegen/erhöhen. Dabei kann es sich um eine globale Variable handeln oder besser um eine private Variable des Formulars.
|
AW: Labyrinth Spiel-Ist das Möglich?
Vielen Vielen DAnk für die ganzen Hilfen. Ich hab das Programm jetzt fertig. Hab noch eine Stoppuhr und einen Neustart Knopf eingebaut...
:) Danke nochmals auch für die GEduld |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 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