Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Transparenten Kreis zum übermalen der Bewegung zeichnen !? (https://www.delphipraxis.net/171850-transparenten-kreis-zum-uebermalen-der-bewegung-zeichnen.html)

Semih 28. Nov 2012 12:33

Delphi-Version: 7

Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Leute,

undzwar bin ich gerade am programmieren eines "Teletennis" Games für die Schule.
Habe nun aber folgendes Problem ( Bitte verzeiht falls ich falsche Fachausdrücke benutze)

Ich habe einen Kreis auf der Oberfläche zeichnen lassen und eine extra Bewegungsprozedur zum Bewegen halt !
Natürlich überzeichnen die alten Kreise sich nicht von selbst .. habe dafür also noch eine weitere Prozedur zum überzeichen der Kreise erstellt !
Wenn ich die Kreise aber nun überzeichne mit " pen.color:=Form1.color;" zieh der mir eine weiße Linie über mein Hintergrundbild , da meine Tform.color ja weiß ist !
Nun würde ich gerne wissen ob man die Kreise auf irgendeine Weise so überzeichnen kann das auf dem Hintergrundbild kein zeichen mehr von ihnen ist und man immer nur den aktuellen
Kreis sieht ?! ( Sorry für meine Rechtschreibung.. bin in Eile)


Hier die Prezedur für das übermalen

Delphi-Quellcode:
procedure tkreis.zeichnen(Canv:Tcanvas;colr:longint);
begin
  with canv do
  begin
    brush.color:=colr;
    pen.Color:=Form1.color;
    ellipse(x-radius,y-radius,x+radius,y+radius);
  end;
end;
und hier das Bild was mein Problem nochmal aufzeigt !

Anhang 38154

DeddyH 28. Nov 2012 12:39

AW: Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
Hallo und Willkommen in der DP :dp:,

es gibt mehrere Möglichkeiten, z.B. könntest Du Deinen Kreis auf eine Bitmap im Speicher zeichnen und diese dann in einem Rutsch auf Deinen Canvas. Oder Du leitest TKreis von TGraphicControl ab und versetzt dann nur dessen Position. Oder Du nimmst einfach ein TShape, da genügt auch das Positionieren.

Semih 28. Nov 2012 12:57

AW: Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
So erstmal danke für die schnelle Antwort und danke für das Wilkommen :)

Also so etwas in der Art dachte ich mir leider schon.. jedoch weiß ich nicht genau wie ich das bewerktstelligen soll,
da ich in Sachen Delphi noch reichlich unerfahren bin ! Eine etwas genauere Anleitung wäre von daher super :stupid:

Danke nochmal :)

DeddyH 28. Nov 2012 13:04

AW: Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
Welche der genannten Möglichkeiten soll ich denn erklären? Ich nehme mal die einfachste Variante: pack Dir ein TShape aus der Komponentenpalette auf Dein Formular, stelle Shape auf stCircle und Brush.Color auf die gewünschte Farbe. Nun musst Du nur noch Left und Top für die Bewegung neu setzen, z.B. in einem Timer. Einfaches Beispiel ohne Kollisionskontrolle:
Delphi-Quellcode:
procedure TDeinForm.DeinTimerTimer(Sender: TObject);
begin
  DeinShape.Left := DeinShapeLeft + x;
  DeinShape.Top := DeinShape.Top + y;
end;

Popov 28. Nov 2012 13:13

AW: Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
@Semih

Gehe ich richtig in der Annahme, dass du auf einer TImage zeichnest? Wenn ja, dann ist der erste Schritt einfach eine Bitmap von der Größe der zu erstellen, wie auch die der von TImage. Dann zeichnest du zuerst den Hintergrund auf der Bitmap, dann deinen Kreis und zuletzt einfach alles auf die Bitmap der TImage.

Die temporäre Bitmap ist nur dazu da um auf ihr alles immer und immer wieder neu zu zeichnen. Erst das komplette Ergebnis landet auf der TImage.

Semih 28. Nov 2012 13:17

AW: Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
Ehm nicht direkt ich zeichne das auf dem Canvas also TCanvas ! Vielleicht hab ich das auch nur falsch verstanden !

Ich link einfach mal mein Quelltext

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, StdCtrls, mmsystem;

type
  TForm1 = class(TForm)
    Ibackground: TImage;
    Lheader: TLabel;
    Lneu: TLabel;
    Lhigh: TLabel;
    Lquit: TLabel;
    Ipfeil: TImage;
    Timer1: TTimer;
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Timer1Timer(sender:Tobject);
    end;
    Tkreis= class
      x:integer;
      y:integer;
      radius:integer;
      farbe:longint;
      dx:integer;
      dy:integer;
      constructor erzeugen(xpos, ypos ,r : integer; colr:longint; dvx, dvy:integer);
    procedure zeichnen(Canv:Tcanvas; colr: longint);




  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Vmenue:integer;   // 0 = Menü 1 , 1 = Menü 2
  Vgame:integer;    // 0 = nicht im Spiel , 1 = Im Spiel
  Kreis1:Tkreis;

implementation
constructor Tkreis.erzeugen (xpos, ypos ,r : integer; colr:longint; dvx, dvy:integer);
begin
x := xpos;
y := ypos;
radius := r;
farbe := colr;
dx:= dvx;
dy:=dvy;
end;

{$R *.dfm}
procedure tkreis.zeichnen(Canv:Tcanvas;colr:longint);
begin
  with canv do
  begin
    brush.color:=colr;
    pen.Color:=Form1.color;
    ellipse(x-radius,y-radius,x+radius,y+radius);
  end;
end;
///////////////////////////// KEYS /////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
//////////////////////////// DOWN KEY //////////////////////////////////////////
  if Vgame = 0 then
  If Key = VK_Down then
    begin
    sndPlaySound('Click01.wav',SND_SYNC);
    if IPfeil.top = 216 then
    Ipfeil.top:= Ipfeil.top + 80
    else
    if Ipfeil.top= 296 then
    Ipfeil.top:= Ipfeil.top + 80
    else Ipfeil.top:= 216;
    end;

//////////////////////////// UP KEY ////////////////////////////////////////////
  if Vgame = 0 then
  if Key = VK_Up then
    begin
    sndPlaySound('Click01.wav',SND_SYNC);
    if IPfeil.top = 216 then
    Ipfeil.top:= 376
    else
    if Ipfeil.top= 296 then
    Ipfeil.top:= 216
    else Ipfeil.top:= 296;
    end;

//////////////////////////// EINGABETASTE //////////////////////////////////////
  if Vgame=0 then
  if Key = VK_RETURN then
begin
  sndPlaySound('Click01.wav',SND_SYNC);
//////////////////////////// MENÜ 0
  if Vmenue=0 then
  if Ipfeil.top = 216 then
  begin
  Lneu.caption:='Einzelspieler';
  Lhigh.caption:='Mehrspieler';
  Lquit.caption:='zurück';
  Vmenue:=1;
  end
      else
      if Ipfeil.top = 296 then Showmessage('Tut mir leid es gibt noch keine Highscores!')
        else close
//////////////////////////// MENÜ 1
  else
  if Vmenue=1 then
  if Ipfeil.top = 216 then
  begin
  Lneu.Visible:=false;
  Lhigh.visible:=false;
  Lquit.Visible:=false;
  Ipfeil.visible:=false;
  Lheader.Visible:=false;
  Vgame:=1;
  Kreis1:=Tkreis.erzeugen(Form1.ClientWidth div 2, Form1.ClientHeight div 2,15,$000000,2,2);
  Kreis1.zeichnen(form1.canvas,kreis1.farbe);
  Timer1.Enabled:=true;
  end
    else
    if Ipfeil.top = 296 then Showmessage ('Tut mir leid es gibt noch keinen Mehrspieler Modus!')
      else
      begin
      Lneu.caption:='Neues Spiel';
      Lhigh.caption:='Highscore';
      Lquit.caption:='Beenden';
      Vmenue:=0;
      end;
   end;
end;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure anzeigen (kreis:Tkreis);
begin

Kreis.zeichnen(form1.canvas,form1.color);

  if kreis.x>=Form1.clientWidth-kreis.radius then Kreis.dx:=Kreis.dx*(-1);
  if Kreis.x<=0+kreis.radius then Kreis.dx:=kreis.dx*(-1);
  if kreis.y>=Form1.clientheight-kreis.radius then Kreis.dy:=Kreis.dy*(-1);
  if Kreis.y<=0+kreis.radius then Kreis.dy:=kreis.dy*(-1);

  kreis.x:=kreis.x+kreis.dx;
  kreis.y:=kreis.y+kreis.dy;
  Kreis.zeichnen(form1.canvas,kreis.farbe);
end;

Procedure tform1.timer1timer(sender:tobject);
begin
anzeigen(kreis1);
end;



end.
Andere Frage kann man nicht irgendwie die Color Informationen des Timage abfragen und sagen Tkreis soll sie übernehmen ?

DeddyH 28. Nov 2012 13:21

AW: Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
Erstens heißt der Konstruktor jeder Klasse Create und zweitens baust Du Dir da ein schönes Speicherleck, indem Du immer wieder neue Kreise erzeugst, sie aber nirgends freigibst (oder ich habe es übersehen). Was spricht denn gegen die simple Shape-Lösung? Zumindest wären die Speicherprobleme damit vom Tisch.

Semih 28. Nov 2012 13:29

AW: Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
Ich denke da spricht nichts gegen ... wiegesagt bin ich jedoch nicht wirklich geläufig damit und bräuchte eine art hilfe anleitung, whatever :/

Wie meinst du das.. jeder Konstruktor einer Klasse heißt create ? Weil ich den Konstruktor oben erzeugen gennant habe ?( Das sollte nur vorrübergehen sein, wollte schauen ob alles klappt )

DeddyH 28. Nov 2012 13:32

AW: Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
Eben deswegen, ja. Jede Klasse erbt von der "Mutter aller Klassen" TObject, welche bereits einen Konstruktor namens Create und einen Destruktor namens Destroy mitbringt. Aus diesem Grund sollte man sich an diese Namensgebung auch halten, spätestens dann, wenn man sie überschreiben möchte.

[edit] Falls Dich das Thema mit der Speicherbitmap eher interessieren sollte, habe ich eine recht gute Erklärung auf Englisch gefunden (Punkt 4). [/edit]

Semih 29. Nov 2012 12:28

AW: Transparenten Kreis zum übermalen der Bewegung zeichnen !?
 
Okay nochmal danke .. hatte deine Erklärung für Tshape bis jetzt gerade übersehen ! :)
Werde es mal versuchen schaut ja ganz einfach aus !


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr.
Seite 1 von 2  1 2      

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