Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#10

AW: Ein Panel an eine Instanz einer Klasse TBall übergeben

  Alt 10. Mär 2022, 18:01
@Venice2
Sehr schön gemacht, sieht auch gut aus ohne das OpenGL.
Du hast hier SKAERO verwendet, ist das etwas zusätzliches, konnte auf die schnelle nichts dazu finden.
Viel WindowsCode(Fensterverwaltung mit drin) und einiges das aussieht als sei es zu einer Zeit geschrieben als Delphi noch nicht so viel mit drin hatte (StrUtils gibts mittlerweile für MidStr,LeftStr usw., hatte ich mir früher auch mal selbst gebastelt aus dem Copy Befehl).
Globals.pas ist scheinbar eine alte Zusammenstellung von Befehlen, um es mit einigen Befehlen leichter zu haben. (Einiges gibt es jetzt schon in Delphi).

Die Sprite Technik ist was für mich, das scheint etwas einfacher zu sein als OpenGL.

Danke für den Code, da kann ich noch einiges draus lernen.
Es geht hier eben darum keine VCL zu verwenden und einige Funktionen bzw. Units auszusparen das ist der ganze Trick!
SKAERO ist eine von mit erstellte Engine mit der man unabhängig von der VCL ist. Inclusive Skin Support und Verwendungen von Sprites.
Diese kann man mit der Maus selektieren und verschieben solange wie sie bei der Erstellung nicht gesperrt werden.
Der Cursor ändert sich dann zum Kreuz.

Hier ein Update damit kannst du anschließend den Ball (Sprite(0..3)) zur Laufzeit auf eine andere Position verschieben.
Auch der Lauftext ist ein Sprite und kann verschoben werden.

Einfach diese Funktion ersetzen.
Delphi-Quellcode:
{$REGION 'DrawBounce'}
procedure DrawBounce;
var
  K: Integer;
  x, y: Integer;
  s: PSpriteData;
  rc: TRect;
begin

  if bAnimate then
  begin
    GetClientRect(HSprCtrl, rc);

    for K := 3 downto 0 do
    begin
      // wenn der linke Button gedrückt wird und die Maus sich auf einem Sprite (Ball(0..3))
      // befindet kann man ihn verschieben von dieser Position aus bewegt er sich dann weiter.
      if not gSprCtrl.GI_IsLButtonDown then
      begin
        s := @gSpriteData[k];
        if s.xDir > 0 then
        begin
          if s.xPos + s.nWidth > rc.Right then
            s.xDir := -s.xDir;
        end else
        if s.xPos < 0 then
          s.xDir := -s.xDir;

        if s.yDir > 0 then
        begin
          if s.yPos + s.nHeight > rc.Bottom then
            s.yDir := -s.yDir;
        end else
        if s.yPos < 0 then
          s.yDir := -s.yDir;

        s.xPos := s.xPos + s.xDir;
        s.yPos := s.yPos + s.yDir;
        gSprCtrl.GD_SetObjectXY(s.ID, s.xPos, s.yPos);
      end else
      begin
        s := @gSpriteData[k];
        // x, y Position vom aktuell selektierten Sprite
        // abhängig von der dazu gehörigen ID einlesen.
        gSprCtrl.GD_GetObjectXY(s.ID, x, y);
        s.xPos := x;
        s.yPos := y;
        // neue Position setzen
        gSprCtrl.GD_SetObjectXY(s.ID, s.xPos, s.yPos);
      end;
    end;

    if UseMarquee then
    begin
      gSprCtrl.GD_GetObjectXY(ID_OBJECT_MARQUEE, x, y);

      x := x - 2;
      if x < -MarqueeWidth then
        x := rc.Right + MarqueeWidth;
      gSprCtrl.GD_SetObjectXY(ID_OBJECT_MARQUEE, x, y);
    end;

    gSprCtrl.GI_UpdateWindow(HSprCtrl, false);
  end;
end;
{$ENDREGION}
uControls..
Delphi-Quellcode:
  for K := 0 to ID_MAX_SPRITE - 1 do
  begin
    gSpriteData[K].hBmp := gSprCtrl.GI_CreateBitmapFromFile(PWideChar(gSpriteData[K].ImageName), ImgW, ImgH);
    gSpriteData[K].ID := ID_OBJECT_SPRITE + K;
    gSpriteData[K].nWidth := ImgW;
    gSpriteData[K].nHeight := ImgH;
    gSpriteData[K].xPos := random(400);
    gSpriteData[K].yPos := random(300);

    gSprCtrl.GD_DrawBitmapToCtrl(HSprCtrl, gSpriteData[K].xPos, gSpriteData[K].yPos, gSpriteData[K].hBmp, $FFFFFFFF,
      gSpriteData[K].ID, GS_VISIBLE);
    // Werden die Sprites gesperrt lassen sie sich nicht mehr verschieben.
    gSprCtrl.GD_SetObjectLocked(gSpriteData[K].ID, true);
  end;

Geändert von venice2 (10. Mär 2022 um 18:20 Uhr)
  Mit Zitat antworten Zitat