(Gast)
n/a Beiträge
|
AW: Tagarray
24. Dez 2017, 17:20
Kannst Du uns bitte mal die Definition der Arrays zeigen und eventuell ein paar Beispielwerte? Momentan ist mir das noch zu abstrakt um eine genaue Vorstellung davon zu haben, was genau gemacht werden soll.
Delphi-Quellcode:
zorder: Array[1..10]
faceorder: Array[1..10]
Das Array zorder ist gefüllt mit den wert der Positionen der einzelnen Icons.
Delphi-Quellcode:
procedure DrawCarousel(WinHandle: HWND);
var
K: Integer;
Angle: single;
rc: TRect;
fl: single;
speed: Integer;
xcenter, ycenter, zcenter: Single;
radius: Single;
anglePi: Single;
scale, z: Single;
x, y: Single;
begin
if bAnimate then
begin
y := trbY.GetTrackValue(trbY.Handle);
speed := trbSpeed.GetTrackValue(trbSpeed.Handle) div 4;
fl := trbFocallength.GetTrackValue(trbFocallength.Handle) / 100;
if fl < 0.02 then
fl := 0.001;
PiDiv180 := 1.74532925199433E-2;
GetClientRect(HSprCtrl, rc);
xcenter :=(rc.Right - 128) / 2;
ycenter :=(rc.Bottom - 128) / 2;
zcenter := ycenter / 2;
radius := rc.Right / 3.675;
for K := ID_MAX_SPRITE downto 1 do
begin
Angle := gSpriteData[K].rAngle;
anglePi := Angle * PiDiv180;
z := sin(anglePi) * radius + zcenter;
scale := fl / (fl + z);
x := cos(anglePi) * radius;
gSpriteData[K].xPos := round(x * scale + xcenter);
gSpriteData[K].yPos := round(y * scale + ycenter - y);
zorder[K] := round(Angle - 90);
if zorder[K] > 180 then
zorder[K] := 360 - zorder[K];
faceorder[K] := K;
if bMoveToLeft then
begin
Angle := Angle - speed;
if Angle < 1 then
Angle := 360
end else
begin
Angle := Angle + speed;
if Angle > 359 then
Angle := Angle - 360;
end;
gSpriteData[K].rAngle := round(Angle);
// Skalierungsfaktor berechnen
if Check3Ddepth.GetCheckButtonStatus(Check3Ddepth.Handle) then
gSprCtrl.GD_SetObjectScale(gSpriteData[K].ID, (ABS(zorder[K]) MOD 182) * 0.0027777 + 0.5)
else
gSprCtrl.GD_SetObjectScale(gSpriteData[K].ID, 1);
// Alpha Kanal unschalten
if CheckOpacity.GetCheckButtonStatus(CheckOpacity.Handle) and (fl > 0.999) then
gSprCtrl.GD_SetObjectAlpha(gSpriteData[K].ID, round(MIN(100 * scale, 255)), false)
else
gSprCtrl.GD_SetObjectAlpha(gSpriteData[K].ID, 255, false);
gSprCtrl.GD_SetObjectXY(gSpriteData[K].ID, gSpriteData[K].xPos, gSpriteData[K].yPos);
if CheckSelfRotation.GetCheckButtonStatus(CheckSelfRotation.Handle) then
gSprCtrl.GD_SetObjectAngle(gSpriteData[K].ID, round(gSpriteData[K].rAngle))
else
gSprCtrl.GD_SetObjectAngle(gSpriteData[K].ID, 0);
end;
// müsste hier das Array sortieren ...
// ARRAY SORT zorder(), TAGARRAY faceorder()
// Sprite ZOrder setzen
K := faceorder[1];
if bMoveToLeft then
begin
inc(K);
if K > ID_MAX_SPRITE then
K := 1;
end;
gSprCtrl.GD_SetObjectZorder(gSpriteData[K].ID, GD_ORDER_BOTTOM);
gSprCtrl.GD_SetObjectZorder(gSpriteData[faceorder[ID_MAX_SPRITE]].ID, GD_ORDER_TOP);
if CheckMarquee.GetCheckButtonStatus(CheckMarquee.Handle) then
DrawMarquee(rc.Right);
gSprCtrl.GI_UpdateWindow(HSprCtrl, false);
end;
end;
Wie man hier sehen kann ist das total durcheinander.
gruss
Geändert von EWeiss (11. Jul 2019 um 16:49 Uhr)
|
|
Zitat
|