AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pacman

Ein Thema von Blubbel · begonnen am 8. Feb 2012 · letzter Beitrag vom 14. Feb 2012
Antwort Antwort
Seite 1 von 2  1 2      
Blubbel

Registriert seit: 6. Okt 2011
125 Beiträge
 
Delphi 2010 Professional
 
#1

Pacman

  Alt 8. Feb 2012, 12:18
Delphi-Version: 5
Halli Hallo,

Ich will ein PacMan verschnitt programmieren. Ich habe jetzt die Form schon in einzelne Kacheln aufgeteilt. Jetzt möchte ich, dass die "Geister" (bei mir nur kreise") eine bestimmte Anzahl sind und direkt am Anfang mit gezeichnet werden. Irgendwie hab ich da einen Hänger.

ich hab mir gedacht, vielleicht geht es mit einem Array in dem ich sie Speicher und zeichnen lasse aber irgendwie funktioniert das alles nicht.

Habt ihr einen kleinen Denkanstoß für mich oder tipps?

Danke euch schon mal

LG
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Pacman

  Alt 8. Feb 2012, 12:30

ich hab mir gedacht, vielleicht geht es mit einem Array in dem ich sie Speicher und zeichnen lasse aber irgendwie funktioniert das alles nicht.

Habt ihr einen kleinen Denkanstoß für mich oder tipps?

Danke euch schon mal

LG
Hi Blubbel,
Was funktionniert nicht? Gibt es eine Fehlermeldung?
Du kannst schon mal bisschen Code zeigen.
Coffeecoder
  Mit Zitat antworten Zitat
Blubbel

Registriert seit: 6. Okt 2011
125 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Pacman

  Alt 8. Feb 2012, 12:40
einen Cade gibt es nur "indirekt" habe ein altes projekt ausgekramt und als vorlage benutzt und hat nicht viel geholfen. Bin ein zimlicher neuling. Vor allem sollen sie ja auch zufällig gezeichnet werden.

Also hier ist der Code den ich als vorlage genommen und schon verändert hab.
Delphi-Quellcode:
  for i := 0 to high(Self.FMonsterArray) do
  begin
    if assigned(Self.FMonsterArray[i]) then
    begin

      lRect.TopLeft.X := Self.FMonsterArray[i].Position.X;
      lRect.TopLeft.Y := Self.FMonsterArray[i].Position.Y;

      lRect.BottomRight.X := (lRect.TopLeft.X + 16);
      lRect.BottomRight.Y := (lRect.TopLeft.Y + 16);

      if Self.FCount <= High(Self.FMonsterArray) then
      begin
        Self.FMonsterArray[Self.FCount] := TphMonster.Create;
        Self.FMonsterArray[Self.FCount].Position := Point(random(GetWidth(ACanvas.ClipRect)), random(GetHeight(ACanvas.ClipRect)));
         Self.FCount := (Self.FCount +1);
      end;
      ACanvas.Ellipse(lRect.TopLeft.X, lRect.TopLeft.Y, lRect.BottomRight.X, lRect.BottomRight.Y);
    end;
  end;

Geändert von Blubbel ( 8. Feb 2012 um 12:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Pacman

  Alt 8. Feb 2012, 13:10
Ich würde in der Klasse TphMonster eine Methode einbringen, die sich um das Zeichnen kümmert:
Delphi-Quellcode:
...
procedure TphMonster.draw(pCanvas : TCanvas);
const
   BREITE = 16;
begin
   pCanvas.brush.color := clWhite; //eventuell Farbe festlegen
   pCanvas.Ellipse(PositionX, PositionY, PositionX + BREITE , PositionY + BREITE);
end;
...
und dann in einer Schleife folgendes tun:
Delphi-Quellcode:
...
    FMonsterArray[i].draw(ACanvas);
...
Wenn du willst kannst du ja mal die Quellen deiner Vorlage geben und deinen gesamten Quellcode anhängen.
Coffeecoder
  Mit Zitat antworten Zitat
Blubbel

Registriert seit: 6. Okt 2011
125 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Pacman

  Alt 8. Feb 2012, 14:47
Das klappt schon mal ganz gut... Mit dem zufälligen zeichnen klappts jedoch noch nicht ganz.

versucht hab ich es so:
Delphi-Quellcode:
  ACanvas.Ellipse(Random(ACanvas.ClipRect.TopLeft.X), random(ACanvas.ClipRect.TopLeft.Y), ACanvas.ClipRect.TopLeft.X + lWidth ,
    ACanvas.ClipRect.TopLeft.Y + lWidth);
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Pacman

  Alt 8. Feb 2012, 15:02
Das klappt schon mal ganz gut... Mit dem zufälligen zeichnen klappts jedoch noch nicht ganz.

versucht hab ich es so:
Delphi-Quellcode:
  ACanvas.Ellipse(Random(ACanvas.ClipRect.TopLeft.X), random(ACanvas.ClipRect.TopLeft.Y), ACanvas.ClipRect.TopLeft.X + lWidth ,
    ACanvas.ClipRect.TopLeft.Y + lWidth);
Ich würde beim Create die Zufallsposition setzen:
Delphi-Quellcode:
constructor TphMonster.Create();
begin
    self.PositionX := random(); // Angeben der Größe
    self.PositionY := random();
end;
Coffeecoder
  Mit Zitat antworten Zitat
Blubbel

Registriert seit: 6. Okt 2011
125 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Pacman

  Alt 8. Feb 2012, 15:32
hmmm.... Ich glaub ich bin da gerade ein bisschen zu doof für.
Also es sieht jetzt folgender maßen aus:
Delphi-Quellcode:
procedure TphGameField.DrawMonsters(ACanvas: TCanvas);
var
  lRect: TRect;
  i: Integer;
const
  lWidth = 16;
begin //TODO: zufällig zeichnen lassen (ca. 10)
  for i := 0 to high(Self.FMonsterArray) do
  begin
    Self.FMonsterArray[Self.FCount] := TphMonster.Create;
    FMonsterArray[i].Draw(ACanvas);
  end;
end;

............................................
constructor TphMonster.Create;
begin
// inherited Create;
  randomize;
  Self.FPosition.X := random(128); // Angeben der Größe
  Self.FPosition.Y := random(128);
end;

destructor TphMonster.Destroy;
begin
  inherited Destroy;
end;

procedure TphMonster.Draw(ACanvas: TCanvas);
var
  x,y: integer;
const
  lWidth = 16;
begin
// randomize;
// x := random(ACanvas.ClipRect.TopLeft.X);
// y := random(ACanvas.ClipRect.TopLeft.Y);

  ACanvas.brush.color := clRed;
// ACanvas.Ellipse(x, y, (x + lWidth), (y + lWidth));
end;
Der zeichnet zwar die Kreise aber immer nur an einem Fleck statt mehrere Verstreut auf der Form

Hab da was bei zeichnen grad entdeckt aber trotzdem gehts nicht
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Pacman

  Alt 8. Feb 2012, 15:44
Kannst du mal bitte die Klassendefinition der Klasse TphMonster mal reinhängen?
Coffeecoder
  Mit Zitat antworten Zitat
Blubbel

Registriert seit: 6. Okt 2011
125 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Pacman

  Alt 8. Feb 2012, 15:47
Delphi-Quellcode:
 //Spieler und Monster
  TphItem = class(TObject)
  private
    FName: String;
    FSize: Integer;
    FPosition: TPoint;
    procedure GetName(const Value: String);
    procedure GetSize(const Value: Integer);
    procedure GetPosition(const Value: TPoint);
  public
    constructor Create();
    destructor Destroy();
    property Name: String read FName write GetName;
    property Size: Integer read FSize write GetSize;
    property Position: TPoint read FPosition write GetPosition;
  end;

  //Spielfigur
  TphPlayer = class(TphItem)
  private
  
  public
    constructor Create();
    destructor Destroy();
  end;

  //Gegner (Monster)
  TphMonster = class(TphItem)
  private

  public
    procedure Draw(ACanvas: TCanvas);
    constructor Create();
    destructor Destroy();
  end;


.........................


TphGameField = class(TObject)
  private
    FArray: Array of Array of Byte;
    FPlayer: TphPlayer;
    FMonsters: TObjectList;
    FViewPort: TphViewPort;
    FSize: Integer;
    FPosition: TPoint;
    FCount: Integer;
    FMonsterArray: Array [0..20] of TphMonster;
    procedure SetPosition(const Value: TPoint);
  protected
    function InitArray(AWidth, AHeight: Integer): Boolean;
  public
    constructor Create(AWidth, AHeight, ASize: Integer);
    destructor Destroy(); override;
    function MovePlayer(ADirection: Byte): TPoint; //????????????????????????
    procedure DrawGameField(ACanvas: TCanvas; AClipRect: TRect);
    procedure DrawPlayer(ACanvas: TCanvas);
    procedure DrawMonsters(ACanvas: TCanvas);
    property Player: TphPlayer read FPlayer {write SetPlayer};
    property ViewPort: TphViewPort read FViewPort {write SetViewPort};
    Property Position: TPoint read FPosition write SetPosition;
  end;
  Mit Zitat antworten Zitat
Benutzerbild von Coffeecoder
Coffeecoder

Registriert seit: 27. Apr 2011
242 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Pacman

  Alt 8. Feb 2012, 16:10
Delphi-Quellcode:
 //Spieler und Monster
  TphItem = class(TObject)
  private
    FName: String;
    FSize: Integer;
    FPosition: TPoint;
    procedure GetName(const Value: String);
    procedure GetSize(const Value: Integer);
    procedure GetPosition(const Value: TPoint);
  public
    constructor Create();
    destructor Destroy();
    property Name: String read FName write GetName;
    property Size: Integer read FSize write GetSize;
    property Position: TPoint read FPosition write GetPosition;
  end;

  //Spielfigur
  TphPlayer = class(TphItem)
  private
  
  public
    constructor Create();
    destructor Destroy();
  end;

  //Gegner (Monster)
  TphMonster = class(TphItem)
  private

  public
    procedure Draw(ACanvas: TCanvas);
    constructor Create();
    destructor Destroy();
  end;
Der Konstruktor deiner Oberklasse also TphItem würde ich so anpassen, falls es noch nicht ist:
Delphi-Quellcode:
constructor TphItem.Create(posx, posy) ;
begin
   ... // andere Felder initialisieren, ggf. in der Paramterliste erweitern
   FPosition.Position.X := posx;
   FPosition.Position.Y := posy; // eventuell anpassen wegen TPoint, properties nicht im Kopf ;)
end;
Und dann im Create des Monsters dies machen:

Delphi-Quellcode:
constructor TphMonster.Create;
begin
   randomize; // ---> auslagern , nur einmal nötig
  inherited Create(random(128), random(128));
end;
Zuhause also heute abend kann ich das besser überprüfen
Coffeecoder
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 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