Mouse rotation
Submitted by GROL on 28 August, 2010 - 21:39

Slides switch creates an illusion of 3D rotation. Holding left mouse button, one can drag left or right to rotate an object in one or another side.
Source archive: mouse_rotate.zip (1.5Mb)
Sample works
Some sample source:
var Movie: TFlashMovie; _MaxW, _MaxH, il: integer; fn: string; Sprite: TFlashSprite; pBar: TFlashShape; begin if cbAutoSize.Checked then begin _MaxW := 0; _MaxH := 0; end else begin _MaxW := StrToIntDef(eWidth.Text, 0); _MaxH := StrToIntDef(eHeight.Text, 0); cbAutoSize.Checked := (_MaxW = 0) or (_MaxH = 0) end; Movie := TFlashMovie.Create(0, 0, _MaxW, _MaxH, 20, scPix); Movie.Compressed := true; Movie.Version := SWFVer7; // add images and check up size for il := 0 to ListFiles.Count - 1 do with Movie.AddShapeImage(ListFiles.Items[il]) do if cbAutoSize.Checked then begin if _MaxW < XMax then _MaxW := XMax; if _MaxH < YMax then _MaxH := YMax; end; if cbAutoSize.Checked then begin Movie.SetSWFRect(Rect(0, 0, _MaxW, _MaxH)); eWidth.Text := IntToStr(_MaxW); eHeight.Text := IntToStr(_MaxH); end; // make preloader if cbPreload.Checked then begin // change AddObjectMode for adding preloader to home movie Movie.AddObjectMode := amFromStartFrame; // add progress bar pBar := Movie.AddRectangle(0, 0, 100, 20); with pBar.SetLinearGradient(cswfSkyBlue, cswfWhite, 270) do begin Count := 3; GradientRatio[2] := 80; GradientColor[3].RGBA := cswfSkyBlue; GradientRatio[3] := 255; end; // add text label Movie.AddFont(self.Font, true).Bold := true; with Movie.AddDynamicText('pr', '0%', cswfRed, Movie.Fonts[0], Rect(0, (_MaxH - 20) div 2, _MaxW, (_MaxH + 20) div 2)) do begin AutoSize := false; NoSelect := true; Align := taCenter; end; Sprite := Movie.AddSprite; with Sprite.PlaceObject(pBar, 1) do begin SetScale(_MaxW / 100 * 0.8, 1); end; Sprite := Movie.AddSprite; with Sprite.PlaceObject(Movie.Sprites[0], 1) do begin ColorTransform.AddA := -180; TranslateX := Round(0.1 * _MaxW); TranslateY := (_MaxH - 20) div 2; end; Sprite.PlaceObject(Movie.Texts[0], 4).Name := 'prText'; with Sprite.PlaceObject(Movie.Sprites[0], 2) do begin TranslateX := Round(0.1 * _MaxW); TranslateY := (_MaxH - 20) div 2; Name := 'pBar'; end; Sprite.ShowFrame; with Movie.PlaceObject(Sprite, 2) do with OnEnterFrame do {..$DEFINE TestPreloader} {$IFNDEF TestPreloader} // Show loading process: Compile('loaded = int(100 * _root.getBytesLoaded() / _root.getBytesTotal());' + 'pBar._xscale = loaded;' + 'pr = loaded + "%";' + 'if (loaded == 100) { _root.gotoAndPlay(2); }'); {$ELSE} // Test preloader: Compile('loaded = int(loaded) + 1;' + 'pBar._xscale = loaded;' + 'pr = loaded + "%";' + 'if (loaded == 100) { _root.gotoAndPlay(2); }'); {$ENDIF} // return to normal mode Movie.AddObjectMode := amEnd; Movie.FrameActions.Stop; Movie.ShowFrame; Movie.RemoveObject(2); end; //make sprite containing a single frame for every image Sprite := Movie.AddSprite(); with Sprite.FrameActions do begin SetVar('RotationStep', 5, true); SetVar('RotationCount', 0, true); SetVar('currentframe', 1, true); SetVar('totalframes', ListFiles.Count, true); Compile(ActionScript.Lines); // invisible memo ActionScript is used as storage of script code end; for il := 0 to ListFiles.Count - 1 do begin with Sprite.PlaceObject(Movie.Shapes[il], 1), Movie.Shapes[il] do begin // place image to center movie if _MaxW > XMax then TranslateX := (_MaxW - XMax) div 2; if _MaxH > YMax then TranslateY := (_MaxH - YMax) div 2; if il > 0 then RemoveDepth := true; end; Sprite.ShowFrame; end; // place sprite with images to stage Movie.PlaceObject(Sprite, 1); Movie.FrameActions.Stop; Movie.ShowFrame; //make swf Movie.MakeStream; fn := ExtractFilePath(ParamStr(0)) + 'ImageRotate.swf'; Movie.SaveToFile(fn); Movie.Free; end;