Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Projekt - Canvas - Bewegung von Ellipsen 2 (https://www.delphipraxis.net/16495-projekt-canvas-bewegung-von-ellipsen-2-a.html)

Croon1337 17. Feb 2004 20:27


Projekt - Canvas - Bewegung von Ellipsen 2
 
Sry, ich muss schon wieder stören. Bin eben noch vollkommener Anfänger in Sachen Programmieren. Mein Projekt stellt jetzt 5 verschiedene Bälle im Canvas des Hauptfensters her. Dabei soll der Start-Button in meinem MainMenü bei erneutem Drücken die letzten Bälle mit der Main.Color (Farbe des Formulars) übermalen und 5 neue Bälle erstellen. Die Bälle werden erstellt, aber die vorrigen Bälle werden leider nur teilweise oder gar nicht übermalt. Wahrscheinlich ist da nur ein Rechenfehler drin, aber ich komme einfach nicht auf den Fehler.

Die Prozedur des Startbuttons fängt so an:
Delphi-Quellcode:
procedure TMain.Start1Click(Sender: TObject);


Delphi-Quellcode:
unit mBall1;

interface

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

type
  TMain = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    Start1: TMenuItem;
    Pause1: TMenuItem;
    Continue1: TMenuItem;
    Exit1: TMenuItem;
    N2: TMenuItem;
    Help1: TMenuItem;
    Timer1: TTimer;
    Options: TMenuItem;
    procedure Start1Click(Sender: TObject);
    procedure Pause1Click(Sender: TObject);
    procedure Continue1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure OptionsClick(Sender: TObject);
  private

  public

end;

(*---------------------------Klassendefinition-Ball--------------------------*)

type
  TBall = class
    r,x,y,vx,vy : integer;
    cRand, cInnen : TColor;
    constructor BallInit (Ir,Ix,Iy,Ivx,Ivy:integer;IcInnen,IcRand:TColor);
    constructor BallErstellen;
    procedure BallZeichnen;
    procedure BallLoeschen;
    procedure BallBewegen;
end;

(*-----------------------------------ENDE------------------------------------*)

var
  Main: TMain;
  Ball: array of TBall;

implementation

{$R *.dfm}

(*-------------------------------TBall-Abläufe-------------------------------*)

constructor TBall.BallInit (Ir,Ix,Iy,Ivx,Ivy:integer;IcInnen,IcRand:TColor);
begin
  r := Ir;
  x := Ix;
  y := Iy;
  vx := Ivx;
  vy := Ivy;
  cInnen := IcInnen;
  cRand := IcRand
end;

constructor TBall.BallErstellen;
var i : integer;
begin
i := StrToInt(Options1.Edit1.Text);
SetLength (Ball,i);
for i := 0 to (Length(Ball)-1) do
Ball[i].BallInit(Random(20),Random(Main.ClientHeight-r),Random(Main.ClientWidth-r),Random(Main.ClientHeight+r),Random(Main.ClientWidth+r),clBlack,clBlack);
end;

procedure TBall.BallZeichnen;
var i : integer;
begin
  for i := 0 to (Length(Ball)-1) do
  begin
    Main.Canvas.Brush.Color := Ball[i].cInnen;
    Main.Canvas.Pen.Mode := pmCopy;
    Main.Canvas.Pen.Color := Ball[i].cRand;
    Main.Canvas.Ellipse (Ball[i].x-Ball[i].r,Ball[i].y-Ball[i].r,Ball[i].x+Ball[i].r,Ball[i].y+Ball[i].r);
  end;
end;

procedure TBall.BallLoeschen;
var i : integer;
begin
  Main.Canvas.Brush.Color := Main.Color;
//  Main.Canvas.Pen.Mode := pmCopy;
  Main.Canvas.Pen.Color := Main.Color;
for i := 0 to (Length(Ball)-1) do
  Main.Canvas.Ellipse (Ball[i].x-Ball[i].r,Ball[i].y-Ball[i].r,Ball[i].x+Ball[i].r,Ball[i].y+Ball[i].r);
end;

procedure TBall.BallBewegen;
var i : integer;
begin
  for i := 0 to (Length(Ball)-1) do begin
    Ball[i].x := Ball[i].x + Ball[i].vx;
    Ball[i].y := Ball[i].y + Ball[i].vy;
  end;
end;

(*-------------------------------TMain-Abläufe-------------------------------*)

procedure TMain.FormCreate(Sender: TObject);
var i : integer;
begin
SetLength(Ball,5);
for i := 0 to (Length(Ball)-1) do
Ball[i] := TBall.BallInit (10,Random(Main.ClientWidth)-10,Random(Main.ClientHeight)-10,1,1,clWhite,clBlack);
end;

procedure TMain.Start1Click(Sender: TObject);
var i : integer;
begin
  Main.Canvas.Pen.Color := Main.Color;
  Main.Canvas.Brush.Color := Main.Color;
  for i := 0 to (Length(Ball)-1) do
  begin
    Main.Canvas.Ellipse ((Ball[i].x-Ball[i].r),(Ball[i].y-Ball[i].r),(Ball[i].x+Ball[i].r),(Ball[i].x+Ball[i].r));
    Ball[i] := TBall.BallInit (10,Random(Main.ClientWidth)-10,Random(Main.ClientHeight)-10,1,1,clWhite,clBlack);
  end;
  Timer1.Enabled := True;
end;

procedure TMain.Pause1Click(Sender: TObject);
begin
  Timer1.Enabled := False;
end;

procedure TMain.Continue1Click(Sender: TObject);
begin
  Timer1.Enabled := True
end;

procedure TMain.Timer1Timer(Sender: TObject);
var i : integer;
begin
  for i := 0 to (Length(Ball)-1) do
  begin
    if (Ball[i].x >= (Main.ClientWidth-Ball[i].r)) or (Ball[i].y >= (Main.ClientHeight-Ball[i].r)) then
    begin
      Ball[i].vx := 0;
      Ball[i].vy := 0;
    end else
    begin
      Ball[i].BallLoeschen;
      Ball[i].BallBewegen;
      Ball[i].BallZeichnen;
    end;
  end;
end;

procedure TMain.Exit1Click(Sender: TObject);
begin
  Application.Terminate;
end;

(*-----------------------------------ENDE------------------------------------*)

procedure TMain.OptionsClick(Sender: TObject);
begin
  Options1 := TOptions1.Create(Self);
  Options1.Show;
  Timer1.Enabled := False;
end;

end.

Croon1337 17. Feb 2004 21:32

Re: Projekt - Canvas - Bewegung von Ellipsen 2
 
Sry, aber habe den Fehler selber gefunden. Aber trotzdem danke.

Stanlay Hanks 17. Feb 2004 21:35

Re: Projekt - Canvas - Bewegung von Ellipsen 2
 
Hi. Wäre nett, wenn du den Fehler kurz beschreiben und deine Lösung posten könntest. So haben Andere, die später vielleicht einmal das selbe Problem haben, auch etwas davon :wink:

Man liest sich, Stanlay :hi:

Croon1337 18. Feb 2004 13:15

Re: Projekt - Canvas - Bewegung von Ellipsen 2
 
Delphi-Quellcode:
   
Main.Canvas.Ellipse ((Ball[i].x-Ball[i].r),(Ball[i].y-Ball[i].r),(Ball[i].x+Ball[i].r),(Ball[i].x+Ball[i].r));
Ich habe dir Koordinate der zweiten Y-Koordinate im Befehl Ellipse mit einem X-wert vertauscht, daher kam mein eingentlicher Fehler.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 Uhr.

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