AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Transparenten Kreis zum übermalen der Bewegung zeichnen !?
Thema durchsuchen
Ansicht
Themen-Optionen

Transparenten Kreis zum übermalen der Bewegung zeichnen !?

Ein Thema von Semih · begonnen am 28. Nov 2012 · letzter Beitrag vom 29. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2      
Semih

Registriert seit: 28. Nov 2012
6 Beiträge
 
#1

Transparenten Kreis zum übermalen der Bewegung zeichnen !?

  Alt 28. Nov 2012, 13:33
Delphi-Version: 7
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 !

awsfga.jpg
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 28. Nov 2012, 13:39
Hallo und Willkommen in der 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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Semih

Registriert seit: 28. Nov 2012
6 Beiträge
 
#3

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

  Alt 28. Nov 2012, 13:57
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

Danke nochmal
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 28. Nov 2012, 14:04
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

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

  Alt 28. Nov 2012, 14:13
@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.
  Mit Zitat antworten Zitat
Semih

Registriert seit: 28. Nov 2012
6 Beiträge
 
#6

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

  Alt 28. Nov 2012, 14:17
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 28. Nov 2012, 14:21
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Semih

Registriert seit: 28. Nov 2012
6 Beiträge
 
#8

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

  Alt 28. Nov 2012, 14:29
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 )
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 28. Nov 2012, 14:32
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (28. Nov 2012 um 14:35 Uhr)
  Mit Zitat antworten Zitat
Semih

Registriert seit: 28. Nov 2012
6 Beiträge
 
#10

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

  Alt 29. Nov 2012, 13:28
Okay nochmal danke .. hatte deine Erklärung für Tshape bis jetzt gerade übersehen !
Werde es mal versuchen schaut ja ganz einfach aus !
  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 05:40 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