| Autor |
Beitrag |
masterofswim
Hält's aus hier
Beiträge: 14
|
Verfasst: So 16.01.11 17:16
Also Problem ist ein Auto aus der Klasse zu lesen!
Die Klasse UAuto :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82:
| unit UAuto;
interface
uses ExtCtrls,UStrasse,Forms; type TAuto = Class(TImage) Protected
kContainer: TForm; kStrasse : TStrasse; public Constructor Create (x,y:integer;Container:TForm); Virtual; Destructor Destroy; Override; Procedure Kennt(Strasse : TStrasse); Virtual; procedure a(Sender: TObject; var Key: Char); end; implementation uses ULevel1;
{$R Test.res}
procedure TAuto.a(Sender: TObject; var Key: Char);
begin if Key = 'a' then begin Picture.Bitmap.LoadFromResourceName(Hinstance,'LINKS'); Left := Auto.Left -4;
end else if Key = 'd' then begin Picture.Bitmap.LoadFromResourceName(Hinstance,'RECHTS'); Left := Left +4; end else if Key = 'w' then begin Picture.Bitmap.LoadFromResourceName(Hinstance,'OBEN'); Top := Top -4; end else if Key = 's' then begin Auto.Picture.Bitmap.LoadFromResourceName(Hinstance,'UNTEN'); Top :=Auto.Top +4; end; end;
constructor TAuto.Create(x,y:integer;Container:TForm); begin inherited create(nil);
end;
destructor TAuto.Destroy; begin
inherited destroy; end;
procedure TAuto.Kennt(Strasse: TStrasse); begin kStrasse:=Strasse; end;
end. |
Sie soll in ULevel1 den Aufruf machen. Nun weiß ich nicht wie ich ne Procedure Key außerhalb der Klasse aufrufen soll, sprich was da für Parameter reingehörn.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| unit ULevel1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,UStrasse, ExtCtrls, StdCtrls, uAuto, UBaelle;
type TFLevel1 = class(TForm) Button1: TButton; Auto1: TImage; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private public end;
var FLevel1: TFLevel1; Strasse: TStrasse; Auto:TAuto; Ball : array [1..20] of TBall; implementation
{$R *.dfm}
procedure TFLevel1.FormCreate(Sender: TObject); begin
Strasse := TStrasse.Create(500,300,200,200,clgray,FLevel1); Strasse.Strassezeichnen(200,200,200,200,clgray);
end;
procedure TFLevel1.Button1Click(Sender: TObject); begin Strasse := TStrasse.Create(1500,550,0,700,clgray,FLevel1); Strasse.Strassezeichnen(100,100,100,100,clgray); Auto := TAuto.Create(200,200,FLevel1); Auto.a(nil,Key); Ball[1] := TBall.create(100,565,30,clred,FLevel1); Ball[1].BallZeichnen(104,520,20,clred); Ball[2] := TBall.create(200,565,30,clred,FLevel1) ; Ball[2].BallZeichnen(104,520,20,clred); Ball[3] := TBall.create(300,565,30,clred,FLevel1); Ball[3].BallZeichnen(104,520,20,clred); Ball[4] := TBall.create(400,565,30,clred,FLevel1); Ball[4].BallZeichnen(104,520,20,clred); Ball[5] := TBall.create(500,565,30,clred,FLevel1); Ball[5].BallZeichnen(104,520,20,clred); Ball[6] := TBall.create(600,565,30,clred,FLevel1); Ball[6].BallZeichnen(104,520,20,clred);
end;
end. |
Das Problem liegt bei Zeile 33 & 34 im ULevel1.
Moderiert von Martok: Code- durch Delphi-Tags ersetzt
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 16.01.11 23:27
Falsch, es ist die Unit UAuto, die Klasse heißt TAuto
masterofswim hat folgendes geschrieben : | Sie soll in ULevel1 den Aufruf machen. Nun weiß ich nicht wie ich ne Procedure Key außerhalb der Klasse aufrufen soll, sprich was da für Parameter reingehörn.
...
Delphi-Quelltext |
Also den Aufruf hast du ja schon. So wie ich das sehe ist die Variable Key nicht deklariert. Ich vermute Key soll die gedrückte Taste sein. Dazu musst du vorher mit GetAsyncKeyState die Tasten abfragen. Such mal danach hier im Forum.
Du musst die Tasten a,d,w und s abfragen.
Alternativ kannst du auch eine Variable im "OnKeyDown" der Form setzen.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Für diesen Beitrag haben gedankt: masterofswim
|
|
masterofswim 
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 17.01.11 11:56
Ja und was ist nun die Varible?
Wie soll ich das deklarieren?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mo 17.01.11 15:34
Key ist erstmal ein Char. Also ein einzelnes Zeichen.
In der Procedure wird Key ausgewertet. Dort wird auf 'a' (=links), 'd' (=rechts), 'w' (=oben) und 's' (=unten) getestet. Also eine normale WASD Steuerung.
Um den Parameter zu übergeben musst du nun einen Char mit übergeben. Dazu kannst du wiederum eine Variable vom Typ Char verwenden:
Delphi-Quelltext
Jetzt musst du der Variablen noch den gedrückten Knopf zuweisen.
Dazu kannst du z.B. "OnKeyPress" verwenden. Diese procedure wird immer aufgerufen, wenn der User eine Taste drückt (nicht bei jeder Taste, aber für WASD reichts). Die kannst du im ObjektInspektor hinzufügen. Dort kriegst du auch die gedrückte Taste gleich als Char übergeben:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin PressedKey := Key; end; |
Dann kannst du schreiben
Delphi-Quelltext 1:
| Auto.a(nil,PressedKey); |
Du solltest dann noch im OnKeyUp die Variable PressedKey wieder auf #0 setzen, sonst bleibt die Taste solange "gedrückt" bis du eine andere drückst (je nachdem was du haben willst kann das auch gut sein)
Dein Code hat da allerdings ein Problem. Immer wenn du den Knopf (Button1) drückst, wird erst ein neues Auto erstellt (das alte ist damit weg) und dann wird einmalig die Taste ausgewertet. Also wird sich das Auto definitiv nicht steuern lassen  Nur so am Rande.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
masterofswim 
Hält's aus hier
Beiträge: 14
|
Verfasst: Mo 17.01.11 16:10
Und was haste da fürn Tip für mich wie ich das lösen könnte?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mo 17.01.11 22:20
Hi,
du erstellst das Auto einmalig (im OnCreate, mit Auto als globale Variable).
Delphi-Quelltext 1: 2: 3: 4:
| procedure TFLevel1.FormCreate(Sender: TObject); begin Auto := TAuto.Create(200,200,FLevel1); end; |
Im OnKeyDown rufst du direkt die Funktion Auto.a auf:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TFLevel1.FormKeyPress(Sender: TObject; var Key: Char); begin Auto.a(nil,Key); end; |
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
|