![]() |
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:
und hier das Bild was mein Problem nochmal aufzeigt !
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; Anhang 38154 |
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. |
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 :) |
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; |
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. |
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:
Andere Frage kann man nicht irgendwie die Color Informationen des Timage abfragen und sagen Tkreis soll sie übernehmen ?
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. |
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.
|
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 ) |
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 ![]() |
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 08:20 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 by Thomas Breitkreuz