BOOL groundClip(){
static struct {
double x,y;
}vX,vY; // 視野ベクトル
static double r = 0.0; // 見ている方向(テスト用)
HDC hdc; D3Z.lpBackBuffer->GetDC(&hdc;); // デバイスコンテキスト取得
// ブラシなどを初期化
HBRUSH hRedBrush,hGreenBrush,oldBrush,hBlueBrush;
hRedBrush = CreateSolidBrush(RGB(255,80,80));
hGreenBrush = CreateSolidBrush(RGB(80,255,80));
hBlueBrush = CreateSolidBrush(RGB(80,80,255));
oldBrush = SelectObject(hdc,hRedBrush);
// キーボード読み取り
char key[256];
GetKeyboardState((unsigned char*)key);
if( key[VK_LEFT] &0xf0) r -= 10.0;
if( key[VK_RIGHT] &0xf0) r += 10.0;
if( key[VK_ESCAPE] &0xf0) DestroyWindow(hwnd);
// テスト用に視野ベクトルを算出
double rad = r*3.14159/180;
vX.x = cos(rad);
vX.y = sin(rad);
vY.x = -sin(rad);
vY.y = cos(rad);
static double ax = 5.0,ay = 5.0;
// 視点の移動
if( key[VK_UP]&0xf0 ) {
ax += (vX.x + vY.x)/2;
ay += (vX.y + vY.y)/2;
}
if( key[VK_DOWN]&0xf0 ) {
ax -= (vX.x + vY.x)/2;
ay -= (vX.y + vY.y)/2;
}
mx = ax;
my = ay;
int div;
if( vX.x > 0 ){
if(vX.y > 0){
if(vY.y>0){
div = 0;
}else{
div = 1;
}
}else{
if(vY.y>0){
div = 1;
}else{
div = 2;
}
}
}else{
if(vX.y > 0){
if(vY.y > 0){
div = 0;
}else{
div = 3;
}
}else{
if(vY.y > 0){
div = 3;
}else{
div = 2;
}
}
}
int x1,y1,x2,y2;
switch(div){
case 0:
x1 = mx - VIEWWIDTH/2;
y1 = my ;//- VIEWHEIGHT/2;
x2 = mx + VIEWWIDTH/2;
y2 = my + VIEWHEIGHT/2;
break;
case 1:
x1 = mx;
y1 = my - VIEWHEIGHT/2;
x2 = mx + VIEWWIDTH/2;
y2 = my + VIEWHEIGHT/2 ;
break;
case 2:
x1 = mx - VIEWWIDTH/2;
y1 = my - VIEWHEIGHT/2;
x2 = mx + VIEWWIDTH/2;
y2 = my +1;
break;
case 3:
x1 = mx - VIEWWIDTH/2;
y1 = my - VIEWHEIGHT/2;
x2 = mx +1;
y2 = my + VIEWHEIGHT/2;
break;
}
int i,j;
for(j= y1 ;j < y2;j++)
for(i =x1;i < x2;i++){
// 点を表示
RECT rect;
int x = i*10;
int y = j*10;
rect .left = x;
rect .top = y;
rect .right = x+5;
rect .bottom= y+5;
FillRect(hdc,▭,hRedBrush);
if( (i-mx)*vX.y < (j-my)*vX.x )
if( (i-mx)*vY.y > (j-my)*vY.x ){
// 見える範囲
FillRect(hdc,▭,hGreenBrush);
}
if( ( i == mx ) && (j==my)){
// 視点の位置
FillRect(hdc,▭,hBlueBrush);
// 視野ベクトル
HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255)),oldPen;
oldPen = SelectObject(hdc,hPen);
POINT currentPos;
MoveToEx(hdc, x,y ,¤tPos;);
LineTo(hdc, x + (vX.x*10) , y + (vX.y*10) );
HPEN hPen2 = CreatePen(PS_SOLID, 1, RGB(255,255,000));
SelectObject(hdc,hPen2);
MoveToEx(hdc, x,y ,¤tPos;);
LineTo(hdc, x + (vY.x*10) , y + (vY.y*10) );
SelectObject(hdc,oldPen);
DeleteObject(hPen2);
DeleteObject(hPen);
}
}
SelectObject(hdc,oldBrush);
DeleteObject(hRedBrush);
DeleteObject(hBlueBrush);
DeleteObject(hGreenBrush);
D3Z.lpBackBuffer->ReleaseDC(hdc);
return TRUE;
}