Einzelnen Beitrag anzeigen

Benutzerbild von Corelgott
Corelgott

Registriert seit: 11. Apr 2003
Ort: Lübeck
213 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: Der Klassiker Pong & die Winkel...

  Alt 13. Dez 2003, 16:09
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
  Mit Zitat antworten Zitat