Mouse rotation

Submitted by GROL on 28 August, 2010 - 21:39
Emulate 3D rotation in SWF

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;