Probleme mit mehreren Units.

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
DasKeyboard
Beiträge: 2
Registriert: Fr 9. Jan 2015, 16:43

Probleme mit mehreren Units.

Beitrag von DasKeyboard »

Hallo zusammen,
ich hoffe einfach mal, dass ich hier richtig bin (Dies ist mein erster Beitrag 8) ).
Ich bin gerade dabei mich an einem kleinen 2D-Spiel mit Lazarus zu probieren. Zur besseren Übersicht wollte ich verschiedene Mechaniken (Steuerung, Gegner-KI, ...) in verschiedene Units schreiben.
Allerdings kann ich von einer zweiten Unit nicht auf die Elemente auf der Form1 (Timer, Buttons, ...) zugreifen. Außerdem würde ich die Prozeduren für Ereignisse von der Form1 auch gerne in der zweiten Unit deklarieren.
Also möchte ich zum Beispiel in der Unit2 festlegen, was passieren soll, wenn auf der Form1 eine Taste gedrückt wird (FormKeyDown).

Unit Main:

Code: Alles auswählen

unit Main;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, mmsystem, Classes, LCLType, Steuerung;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    walk_up: TTimer;
    walk_down: TTimer;
    walk_left: TTimer;
    walk_right: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: char);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure walk_downTimer(Sender: TObject);
    procedure walk_leftTimer(Sender: TObject);
    procedure walk_rightTimer(Sender: TObject);
    procedure walk_upTimer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
     procedure CreateLevel();
     procedure CreateChar();
     procedure DisableTimers();
  end;
 
var
  Form1: TForm1;
  Ground: array [1..64,1..36] of TImage;
  Player: TImage;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
  DoubleBuffered:=true;
   CreateLevel();
   CreateChar();
end;
 
 
 
 
//Das soll in die Zweite Unit!
//-----------------------------
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
 
   case Key of
  vk_w:
    walk_up.enabled:=true;
  vk_s:
    walk_down.Enabled:=true;
  vk_d:
    walk_right.Enabled:=true;
  vk_a:
    walk_left.Enabled:=true;
  end;
 
end;                                      

Unit Steuerung:

Code: Alles auswählen

unit Steuerung;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, mmsystem, Classes, LCLType;
 
var
 x:integer;
 
implementation
 
uses
  Main;
 
 
 //Hier soll das hin!
 
end.             



MfG
DasKeyboard


PS: Wie gesagt mein erster Beitrag. Sollte irgendetwas falsch/unklar sein einfach Bescheid sagen.

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit mehreren Units.

Beitrag von Mathias »

So sollte es gehen.
Die walk_??? würde ich in der Steurumg-Unit deklarieren.

Code: Alles auswählen

unit Steuerung;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, mmsystem, Classes, LCLType;
 
var
 x:integer;
 
procedure KeyDown(Key:Word);
 
implementation
 
uses
  Main; 
 
 //Hier soll das hin!
procedure KeyDown(Key:Word);
begin
 
   case Key of
  vk_w:
    Form1.walk_up.enabled:=true;
  vk_s:
    Form1.walk_down.Enabled:=true;
  vk_d:
    Form1.walk_right.Enabled:=true;
  vk_a:
    Form1.walk_left.Enabled:=true;
  end; 
end;    
 
end.        

Code: Alles auswählen

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState );
begin
  KeyDown(Key);
end;    
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

DasKeyboard
Beiträge: 2
Registriert: Fr 9. Jan 2015, 16:43

Re: Probleme mit mehreren Units.

Beitrag von DasKeyboard »

Mathias hat geschrieben: Die walk_??? würde ich in der Steurung-Unit deklarieren.
Die walk_??? sind umbenannte Timer. Sorry falls das nicht klar war. Aber die kann ich doch nicht woanders deklarieren, oder?

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit mehreren Units.

Beitrag von Mathias »

Die walk_??? sind umbenannte Timer.
Die habe ich übersehen, ich dachte es seien normale boolean. Die musst du dort stehen lassen.
Was willst du mit denen machen, willst du damit eine Steuerung alle Pacman realisieren ?
Dafür würde ein Timer reichen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten