kleines Picture-game

Für Fragen rund um die Ide und zum Debugger
Antworten
freeprogrammer
Beiträge: 3
Registriert: Sa 22. Dez 2012, 16:31

kleines Picture-game

Beitrag von freeprogrammer »

Hallo,

bin noch völliger Anfänger in Lazarus und hab damit angefangen ein Objekt (Bild) in der Form1 zu erstellen. Weiteres hab ich es geschaft das Objekt mittels Steuerung der Tasten: w,s,a und d über die Form1 zu jagen. Jetzt würde ich gerne eine Timer einbauen, der mein Objekt in eine Richtung bewegt und durch drücken einer der Steuerungstasten die Richtung entsprechend ändert. Leider hab ich in der Richtung noch keine brauchbaren Ergebnisse gefunden, außer vereinzelte Richtungsweiser (YouTube-Tutorials), aus dennen ich dann selbst Versuche gestartet habe. Da kamen dann leider Fehlermeldungen, da in der gewünschten Prozedur zb.: der Timer nicht integriert werden kann.

Ich hab mal diesen Anfang geschrieben:

Code: Alles auswählen

 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Shape1.Left:=Shape1.Left+1;
  if (key = 87) then  //87 steht für Taste w
     begin
       Shape1.Top:=Shape1.Top-1;
       end
     end;
end;
 
dies funktioniert aber nicht.

Bitte um Hilfestellung

MfG
freeprogrammer
Zuletzt geändert von Lori am Do 27. Dez 2012, 15:36, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: kleines Picture-game

Beitrag von theo »

Augen auf beim programmieren.
Zähl mal die Anzahl "begin" und die Anzahl "end".

Der Satz: "dies funktioniert aber nicht" allein ist ist nicht gut. Bitte immer Compiler- oder Debuggermeldungen mit angeben.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: kleines Picture-game

Beitrag von Komoluna »

Willkommen im Forum Freeprogrammer...

ich würde das so machen:

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Fileutil, Forms, Controls, Graphics, Dialogs
  , Buttons, thumbcontrol, Spin, ComCtrls, InFormWindow, StdCtrls, ExtCtrls;
 
type
 
  { Tform1 }
 
  Tform1 = class(TForm)
    Shape1: Tshape;
    Timer1: Ttimer;
    Procedure Formkeydown(Sender: Tobject; Var Key: Word; Shift: Tshiftstate);
    Procedure Timer1timer(Sender: Tobject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: Tform1;
  //Laufrichtung wird mit den konstanten oben links rechts und unten ausgelesen und beschrieben
  laufrichtung:integer;
  //tempo gibt das tempo an mit der sich das Shape über die form bewegen soll
  tempo:integer=1;
 
implementation
const
oben=0;
unten=1;
links=2;
rechts=3;
 
{$R *.lfm}
 
{ Tform1 }
 
Procedure Tform1.Formkeydown(Sender: Tobject; Var Key: Word; Shift: Tshiftstate
  );
Begin
  if key=87 then laufrichtung:=oben;
  if key=...
End;
 
//Timer1.intervall ist 100 oder Wahlweise 10(beispiele...)
Procedure Tform1.Timer1timer(Sender: Tobject);
Begin
  case Laufrichtung of
  Oben:Shape1.top:=shape1.top-tempo;
  Unten:Shape1.top:=shape1.top+tempo;
  Links:shape1.left:=shape1.left-tempo;
  Rechts:shape1.left:=shape1.left+tempo;
  End;
End;
 
end.
 
Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

freeprogrammer
Beiträge: 3
Registriert: Sa 22. Dez 2012, 16:31

Re: kleines Picture-game

Beitrag von freeprogrammer »

theo hat geschrieben:Augen auf beim programmieren.
Zähl mal die Anzahl "begin" und die Anzahl "end".

Der Satz: "dies funktioniert aber nicht" allein ist ist nicht gut. Bitte immer Compiler- oder Debuggermeldungen mit angeben.
Servus Theo,

danke für die schnelle Antwort und verzeih die mangelnde Information. Ich werde es bei meinen weiteren Beiträgen beherzigen.

MfG
freeprogrammer

freeprogrammer
Beiträge: 3
Registriert: Sa 22. Dez 2012, 16:31

Re: kleines Picture-game

Beitrag von freeprogrammer »

Komoluna hat geschrieben:Willkommen im Forum Freeprogrammer...

ich würde das so machen:

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Fileutil, Forms, Controls, Graphics, Dialogs
  , Buttons, thumbcontrol, Spin, ComCtrls, InFormWindow, StdCtrls, ExtCtrls;
 
type
 
  { Tform1 }
 
  Tform1 = class(TForm)
    Shape1: Tshape;
    Timer1: Ttimer;
    Procedure Formkeydown(Sender: Tobject; Var Key: Word; Shift: Tshiftstate);
    Procedure Timer1timer(Sender: Tobject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: Tform1;
  //Laufrichtung wird mit den konstanten oben links rechts und unten ausgelesen und beschrieben
  laufrichtung:integer;
  //tempo gibt das tempo an mit der sich das Shape über die form bewegen soll
  tempo:integer=1;
 
implementation
const
oben=0;
unten=1;
links=2;
rechts=3;
 
{$R *.lfm}
 
{ Tform1 }
 
Procedure Tform1.Formkeydown(Sender: Tobject; Var Key: Word; Shift: Tshiftstate
  );
Begin
  if key=87 then laufrichtung:=oben;
  if key=...
End;
 
//Timer1.intervall ist 100 oder Wahlweise 10(beispiele...)
Procedure Tform1.Timer1timer(Sender: Tobject);
Begin
  case Laufrichtung of
  Oben:Shape1.top:=shape1.top-tempo;
  Unten:Shape1.top:=shape1.top+tempo;
  Links:shape1.left:=shape1.left-tempo;
  Rechts:shape1.left:=shape1.left+tempo;
  End;
End;
 
end.
 
Komoluna
Servus Komoluna,

danke für die nette Begrüßung und den tollen Code. Funktioniert wunderbar.

MfG
freeprogrammer

Soner
Beiträge: 739
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: kleines Picture-game

Beitrag von Soner »

Komolunas Lösung ist gut aber ich würde ein Änderung machen und zwar Laufrichtung mit zwei neuen variablen ersetzen, dann braucht man bei Bewegung if/case-Abfragen nicht.

Code: Alles auswählen

 
//...
var
  //Laufrichtung wird mit den konstanten oben links rechts und unten ausgelesen und beschrieben
  //laufrichtung:integer;
  LaufrichtungX: integer = 1;
  LaufrichtungY: integer = 1;
 
Procedure Tform1.Formkeydown(Sender: Tobject; Var Key: Word; Shift: Tshiftstate);
Begin
  Case Key of
     87: laufrichtungY:=-1; //nach oben
     83: laufrichtungY:=1; //nach unten
     65: LaufrichtungX:=-1; //nach links
     68: LaufrichtungX:=1; //nach rechts
 end;
End;
 
//Timer1.intervall ist 100 oder Wahlweise 10(beispiele...)
Procedure Tform1.Timer1timer(Sender: Tobject);
Begin
    Shape1.top:=shape1.top+(LaufrichtungY*tempo);
    Shape1.left:=shape1.left+(LaufrichtungX*tempo);
End;
 
 

Antworten