Hi Leute,
erst mal vielen Dank
für die vielen tollen Antworten und Ideen
Das hat echt geholfen... (Ich komm blos leider nur schleppend hinter her die einzelden Antworten aus zu probieren .... Zeitprobleme)
Das mit dem Winkel bekomme ich so langsam in Griff... Es fehlen mir anscheidnen bei ein paar Rechnungen nur noch ein paar Faktoren
Wenn der Ball jetzt abprallt, fliegt er immer mit dem Winkel von 0 bzw. 180 Grad weg, aber das bekomme ich schon noch hin...
Wen 's interessiert hier der Code:
Code:
procedure TBall.ReverseX(X, Y, Degrees : Integer);
var
arc : Real;
begin
arc := 0.1; // Backup
//rechts oben kreishälfte - winkel berechnen ( 360 - arcsin )
if ( (X > MyX) AND (Y < MyY) ) then
arc := 360-radtodeg(arcsin((MyY-Y) / sqrt( ((X-MyX)*(X-MyX))+((MyY-Y)*(MyY-Y)) )));
// links unten kreishälfte
if ( (X < MyX) AND (Y > MyY) ) then
arc := 180-radtodeg(arccos((MyX-X) / sqrt( (MyX-X)*(MyX-X)+(Y-MyY)*(Y-MyY) ) ));
// links oben kreishälfte ( 180 + arccos )
if ( (X < MyX) AND (Y < MyY) ) then
arc := 180+radtodeg(arccos((MyX-X) / sqrt( (MyX-X)*(MyX-X)+(MyY-Y)*(MyY-Y) ) ));
// rechts unten kreishälfte
if ( (X > MyX) AND (Y > MyY) ) then
arc := radtodeg(arcsin((Y-MyY) / sqrt( ((X-MyX)*(X-MyX))+((Y-MyY)*(Y-MyY)) )));
// gerade werte vermeiden
if ( (X = MyX) AND (Y < MyY) ) then arc := 270.1;// hoch
if ( (X = MyX) AND (Y > MyY) ) then arc := 90.1; //runter
if ( (X < MyX) AND (Y = MyY) ) then arc := 180.1; //links
if ( (X > MyX) AND (Y = MyY) ) then arc := 0.1; //rechts
if ( (X = MyX) AND (Y = MyY) ) then arc := 0.1; // punkt auf punkt
Arc := Arc + sign(StepY) * (90 + Degrees);
StepX := ( cosa[round(arc)] * StepX);
StepY := ( sina[round(arc)] * StepY);
end;
X und Y sind die Kooerdinaten des Punkets wo der Ball hin soll. So zu sagen der Bezugspunkt im Raum.
MyX und MyY sind Kooerdinaten des Balls
StepX und StepY ist die Geschwindigkeit in Pixel in X bzw. Y Richtung.
Na ja werde da noch ein bisschen weiterbasteln...
Ach ja an dieser Stelle ein ganz großes Dankeschön an Supermuckl bei dem ich den Code "klauen" und abwandel durfte!!!
So!!
Nun zu deiner Frage Mr.Dollar2k3:
mit dem Zeichen bin ich zwar auch noch nicht so ganz zu frieden aber ich mache das zur Zeit noch "per Hand". Ich schnappe mir das Bild und gehe es, im interessanten Bereich, in den das bilds des Balls, nachher rein soll, Pixel für Pixel durch und kombiniere den Ball mit dem Hintergrundbild.
das Sieht dann so auch:
Code:
procedure TDraw.Merge(Target : TBitmap; Source : TBitmap; Strength : Byte; Left, Top : Integer);
var
X, Y : integer;
pt, ps: ^PixArray;
begin
Target.PixelFormat := pf24bit;
for Y := 0 to Source.height - 1 do
begin
pt := Target.ScanLine[Top + Y]; //Get the Targetpicture's Line of Pixels
inc(pt, Left); //Move focus to the interessting Area
ps := Source.ScanLine[Y]; //Get the Sourcepicture's Line of Pixel
for X := 0 to Source.width - 1 do begin
if ((ps^[2] <> 255) or (ps^[0] <> 0) or (ps^[1] <> 0)) then //Dont add if Color is red
begin
pt^[2] := Round(ps^[2] * (Strength / 255 ) + pt^[2] * (1 - (Strength / 255))); //Red
pt^[0] := Round(ps^[0] * (Strength / 255 ) + pt^[0] * (1 - (Strength / 255))); //Green
pt^[1] := Round(ps^[1] * (Strength / 255 ) + pt^[1] * (1 - (Strength / 255))); //Blue
end;
inc(pt); //Next Pixel of the Target Picture
inc(ps); //Next Pixel of the Source Picture
end;
end;
end;
Ich hole mir nen Pointer auf ein Pixel des Bildes
Code:
pt := Target.ScanLine[Top + Y];
Sehe mir die drei
RGB werte an:
pt^[2] für Rot
pt^[0] für Grün
pt^[1] für Blau
und verändere sie entsprechend.
Strenght gibt dabei den Alpha werde des zu zeichnenden Bildes an.
falls du das genauer nachleden willst:
MSN Library
Aber das wird je nach der Menge der Objekte die ich zeichne auch ein bisschen langsam.... Ich bin auf der Suche nach was schnelleren...
OpenGL, Direct Draw?
Bin noch nicht so ganz sicher..
Ein bisschen schwierig oder?
Kennt da jemand was flinkes angenehmeres?
Erst mal thx so weit
cya Corelgott