by ゲスト » 2012年11月26日(月) 21:13
> ゲームを作ってて必要になったので作りました。
>
> 次のコードを、CImage2DクラスのPublicアクセスできる位置に入れてください。
差分 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Sub DrawRotate(thita As Single,x As Single,y As Single,width As Single,height As Single)
> DrawRotateEx(thita,x,y,width,height,width/2,height/2)
> End Sub
>
> Sub DrawRotateEx(thita As Single,x As Single,y As Single,width As Single,height As Single,ox As Single,oy As Single)
> 'thita::回転角(単位はラジアン、右回転。)
> 'x,y::回転前の描画先の左上頂点座標
> 'width,height::描画元のサイズ
> 'ox,oy::描画元の左上頂点座標を(0,0)とした場合の、回転の中心座標
>
> Dim sc As Single,cc As Single
> Dim oxwi As Single,oyhe As Single
>
> 'テクスチャーブレンディングの設定
> dx_lpD3DDEV->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE)
> dx_lpD3DDEV->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE)
> dx_lpD3DDEV->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE)
>
> 'アルファブレンディングの設定
> dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE)
> dx_lpD3DDEV->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA)
> dx_lpD3DDEV->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA)
>
> 'テクスチャー設定
> dx_lpD3DDEV->SetTexture(0,lpD3DTexture)
>
> '頂点フォーマット設定
> dx_lpD3DDEV->SetFVF(D3DFVF_DEFAULT2D)
>
> '何度も使う値は予め計算しておく。
> sc=Sin(thita) As Single
> cc=Cos(thita) As Single
> oxwi=ox-width
> oyhe=oy-height
>
> vertices[0].x=x-cc*ox+sc*oy+ox
> vertices[0].y=y-cc*oy-sc*ox+oy
> vertices[0].tu=0
> vertices[0].tv=0
>
> vertices[1].x=x-cc*oxwi+sc*oy+ox
> vertices[1].y=y-cc*oy-sc*oxwi+oy
> vertices[1].tu=1
> vertices[1].tv=0
>
> vertices[2].x=x-cc*oxwi+sc*oyhe+ox
> vertices[2].y=y-cc*oyhe-sc*oxwi+oy
> vertices[2].tu=1
> vertices[2].tv=1
>
> vertices[3].x=x-cc*ox+sc*oyhe+ox
> vertices[3].y=y-cc*oyhe-sc*ox+oy
> vertices[3].tu=0
> vertices[3].tv=1
>
> 'ポリゴン描画
> dx_lpD3DDEV->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,vertices,SizeOf(DEFAULTVERTEX2D))
>
> 'アルファブレンディングの無効化
> dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE)
> End Sub
コード例 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Dim Square1 As CImage2D,thita As Single
> Dim Square2 As CImage2D,Square3 As CImage2D
>
> Function InitProc()
> 'DirectXを初期化
> If dx_Init(hMainWnd,ScreenX,ScreenY,FALSE)=0 Then
> InitProc=0
> Exit Function
> End If
>
> 'マウスカーソルを非表示にする
> ShowCursor(FALSE)
>
> ' TODO: この位置にアプリケーションの初期化コードを記述してください。
> Square1.SetColor(D3DCOLOR_RGBA(255,255,255,255))
> Square2.SetColor(D3DCOLOR_RGBA(0,0,255,255))
> Square3.SetColor(D3DCOLOR_RGBA(255,0,0,255))
> thita=0
>
> InitProc=1
> End Function
>
> Sub RenderProc()
> ' TODO: この位置に描画に関するコードを記述してください。
> thita+=0.01
> Square1.DrawRotateEx(0.5*thita,130,130,140,140, 70,70)
> Square2.DrawRotateEx( 2*thita,120,185, 30, 30, 40,15)
> Square3.DrawRotateEx( -3*thita,240,185, 30, 30,-10,15)
> End Sub
> ゲームを作ってて必要になったので作りました。
>
> 次のコードを、CImage2DクラスのPublicアクセスできる位置に入れてください。[hide=差分][code]Sub DrawRotate(thita As Single,x As Single,y As Single,width As Single,height As Single)
> DrawRotateEx(thita,x,y,width,height,width/2,height/2)
> End Sub
>
> Sub DrawRotateEx(thita As Single,x As Single,y As Single,width As Single,height As Single,ox As Single,oy As Single)
> 'thita::回転角(単位はラジアン、右回転。)
> 'x,y::回転前の描画先の左上頂点座標
> 'width,height::描画元のサイズ
> 'ox,oy::描画元の左上頂点座標を(0,0)とした場合の、回転の中心座標
>
> Dim sc As Single,cc As Single
> Dim oxwi As Single,oyhe As Single
>
> 'テクスチャーブレンディングの設定
> dx_lpD3DDEV->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE)
> dx_lpD3DDEV->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE)
> dx_lpD3DDEV->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE)
>
> 'アルファブレンディングの設定
> dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE)
> dx_lpD3DDEV->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA)
> dx_lpD3DDEV->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA)
>
> 'テクスチャー設定
> dx_lpD3DDEV->SetTexture(0,lpD3DTexture)
>
> '頂点フォーマット設定
> dx_lpD3DDEV->SetFVF(D3DFVF_DEFAULT2D)
>
> '何度も使う値は予め計算しておく。
> sc=Sin(thita) As Single
> cc=Cos(thita) As Single
> oxwi=ox-width
> oyhe=oy-height
>
> vertices[0].x=x-cc*ox+sc*oy+ox
> vertices[0].y=y-cc*oy-sc*ox+oy
> vertices[0].tu=0
> vertices[0].tv=0
>
> vertices[1].x=x-cc*oxwi+sc*oy+ox
> vertices[1].y=y-cc*oy-sc*oxwi+oy
> vertices[1].tu=1
> vertices[1].tv=0
>
> vertices[2].x=x-cc*oxwi+sc*oyhe+ox
> vertices[2].y=y-cc*oyhe-sc*oxwi+oy
> vertices[2].tu=1
> vertices[2].tv=1
>
> vertices[3].x=x-cc*ox+sc*oyhe+ox
> vertices[3].y=y-cc*oyhe-sc*ox+oy
> vertices[3].tu=0
> vertices[3].tv=1
>
> 'ポリゴン描画
> dx_lpD3DDEV->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,vertices,SizeOf(DEFAULTVERTEX2D))
>
> 'アルファブレンディングの無効化
> dx_lpD3DDEV->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE)
> End Sub[/code][/hide][hide=コード例][code]Dim Square1 As CImage2D,thita As Single
> Dim Square2 As CImage2D,Square3 As CImage2D
>
> Function InitProc()
> 'DirectXを初期化
> If dx_Init(hMainWnd,ScreenX,ScreenY,FALSE)=0 Then
> InitProc=0
> Exit Function
> End If
>
> 'マウスカーソルを非表示にする
> ShowCursor(FALSE)
>
> ' TODO: この位置にアプリケーションの初期化コードを記述してください。
> Square1.SetColor(D3DCOLOR_RGBA(255,255,255,255))
> Square2.SetColor(D3DCOLOR_RGBA(0,0,255,255))
> Square3.SetColor(D3DCOLOR_RGBA(255,0,0,255))
> thita=0
>
> InitProc=1
> End Function
>
> Sub RenderProc()
> ' TODO: この位置に描画に関するコードを記述してください。
> thita+=0.01
> Square1.DrawRotateEx(0.5*thita,130,130,140,140, 70,70)
> Square2.DrawRotateEx( 2*thita,120,185, 30, 30, 40,15)
> Square3.DrawRotateEx( -3*thita,240,185, 30, 30,-10,15)
> End Sub[/code][/hide]