サンプルコードのダウンロード



Visual C++6.0Visual C++effec_04.dsw
effec_04.exe

使


23使
23



使







1

x,yAax,ayBbx,by



Y2


C
length = sqrt((ax-bx)*(ax-bx) + (ay-by)*(ay-by));


DirectDraw



WinMain()DirectDraw
DirectDrawDirectDraw 13
使MODE X使

lpGraph
使
LPDIRECTDRAWSURFACE lpBack=NULL; //オフスクリーンサーフェイス(バックバッファ)
LPDIRECTDRAWSURFACE lpWork=NULL; //オフスクリーンサーフェイス(作業用バッファ)
LPDIRECTDRAWSURFACE lpGraph=NULL; //オフスクリーンサーフェイス(作業用バッファ その2

StartDirectDraw
BOOL StartDirectDraw(HWND hw){

 略

 //作業用オフスクリーンサーフェイス作成
 ZeroMemory(&ddsd,sizeof(ddsd));
 ddsd.dwSize=sizeof(ddsd);
 ddsd.dwFlags=DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
 //強制的にシステムメモリ内に作成する
 ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
 ddsd.dwWidth=320;
 ddsd.dwHeight=240;
 if((lpDD->CreateSurface(&ddsd,&lpWork,NULL))!=DD_OK)
  return FALSE;
 if((lpDD->CreateSurface(&ddsd,&lpGraph,NULL))!=DD_OK)
  return FALSE;

DDSCAPS_SYSTEMMEMORY

DirectDraw
lpGraph


bridge.bmp)lpGraph)
//----------[ メイン関数 ]----------------------------------------------------------------------
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow){
    
 略
 
 //DirectDraw開始
 StartDirectDraw(hw);

 //パレット設定
 LoadPalette("bridge.bmp");
 
 //ビットマップを作業用サーフェイスへ読み込む
 LoadBitmap(lpGraph,"bridge.bmp",0,0,320,240);


 //サイン、コサインテーブル作成(256で一周とする)
 float fsin[256],fcos[256];
 for(int i=0;i<256;i++){
  fsin[i]=(float)sin(i*3.1415926535/128);
  fcos[i]=(float)cos(i*3.1415926535/128);
 }

360256
 fsin[BYTE()] BYTE(unsigned char)

(0-255)

 float length[240][320];
 BYTE angle[240][320];

 int x,y;
 for(y=0;y<240;y++)
  for(x=0;x<320;x++){
   length[y][x]=(float)sqrt((160-x)*(160-x)+(120-y)*(120-y));
   angle[y][x]=BYTE(atan2(-double(120-y),double(160-x))/3.141592*128+256);
  }


 11
 //サーフェイスのロックで使用
 DDSURFACEDESC desc_src,desc_dest;
 ZeroMemory(&desc_src,sizeof(DDSURFACEDESC));
 ZeroMemory(&desc_dest,sizeof(DDSURFACEDESC));
 desc_src.dwSize=desc_dest.dwSize=sizeof(DDSURFACEDESC);
 BYTE *p_src,*p_dest; //ちなみに src=参照元  dest=転送先
 int sx,sy;
 int pitch_src,pitch_dest;
 
 int count=0;
 float width=0.f,width_max=20,width_add=0.15f;
 BYTE color;

 while(1){
  //疑似タイマー処理
  tim=timeGetTime();
  count++;    //カウンタ

  //ゆれの大きさを時間によって変化させる
  if(width_add>0){
   if((width+=width_add)>width_max)
    width_add=-width_add;
  } else {
   //0まで戻してしまうとちょっと歪むのでやめる
   if((width+=width_add)<=0.05f){
    width=0.05f;
    width_add=-width_add;
   }
  }




(lpGraph(lpWork)
  //ロック
  lpGraph->Lock(NULL,&desc_src,DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,NULL);
  p_src=(BYTE*)desc_src.lpSurface;
  pitch_src=desc_src.lPitch;
 
  lpWork->Lock(NULL,&desc_dest,DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,NULL);
  p_dest=(BYTE*)desc_dest.lpSurface;
  pitch_dest=desc_dest.lPitch;

DirectDraw 12


  BYTE *p_angle=&angle[0][0];
  float *p_length=&length[0][0];

  for(y=0;y<240;y++){
   for(x=0;x<320;x++){
    //参照元をずらす
    float len=fsin[BYTE((-count+*p_length)*15)]*width;
    sx=int(x+fcos[*p_angle]*len);
    sy=int(y-fsin[*p_angle]*len);
    color=0;
    if(sx>=0 && sx<320 && sy>=0 && sy<240)
     color=*(p_src+pitch_src*sy+sx);
    *(p_dest++)=color;
    p_angle++;
    p_length++;
   }
   p_dest+=pitch_dest-320;
  }





320×240)

(p_length)+count)使



  //アンロック
  lpWork->Unlock(desc_dest.lpSurface);
  lpGraph->Unlock(desc_src.lpSurface);
  
  Blt(lpBack,0,0,320,240,lpWork,0,0,FALSE);

  Flip();  //フリッピング

  あとは省略(爆




記事検索

アーカイブ