ȳϼſ ?
Դϴ.

ϰ Ʈ ̿ؼ  ϳ ýϴ.
 ڷǿ ÷ҽϴ.
16 Ʈ â ۵ϱ, ȭ鿡  
 óī  ܰ躰 󱼻Դϴ.

ϴ   𸣰   ̴
 ǽŴٸ ϼſ...
 ȣ      ª ̶ 
ִ  鱸, ε «« ð 
   ַ  ÷ մϴ.

,  ̸   ֿ ڵ ĽĮ Ǿ
ֽϴ.
 , ڵ   ˸ Ǵ° ƴϰھ ?
( δ  C  ϰŵ..--;)
۱,    谡  ڵ 
 ϰڽϴ.

׷  ϴ.

=========================================================

1.Ʈ̶ ?

    ڷǿ ȿ ڷᵵ ö
  ֽϴٸ, ٴ    ô°
   ...

2.ʿ ҽ

   ̹ ̹ Űܰ   ϴϱ
  ׸̳  ʿϰڱ.
   ܿ ϰ   ôٸ...

3.ֿ ڷ

   Ƿ  ڷԴϴ.

  1)̴   ü

    TDotInfo = record
      SrcPos, DstPos, CurPos: TPoint; // ġ, ǥġ, ġ
      SrcR, SrcG, SrcB: Byte; // ó  R, G, B 
      DstR, DstG, DstB: Byte; // ǥ  R, G, B 
      CurR, CurG, CurB: Byte; // ǥ  R, G, B 
      AnimFrame: Integer;     //  ִϸ̼  
      AnimFrameMax: Integer;  //  ִϸ̼ ְ 
    end;

  2)׸ ϴ   ü

    TCardRGB = record
      R, G, B: Byte;
    end;

  3)ֿ   

      ص 

       // α׷ ȭ 640*480  մϴ.
       DispW = 640;
       DispH = 480;

       // ׸ Ǵ  3 常 մϴ.
       CardNumMax = 3;

       // ׸ ȭ ġ ذ
       CardPosBaseX = (DispW - CardW*CardNumMax) div (CardNumMax+1);
       CardPosBaseY = (DispH - CardH) div 2;

       // ̴  ִϸ̼ Ӽ
       DotAnimFrameMax = 8;

      α׷ ġ    ̹ 
       ڿ  

       Dir_Main, Dir_Img: String;

     ׸ Ǵ  ̹ 3   DXDraw  Surface ü

       CardSurface: array[0..CardNumMax-1]of TDirectDrawSurface;

     ׸ Ǵ  4   簢 

       CardRect: array[0..CardNumMax-1]of TRect;

     콺 Ŀ ġ ׸ ȣ   

       SelectedCardNum: Integer = -1;

       ֱ 콺 Ŀ ġ  Point(x,y)  

       CPos, PrevCPos: TPoint;

     ƴٴ   ڷ 迭...
       ̰ ׸ ȼ   Ǿ Ѵ.

       DotList: array[0..CardW-1, 0..CardH-1]of TDotInfo;


     ƽôٽ 16 Ʈ ȭ  ī忡  r, b, g 
       Ʈ ޶  ؼ 555  565 带 
        ϳ Ӵϴ.
         r, g, b   иϰ   ٽ ġ
         ũ Shift   ϴ.

       Mode555: Boolean;
       RMsk, GMsk, BMsk: WORD;
       RSft, GSft, BSft: Byte;

     ׸ Ǵ   ȼ R, G, B  ̸ иؼ 迭
       صӴϴ.
       ̷ ؾ ð   ...
       (伥 ̹ ε  ä ̸ иصδ Ͱ
         Դϴ...)

       CardRGB: array[0..CardNumMax-1 ,0..CardW-1, 0..CardH-1]of TCardRGB;

4.ֿ ڵ

  1)찡  

    procedure TMain.FormCreate(Sender: TObject);
    var
      i, j: Integer;
    begin
      // ȭ Ŀ Ⱥ̰ صӴϴ.
      DXDraw.Cursor:=crNone;

      // α׷ ȭ ũ⸦ ְ...
      ClientWidth:=DispW;
      ClientHeight:=DispH;

      //  α׷ ġ  ̹ ġ
      // ˾Ƴϴ.
      Dir_Main:=GetAppDir(Application);
      Dir_Img:=Dir_Main+'Img\';

      // ׸ ġϴ 4  ̸ صӴϴ.
      //   ȿ 콺Ŀ ġϸ ׸ õȰɷ ϰ .
      for i:=0 to CardNumMax-1 do
      begin
        CardRect[i].Left  :=CardPosBaseX+(CardW+CardPosBaseX)*i;
        CardRect[i].Top   :=CardPosBaseY-CardH+CardH*i;
        CardRect[i].Right :=CardRect[i].Left+CardW;
        CardRect[i].Bottom:=CardRect[i].Top+CardH;
      end;
      // ̴  迭 ó ϰ  ְ ˴ϴ.
      for i:=0 to CardW-1 do for j:=0 to CardH-1 do with DotList[i,j] do
      begin
        CurPos.x:=Random(DispW);
        CurPos.y:=Random(DispH);

        CurR:=Random(256);
        CurG:=Random(256);
        CurB:=Random(256);
      end;
    end;

  2)DirectX  ʱȭ Ҷ

    procedure TMain.DXDrawInitialize(Sender: TObject);
    var
      i, j, k: Integer;
      TempMsk: WORD;
      TempCol: TColor;
    begin
      :
      :
      // ׸ Ǵ  Surface ü оɴϴ.
      for i:=0 to CardNumMax-1 do
      begin
        CardSurface[i]:=TDirectDrawSurface.Create(DXDraw.DDraw);
        with CardSurface[i] do
        begin
          LoadFromFile(Dir_Img+Format('%.1d.bmp', [i]));
          SystemMemory:=True;
          :
          :
        end;
      end;

      // R, G, B ũ ϴ.
      RMsk:=DXDraw.Surface.ColorMatch(clRed );
      GMsk:=DXDraw.Surface.ColorMatch(clLime);
      BMsk:=DXDraw.Surface.ColorMatch(clBlue);

      if (DXDraw.Display.BitCount<>16)or(RMsk=0)or(GMsk=0)or(BMsk=0) then 
      // 16Ʈ ȭ ƴϰų ũ µ  ...
      begin
        MessageBox(Handle, 'ũ  ߽ϴ.'#13'ȭ鼳 16 bit ÷ ּſ...', '', 0);
        Close;
      end
      else // ũ   쿣 shift Ʈ Ѵ.
      begin
        TempMsk:=RMsk;
        RSft:=0;
        while ((TempMsk shr RSft)and $1)=0 do
        begin
          Inc(RSft);
        end;

        TempMsk:=GMsk;
        GSft:=0;
        while ((TempMsk shr GSft)and $1)=0 do
        begin
          Inc(GSft);
        end;

        TempMsk:=BMsk;
        BSft:=0;
        while ((TempMsk shr BSft)and $1)=0 do
        begin
          Inc(BSft);
        end;

        //  ׸ RGB ä иؼ 迭 Ƶд.
        for i:=0 to CardNumMax-1 do with CardSurface[i] do
        for j:=0 to CardW-1 do
        for k:=0 to CardH-1 do
        with CardRGB[i,j,k] do
        begin
          TempCol:=Pixels[j,k];
          R:=(TempCol and RMsk)shr RSft;
          G:=(TempCol and GMsk)shr GSft;
          B:=(TempCol and BMsk)shr BSft;
        end;

        // ̴  ʱȭѴ.
        //  Լ  ڿ ɴϴ.
        ResetDot;
      end;
    end;

  3)Ÿ̸Ӱ  ð ȣɶ

    procedure TMain.DXTimerTimer(Sender: TObject; LagCount: Integer);
    var
      i: Integer;
      PointArr4: array[0..4]of TPoint;
      PreSelectedCardNum: Integer;
    begin
      with DXDraw do
      begin
        //  ȭ ˰ ĥϰ...
        Surface.Fill(0);

        //  ׸ õǾ ãƳ...
        PreSelectedCardNum:=SelectedCardNum;
        SelectedCardNum:=-1;
        PrevCPos:=CPos;
        CPos:=DXDraw.ScreenToClient(Mouse.CursorPos);
        for i:=0 to CardNumMax-1 do
        begin
          if PointInRect2(CPos, CardRect[i]) then SelectedCardNum:=i;
        end;

        // ׸  õǾ ̴  ʱȭ ϰ...
        if PreSelectedCardNum<>SelectedCardNum then
        begin
          ResetDot;
        end;

        // õ ׸     ֵ ȭ鿡 ׸ ׵θ
        // 簢  ׷ش.
        for i:=0 to CardNumMax-1 do with CardRect[i] do
        begin
          PointArr4[0]:=Point(Left-2, Top-2);
          PointArr4[1]:=Point(Right+1, Top-2);
          PointArr4[2]:=Point(Right+1, Bottom+1);
          PointArr4[3]:=Point(Left-2, Bottom+1);
          PointArr4[4]:=PointArr4[0];
          Surface.Canvas.Polygon(PointArr4);
          Surface.Canvas.Release;
        end;

        //  ְ...
        //  Լ ڿ ɴϴ.
        MoveDot;

        //  ׷ְ...
        // ̰͵...
        DrawDot;

        // DirectDraw  BackSurface  Flip մϴ.
        Flip;
      end;
    end;

  4)̴  ʱȭ Լ

    procedure TMain.ResetDot;
    var
      i, j, ii, jj, iii, jjj: Integer;
    begin
      if SelectedCardNum>=0 then // ׸ õ Ȳ̸...
      begin
        ii:=Random(CardW);
        jj:=Random(CardH);

        for i:=0 to CardW-1 do
        begin
          iii:=i+ii; if iii>=CardW then Dec(iii, CardW);
          for j:=0 to CardH-1 do with DotList[i,j], CardSurface[SelectedCardNum] do
          begin
            jjj:=j+jj; if jjj>=CardH then Dec(jjj, CardH);
            // ġ ǥϰ...
            SrcPos:=CurPos;
            // ǥġ 켱  ...
            DstPos.x:=CardRect[SelectedCardNum].Left+iii;
            DstPos.y:=CardRect[SelectedCardNum].Top +jjj;
            // ǥ  ϰ...
            SrcR:=CurR;
            SrcG:=CurG;
            SrcB:=CurB;
            with CardRGB[SelectedCardNum, iii, jjj] do
            begin
              DstR:=R;
              DstG:=G;
              DstB:=B;
            end;
            // ӵ ϰ...
            AnimFrame:=0;
            AnimFramemax:=DotAnimFrameMax+Random(DotAnimFrameMax*3);
          end;
        end;
      end
      else // ׸ õ  ̸...
      begin
        for i:=0 to CardW-1 do for j:=0 to CardH-1 do with DotList[i,j] do
        begin
          // ġ ǥϰ...
          SrcPos:=CurPos;
          // ǥġ ׻  콺 ǥ...
          // ǥ  ٲ ʴ´.
          // ӵ ϰ...
          AnimFrame:=0;
          AnimFramemax:=DotAnimFrameMax+Random(DotAnimFrameMax*3);
        end;
      end;
    end;

  5) ִ Լ

    procedure TMain.MoveDot;
    var
      i, j: Integer;
      FrameInv: Integer;
      TargetPos: TPoint;
    begin
      if SelectedCardNum>=0 then // ׸ õ Ȳ̸...
      begin
        for i:=0 to CardW-1 do for j:=0 to CardH-1 do with DotList[i,j] do
        begin
          if AnimFrame<AnimFrameMax then
          begin
            // ġ ϰ...
            FrameInv:=AnimFrameMax-AnimFrame;
            CurPos.x:=(SrcPos.x*FrameInv+DstPos.x*AnimFrame) div AnimFrameMax;
            CurPos.y:=(SrcPos.y*FrameInv+DstPos.y*AnimFrame) div AnimFrameMax;

            //  ٲְ...
            CurR:=(SrcR*FrameInv+DstR*AnimFrame) div AnimFrameMax;
            CurG:=(SrcG*FrameInv+DstG*AnimFrame) div AnimFrameMax;
            CurB:=(SrcB*FrameInv+DstB*AnimFrame) div AnimFrameMax;

            Inc(AnimFrame);
          end
          else
          begin
            CurPos:=DstPos;
            CurR:=DstR;
            CurG:=DstG;
            CurB:=DstB;
          end;
        end;
      end
      else // ׸ õ ʾ ׳ 콺 Ŀ ٴϴ°Ÿ...
      begin
        if (PrevCPos.x<>CPos.x)or(PrevCPos.y<>CPos.y) then
        begin
          for i:=0 to CardW-1 do for j:=0 to CardH-1 do with DotList[i,j] do
          begin
            SrcPos:=CurPos;
            AnimFramemax:=DotAnimFrameMax+Random(DotAnimFrameMax*3);
          end;
        end;

        for i:=0 to CardW-1 do for j:=0 to CardH-1 do with DotList[i,j] do
        begin
          if Random(100)<50 then
          begin
            // Լ ľ þ  ׷ մϴ.
            TargetPos.x:=CPos.x+SignedRandom(Random(16)); 
            TargetPos.y:=CPos.y+SignedRandom(Random(16));
          end
          else
          begin
            TargetPos:=CPos;
          end;
          if AnimFrame<AnimFrameMax then
          begin
            // 콺  Ѿư...
            if (CurPos.x<>TargetPos.x)or(CurPos.y<>TargetPos.y) then
            begin
              // ġ ϰ...
              FrameInv:=AnimFrameMax-AnimFrame;
              CurPos.x:=(SrcPos.x*FrameInv+TargetPos.x*AnimFrame) div AnimFrameMax;
              CurPos.y:=(SrcPos.y*FrameInv+TargetPos.y*AnimFrame) div AnimFrameMax;

              //  ״...
              Inc(AnimFrame);
            end
            else //
            begin
              CurPos:=TargetPos;
            end;
          end
          else //    ˾Ҵµ...
          begin
            //  콺  Ѿư...
            if (CurPos.x<>TargetPos.x)or(CurPos.y<>TargetPos.y) then
            begin
              SrcPos:=CurPos;
              AnimFrame:=0;
              AnimFramemax:=DotAnimFrameMax+Random(DotAnimFrameMax*3);
            end;
          end;
        end;
      end;
    end;

  6)ȭ ׸ Լ

    procedure TMain.DrawDot;
    var
      i, j: Integer;
      DstDDSD: TDDSurfaceDesc;
      PixelPos: ^Word;
      CurrentCol: WORD;
      BPP: Byte;
    begin
      BPP:=DXDraw.Surface.BitCount div 8;

      with DXDraw.Surface do
      begin
        DstDDSD.dwSize := SizeOf(DstDDSD);
        Lock(TRect(nil^),DstDDSD);

        for i:=0 to CardW-1 do
        for j:=0 to CardH-1 do
        with DotList[i,j] do
        if PointInRect2(CurPos, DXDraw.ClientRect) then
        begin
          //    ġ ׷ְ...
          CurrentCol:=(CurR shl RSft) or (CurG  shl GSft) or (CurB shl BSft);
          PixelPos :=Pointer(DWORD(DstDDSD.lpSurface)
                     +CurPos.x*BPP+DstDDSD.lPitch*CurPos.y);
          PixelPos^:=CurrentCol;
        end;

        UnLock;
      end;
    end;

=========================================================

ҽڵ忡 ּ     ˼մϴ.
 ڵ ü ߿  ƴϱ α׷ 帧   ߿
̴ϱ...
 ڵ忴ϴٸ  ǽñ ...

׷  Ϸ ǽñ, ϼſ...
ݱ 俴ϴ.
