Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Anfängerhilfe Labyrinth (https://www.delphipraxis.net/124471-anfaengerhilfe-labyrinth.html)

skaot 19. Nov 2008 14:49


Anfängerhilfe Labyrinth
 
So als aller erstes bin blutiger Anfänger. Ich würde gerne ein kleines Labyrinth programieren, also das man mit den Tasten wasd eine Kugel bewegt, welche sobald eine Wand im weg ist sich nicht weiter bewegt.

So weit bin ich.
Delphi-Quellcode:
unit Pong;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormKeyPress(Sender: TObject; var Key: Char);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  dicke, x, y: integer;

implementation

{$R *.dfm}



procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin
dicke := 20;


if key = 's' then
begin
form1.Refresh;
y := y+5;
canvas.brush.color := clnavy;
canvas.ellipse (x,y,x+dicke,y+dicke);
canvas.MoveTo(50,0);
canvas.lineto(50,350);
canvas.MoveTo(50,400);
canvas.lineto(50,500);
label1.Caption := inttostr(x);
label2.caption := inttostr(y);
end;


if key = 'd' then
begin
form1.Refresh;
x := x+5;
canvas.brush.color := clnavy;
canvas.ellipse (x,y,x+dicke,y+dicke);
canvas.MoveTo(50,0);
canvas.lineto(50,350);
canvas.MoveTo(50,400);
canvas.lineto(50,500);
label1.Caption := inttostr(x);
label2.caption := inttostr(y);
if (x > 30) and (x < 50) then
end;


if key = 'a' then
begin
form1.Refresh;
x := x-5;
canvas.brush.color := clnavy;
canvas.ellipse (x,y,x+dicke,y+dicke);
canvas.MoveTo(50,0);
canvas.lineto(50,350);
canvas.MoveTo(50,400);
canvas.lineto(50,500);
label1.Caption := inttostr(x);
label2.caption := inttostr(y);
end;

if key = 'w' then
begin
form1.Refresh;
y := y-5;
canvas.brush.color := clnavy;
canvas.ellipse (x,y,x+dicke,y+dicke);
canvas.MoveTo(50,0);
canvas.lineto(50,350);
canvas.MoveTo(50,400);
canvas.lineto(50,500);
label1.Caption := inttostr(x);
label2.caption := inttostr(y);
end
end;
end.

Könnte sein das noch ein paar unsinnige Sachen drin sind, wie gesagt totaler Anfänger.

[edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit]

Corpsman 19. Nov 2008 15:07

Re: Anfängerhilfe Labyrinth
 
Ja man sieht das du neu bist, bitte nutze die Code Tags dann sieht das ganze schon viel Hübscher aus. ( Trotzdem Herzlich willkommen in der DP )

und dein Code könnte etwas Struktur gebrauchen.

Delphi-Quellcode:
Procedure TForm1.FormKeyPress(Sender: TObject; Var Key: Char);

Begin
  dicke := 20;

  If key = 's' Then Begin
    form1.Refresh;
    y := y + 5;
  End;

  If key = 'd' Then Begin
    form1.Refresh;
    x := x + 5;
  End;

  If key = 'a' Then Begin
    form1.Refresh;
    x := x - 5;
  End;

  If key = 'w' Then Begin
    form1.Refresh;
    y := y - 5;
  End;
  canvas.brush.color := clnavy;
  canvas.ellipse(x, y, x + dicke, y + dicke);
  canvas.MoveTo(50, 0);
  canvas.lineto(50, 350);
  canvas.MoveTo(50, 400);
  canvas.lineto(50, 500);
  label1.Caption := inttostr(x);
  label2.caption := inttostr(y);

End;
bei diesem Code ist die Semantik die selbe wie bei deinem, nur ist der Code deutlich kürzer.

und zu guter letzt ein Hinweis auf deine Lösung :

Delphi-Quellcode:
Procedure TForm1.FormKeyPress(Sender: TObject; Var Key: Char);

Begin
  dicke := 20;

  If key = 's' Then Begin
    form1.Refresh;
    y := y + 5;
  End;

  If key = 'd' Then Begin
    form1.Refresh;
    x := x + 5;
  End;

  If key = 'a' Then Begin
    form1.Refresh;
    x := x - 5;
  End;

  If key = 'w' Then Begin
    form1.Refresh;
    y := y - 5;
  End;
  If x < 0 Then x := 0;
  If x > width - dicke Then x := width - dicke;
  If y < 0 Then y := 0;
  If y > width - dicke Then y := height - dicke;

  canvas.brush.color := clnavy;
  canvas.ellipse(x, y, x + dicke, y + dicke);
  canvas.MoveTo(50, 0);
  canvas.lineto(50, 350);
  canvas.MoveTo(50, 400);
  canvas.lineto(50, 500);
  label1.Caption := inttostr(x);
  label2.caption := inttostr(y);

End;
Dieser Teil beschränkt das Feld deiner "Kugel" auf die Form und man kann nicht mehr raus laufen, evtl hilft dir das schon ein bischen weiter ;)

skaot 19. Nov 2008 15:21

Re: Anfängerhilfe Labyrinth
 
Danke für die schnelle antwort. Ich werde in Zukunft drauf achten.

Deine Hilfe hilft soweit, dass man nichtmehr links oder oben aus dem Bild herausaufen kann. Rechts ann man noch soweit das man noch die hälfte der Kugel sieht und unten kann man soweit herauslaufen wie man will.

Noedel 19. Nov 2008 15:43

Re: Anfängerhilfe Labyrinth
 
bei corpsman hat sich leider n kleiner fehler eingeschlichen
Delphi-Quellcode:
  If y > width - dicke Then y := height - dicke;
(findest du ziemlich weit unten im zweiten sourcecode.)

das muss ersetzt werden durch
Delphi-Quellcode:
  If y > height - dicke Then y := height - dicke;
damit läuft die kugel nicht mehr nach unten raus :)

dass die kugel n stück nach rechts aus dem feld flutscht, leigt daran, dass "x" wohl imkugel.left ist, oder?!
dann füg doch hier noch ein

Delphi-Quellcode:
 If (x+imkugel.width) > (width - dicke) Then x := width - dicke;

Corpsman 19. Nov 2008 15:51

Re: Anfängerhilfe Labyrinth
 
lol die Copy Paste Fehler.

das "Rauslaufen" liegt an was anderem.


du darfst nicht Widht und Height nehmen sondern must

ClientWidth und ClientHeigt stattdessen nehmen. Dann müste es stimmen.

skaot 19. Nov 2008 16:37

Re: Anfängerhilfe Labyrinth
 
Danke habs jetzt glaube ich :-D .

Hier mein Fertiger Quellcode
Delphi-Quellcode:
unit Pong;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormKeyPress(Sender: TObject; var Key: Char);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  dicke, x, y: integer;

implementation

{$R *.dfm}



procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin
  dicke := 20;


  if key = 's' then begin    // Bewegung nach unten
    form1.Refresh;
    y := y+10;
  end;


  if key = 'd' then begin    // Bewegung nach rechts
    form1.Refresh;
  x := x+10;
  end;


  if key = 'a' then begin   // Bewegung nach links
    form1.Refresh;
    x := x-10;
  end;

  if key = 'w' then begin   // Bewegung nach oben
    form1.Refresh;
    y := y-10;
  end;

  If x < 0 Then x := 0;                                     // Spielfeldbegrenzungen
  If x > clientwidth - dicke Then x := clientwidth - dicke;
  If y < 0 Then y := 0;
  If y > clientheight - dicke Then y := clientheight- dicke;


  if (x = 40) and ((y < 350) or (y > 380)) then x := 30;      // Stoppen des Balles an Barikaden
  if (x = 90) and ((y < 50) or (y > 80)) then x := 80;
  if (x = 140) and ((y < 200) or (y > 230)) then x := 130;
  if (x = 190) and ((y < 400) or (y > 430)) then x := 180;

  if ((x > 380) and (x < 450)) and ((y > 180) and (y < 250)) then Label3.Caption := 'sieger'; // Betreten des Zielfeldes

  canvas.MoveTo(50,0);              // Barrikaden
  canvas.lineto(50,350);
  canvas.MoveTo(50,400);
  canvas.lineto(50,clientheight);
  canvas.moveto(100,0);
  canvas.LineTo(100,50);
  canvas.moveto(100,100);
  canvas.Lineto(100,clientheight);
  canvas.moveto(150,0);
  canvas.LineTo(150,200);
  canvas.moveto(150,250);
  canvas.Lineto(150,clientheight);
  canvas.moveto(200,0);
  canvas.LineTo(200,400);
  canvas.moveto(200,450);
  canvas.Lineto(200,clientheight);
 
  canvas.Brush.Color := clgreen;  // Zielfeld
  canvas.Rectangle(400,200,450,250);

  label1.Caption := inttostr(x);  // Punktkoordinaten
  label2.caption := inttostr(y);

  canvas.brush.color := clnavy;      // Kugel
  canvas.ellipse (x,y,x+dicke,y+dicke)
  end;
end.

skaot 19. Nov 2008 17:22

Re: Anfängerhilfe Labyrinth
 
Hab noch ne kleine Änderung gemacht aus den canvas.moveto und canvas.lineto hab ich canvas.rectangle gemacht.
Kann man irgendetwie das Flackern verhindern?

Corpsman 19. Nov 2008 17:34

Re: Anfängerhilfe Labyrinth
 
Ja kannst du,

in meiner ursprünglichen Verbesserung sollte das Form1.refresh sowieso raus.

Wenn du es aber ganz richtig machen willst machst du es Double Buffered.

Dazu gehst du her und nimmst ein TBitmap das du immer genau gleich groß hälst wie deine Form.

und am Anfang vom OnKey machst du dann was in der Art :

Delphi-Quellcode:
var b:Tbitmap;

Procedure Tform1.OnKeyIrgendwas(..);
begin
b.canvas.rectangle(-1,-1,clientwidth+1,clientheight+1);
with b.canvas do begin

(*
Der Ganze Alte Code
*)


// Am Schluss
form1.canvas.draw(0,0,b);
end;
Dann flackert nichts mehr.

Sir Rufo 19. Nov 2008 17:36

Re: Anfängerhilfe Labyrinth
 
Noch etws kürzer und übersichtlicher ...
Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
const
  Step = 10;
begin
  dicke := 20;

  // Auf dem Form hat sich bis hier nix geändert, also

  form1.Refresh; // <--- ist das wirklich notwendig?

  // es geht noch kürzer

  if key = 's' then Inc( y, Step );   // Bewegung nach unten
  if key = 'd' then Inc( x, Step );   // Bewegung nach rechts
  if key = 'a' then Inc( x, -Step );   // Bewegung nach links
  if key = 'w' then Inc( y, -Step );   // Bewegung nach oben

  // der rest bleibt wie gehabt
cu

Oliver

@Corpsman: genau

skaot 19. Nov 2008 17:56

Re: Anfängerhilfe Labyrinth
 
Zitat:

Zitat von Corpsman


Delphi-Quellcode:
var b:Tbitmap;

Procedure Tform1.OnKeyIrgendwas(..);
begin
b.canvas.rectangle(-1,-1,clientwidth+1,clientheight+1);
with b.canvas do begin

(*
Der Ganze Alte Code
*)


// Am Schluss
form1.canvas.draw(0,0,b);
end;
Dann flackert nichts mehr.

Mhh das sagt der mir was vonwegen Zugriffsverletzung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr.
Seite 1 von 2  1 2      

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