Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Labyrinth Spiel-Ist das Möglich? (https://www.delphipraxis.net/157282-labyrinth-spiel-ist-das-moeglich.html)

Patrick6 6. Jan 2011 13:44

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.

mkinzler 6. Jan 2011 13:53

AW: Labyrinth Spiel-Ist das Möglich?
 
Warum sollte das nicht möglich sein?

pustekuchen 6. Jan 2011 13:56

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.

Patrick6 6. Jan 2011 15:04

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.

Deep-Sea 6. Jan 2011 15:15

AW: Labyrinth Spiel-Ist das Möglich?
 
Ich glaube die OnMouseLeave-Ereignisse gibt es erst seit neueren Delphi-Versionen ...

Bummi 6. Jan 2011 15:58

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.

Patrick6 6. Jan 2011 16:22

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...

Bummi 6. Jan 2011 17:25

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.

Patrick6 6. Jan 2011 17:31

AW: Labyrinth Spiel-Ist das Möglich?
 
Okay klingt gut...Wie kann ich so Felder bestimmen? Wenn hier gedrückt, dann...?

Bummi 6. Jan 2011 17:35

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:
HitStart := (x >= sx1) and (x <= sx2) and (y >= sy1) and (y <= sy2)
oder Du hast das Startfeld eindeutig Farblich markiert, dann könntest Du prüfen ob Pixels[x,y]=StartFarbe.

Patrick6 6. Jan 2011 18:14

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

DeddyH 6. Jan 2011 18:17

AW: Labyrinth Spiel-Ist das Möglich?
 
Gegenvorschlag: poste doch einfach Deinen Code, dann können wir sehen, wieso es nicht läuft.

Patrick6 7. Jan 2011 15:07

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;

DeddyH 7. Jan 2011 15:24

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;

Patrick6 7. Jan 2011 15:33

AW: Labyrinth Spiel-Ist das Möglich?
 
OKay, danke schonmal :)

Patrick6 7. Jan 2011 16:15

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:
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;
Kann ich die beiden ifs nochmal zusammen fassen mit einem finally oder so?
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?

DeddyH 7. Jan 2011 17:12

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.

Patrick6 7. Jan 2011 23:29

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:
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;
Ich hab keine Ahnung, wie ich das dort einbinden könnt...


Grüße und danke für die Hilfe von euch...

Bummi 7. Jan 2011 23:58

AW: Labyrinth Spiel-Ist das Möglich?
 
Bild laden
gegf. suchen wie ClientToScreen tickt
SetCursorPos(x,y)
und weiter gehts...

Patrick6 8. Jan 2011 13:02

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.

DeddyH 8. Jan 2011 15:24

AW: Labyrinth Spiel-Ist das Möglich?
 
Genauso wie Du ein einzelnes Pixel auslesen kannst, kannst Du es auch setzen.

Patrick6 8. Jan 2011 16:20

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;

DeddyH 8. Jan 2011 17:38

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.

Patrick6 9. Jan 2011 13:16

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...

DeddyH 9. Jan 2011 13:21

AW: Labyrinth Spiel-Ist das Möglich?
 
http://www.christian-stelzmann.de/in...crashkurs.html
http://www.delphipraxis.net/156897-d...zreferenz.html

Patrick6 9. Jan 2011 14:08

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

DeddyH 9. Jan 2011 14:16

AW: Labyrinth Spiel-Ist das Möglich?
 
Das wirst Du Dir schon selber merken müssen (Pfad zum Bild oder sowas).

Patrick6 9. Jan 2011 16:07

AW: Labyrinth Spiel-Ist das Möglich?
 
So...ein letztes mal:

Ich hab es jetzt so:

Delphi-Quellcode:
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;
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...

DeddyH 9. Jan 2011 16:19

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);

Patrick6 9. Jan 2011 18:11

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?

DeddyH 10. Jan 2011 07:13

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.

Patrick6 11. Jan 2011 17:11

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 00:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz