|
代码如下
DX8
显示图形的时候,图形背面的图形也被显示了出来,怪郁闷的,谁给帮帮忙
看下是哪里的毛病
//=====================================MAIN.CPP
#include "stdafx.h"
#include "D3DHEAD.H"
#include "math.h"
#include "vector"
#include "times.h"
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
typedef struct _USERADDRESS
{
float wx, wy, wz;
}USERADDRESS;
typedef struct _CUSTOMVERTEX
{
float x,y,z;
DWORD color;
float tu,tv;
}CUSTOMVERTEX;
const char *wn ="name";
const char *wc ="nclass";
const char *TextureFile="map.bmp";
HWND hWnd;
int MouseX,MouseY,SetMouseX,SetMouseY;
float jd,jds;
//+++++++++++++++++++++++++++++++++++++++++++add for vertex
boolean bRuning=TRUE;
boolean bDraw=FALSE;
boolean bStrip=FALSE;
D3DXMATRIX MATPROJECTION;
D3DXMATRIX MATVIEW;
D3DXMATRIX MATWORLD;
USERADDRESS Player;
void *pVertexBuffer;
LPDIRECT3DVERTEXBUFFER8 vb;
PDIRECT3DTEXTURE8 pTexture;
CUSTOMVERTEX VerTex[30000];
boolean KeepW;
boolean KeepS;
boolean KeepA;
boolean KeepD;
boolean KeepUp;
boolean KeepDown;
boolean KeepLeft;
boolean KeepRight;
D3DXVECTOR3 vecLook;
D3DXVECTOR3 vecLook90;
D3DXVECTOR3 vecJs;
D3DXVECTOR3 vecJs90;
D3DXVECTOR3 vecJsLast;
float camlong;
int debug_drawmodel=1;
//+++++++++++++++++++++++++++++++++++++++++++++
LPDIRECT3D8 D3D = NULL;
LPDIRECT3DDEVICE8 DEV = NULL;
////////////////////////////////////////////////////////////////////////////////////////////////
void Render()
{
if(DEV == NULL)
{
return;
}
DEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255)/*(tr,tg,tb)*/,1.0f,0);
DEV->BeginScene();
//++++++++++++++++++++
DEV->SetTexture(0,pTexture);
DEV->SetVertexShader(D3DFVF_CUSTOMVERTEX);
DEV->SetStreamSource(0,vb,sizeof(CUSTOMVERTEX));
//DEV->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,29990);
if(debug_drawmodel==1)
{
DEV->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,10000);
}
if(debug_drawmodel==2)
{
DEV->DrawPrimitive(D3DPT_LINESTRIP,0,10000);
}
//+++++++++++++++++++++++
DEV->EndScene();
DEV-> resent(NULL,NULL,NULL,NULL);
ValidateRect(hWnd,NULL);
}
/////////////////////////////////////////////////////////////////////////////////////////
void CleanUp()
{
if(DEV != NULL)
{
DEV->Release();
DEV = NULL;
}
if(D3D != NULL)
{
D3D->Release();
D3D = NULL;
}
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
int UserMove(float _long,int i)
{
D3DXMATRIX MV,MAXIS;
float vx,vy,vz;
if(i==2)
{
D3DXMatrixRotationY(&MV,jd*0.025f);//3.141592653/180
//MV=MY;
vx=(vecLook90.x)*(MV._11)+(vecLook90.y)*(MV._12)+(vecLook90.z)*(MV._13);
vy=(vecLook90.x)*(MV._21)+(vecLook90.y)*(MV._22)+(vecLook90.z)*(MV._23);
vz=(vecLook90.x)*(MV._31)+(vecLook90.y)*(MV._32)+(vecLook90.z)*(MV._33);
vecJs.x=(vecLook.x)*(MV._11)+(vecLook.y)*(MV._12)+(vecLook.z)*(MV._13);
vecJs.z=(vecLook.x)*(MV._31)+(vecLook.y)*(MV._32)+(vecLook.z)*(MV._33);
vecJs90.x=(vecLook90.x)*(MV._11)+(vecLook90.y)*(MV._12)+(vecLook90.z)*(MV._13);
vecJs90.z=(vecLook90.x)*(MV._31)+(vecLook90.y)*(MV._32)+(vecLook90.z)*(MV._33);
D3DXMatrixRotationAxis(&MAXIS,&D3DXVECTOR3(vx,0,vz),jds*0.025f);
D3DXMatrixMultiply(&MV,&MAXIS,&MV);
vx=(vecLook.x)*(MV._11)+(vecLook.y)*(MV._12)+(vecLook.z)*(MV._13);
vy=(vecLook.x)*(MV._21)+(vecLook.y)*(MV._22)+(vecLook.z)*(MV._23);
vz=(vecLook.x)*(MV._31)+(vecLook.y)*(MV._32)+(vecLook.z)*(MV._33);
vecJsLast.x=vx*_long;
vecJsLast.y=vy*_long;
vecJsLast.z=vz*_long;
}
D3DXMatrixLookAtLH(&MATVIEW,&D3DXVECTOR3(Player.wx+vecJsLast.x,Player.wy+vecJsLast.y,Player.wz+vecJsLast.z),
&D3DXVECTOR3(Player.wx, Player.wy, Player.wz),
&D3DXVECTOR3(0, 1,0));
DEV->SetTransform(D3DTS_VIEW,&MATVIEW);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////
int Move()
{
int i=0;
if(KeepW)
{
Player.wz=Player.wz-vecJs.z;
Player.wx=Player.wx-vecJs.x;
i=1;
//Player.wy=Player.wy-vecJs.y;
if(Player.wx>900.0f)
{
Player.wx=Player.wx-800.0f;
}
}
if(KeepS)
{
Player.wz=Player.wz+vecJs.z;
Player.wx=Player.wx+vecJs.x;
i=1;
//Player.wy=Player.wy+vecJs.y;
}
if(KeepA)
{
Player.wz=Player.wz+vecJs90.z;
Player.wx=Player.wx+vecJs90.x;
i=1;
//Player.wy=Player.wy+vecJs90.y;
//camlong=camlong+1.0f;
}
if(KeepD)
{
Player.wz=Player.wz-vecJs90.z;
Player.wx=Player.wx-vecJs90.x;
i=1;
//Player.wy=Player.wy-vecJs90.y;
//camlong=camlong-1.0f;
}
if(KeepUp)
{
if(jds>(-62.0f))
{
jds=jds-1.0f;
}
i=2;
}
if(KeepDown)
{
if(jds<62.0f)
{
jds=jds+1.0f;
}
i=2;
}
if(KeepLeft)
{
jd=jd+1.0f;
i=2;
}
if(KeepRight)
{
jd=jd-1.0f;
i=2;
}
if(i!=0)
{
UserMove(camlong,i);
}
return 0;
}
//---------------------------------------------------------------------
LRESULT WINAPI WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
bRuning=FALSE;
return 0;
break;
case WM_KEYDOWN://WM_KEYUP:
switch (wParam)
{
case VK_ESCAPE:
DestroyWindow(hWnd);
return 0;
break;
case VK_LEFT:
KeepLeft = TRUE;
return 0;
break;
case VK_RIGHT:
KeepRight = TRUE;
return 0;
break;
case VK_UP:
KeepUp = TRUE;
return 0;
break;
case VK_DOWN:
KeepDown = TRUE;
return 0;
break;
case 'W':
KeepW = TRUE;
return 0;
break;
case 'S':
KeepS = TRUE;
return 0;
break;
case 'A':
KeepA = TRUE;
return 0;
break;
case 'D':
KeepD = TRUE;
return 0;
break;
case '1':
debug_drawmodel=1;
return 0;
break;
case '2':
debug_drawmodel=2;
return 0;
break;
case 'Q':
KeepW=TRUE;
return 0;
break;
}
return 0;
break;
case WM_KEYUP:
switch (wParam)
{
case VK_LEFT:
KeepLeft = FALSE;
return 0;
break;
case VK_RIGHT:
KeepRight = FALSE;
return 0;
break;
case VK_UP:
KeepUp = FALSE;
return 0;
break;
case VK_DOWN:
KeepDown = FALSE;
return 0;
break;
case 'W':
KeepW = FALSE;
return 0;
break;
case 'S':
KeepS = FALSE;
return 0;
break;
case 'A':
KeepA = FALSE;
return 0;
break;
case 'D':
KeepD = FALSE;
return 0;
break;
}
return 0;
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
void SetupNew()
{
D3DXMATRIX oldmat;
oldmat._11=1; oldmat._12=0; oldmat._13=0; oldmat._14=0;
oldmat._21=0; oldmat._22=1; oldmat._23=0; oldmat._24=0;
oldmat._31=0; oldmat._32=0; oldmat._33=1; oldmat._34=0;
oldmat._41=10; oldmat._42=0; oldmat._43=0; oldmat._44=1;
//+++++++++
D3DXMatrixMultiply(&MATWORLD, &oldmat, &oldmat);
DEV->SetTransform(D3DTS_WORLD, &MATWORLD);
}
int MakeMatRix()
{
D3DXMatrixPerspectiveFovLH(&MATPROJECTION,D3DX_PI/2,1.0f,1.0f,100.0f);
D3DXMatrixLookAtLH(&MATVIEW,&D3DXVECTOR3(10.0f, 1.0f, 1.0f),
&D3DXVECTOR3(10.0f, 1.0f, 10.0f),
&D3DXVECTOR3(0.0f, 1.0f, 0.0f));
DEV->SetTransform(D3DTS_PROJECTION,&MATPROJECTION);
DEV->SetTransform(D3DTS_VIEW,&MATVIEW);
SetupNew();
return 0;
}
////////////////////////////////////////////////////////////////////////////////////
int InitMap(float xadd)
{
int x,y,z;
int i,k;
int t;
int s=0;
i=0;
t=0;
y=0;
float tu,tv;
for(z=0;z<30;z++)
{
for(x=0;x<50;x++)
{
for(k=0;k<2;k++)
{
if(k==0)
{
if(z!=0)
{
y=VerTex[i-99].y;
}
else
{
if(s<20)
{
y=rnd(4);
}
else
{
y=rnd(40);
}
}
}
else
{
if(s<20)
{
y=rnd(4);
}
else
{
y=rnd(40);
}
}
if(s<20)
{
s++;
}
else
{
s=0;
}
VerTex.x=x*10+xadd;
VerTex.y=y;
VerTex.z=z*10+k*10;
VerTex.color=D3DCOLOR_XRGB(255,255,255);
switch(t)
{
case 0:
tu=0.0f;
tv=1.0f;
break;
case 1:
tu=0.0f;
tv=0.0f;
break;
case 2:
tu=1.0f;
tv=1.0f;
break;
case 3:
tu=1.0f;
tv=0.0f;
break;
}
VerTex.tu=tu;
VerTex.tv=tv;
t++;
i++;
if(t>3)
{
t=0;
}
}
}
}
return 0;
}
/////////////////////////////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MouseX=400;
MouseY=400;
SetMouseX=400;
SetMouseY=400;
Player.wx=10.0f;
Player.wy=10.0f;
Player.wz=30.0f;
jd=0;
jds=0;
vecLook.x=0;
vecLook.y=0;
vecLook.z=1;
vecLook90.x=1;
vecLook90.y=0;
vecLook90.z=0;
camlong=5.0f;
InitMap(0.0f);
if(NULL!=(hWnd=initialise(&wn,&wc,WinProc,&D3D,&DEV)))
{
//++++++++++++++++add for vertex
DEV->CreateVertexBuffer(30000*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&vb);
vb->Lock(0,sizeof(VerTex),(BYTE**)&pVertexBuffer,0);
memcpy(pVertexBuffer,VerTex,sizeof(VerTex));
vb->Unlock();
//++++++++++++++++
D3DXCreateTextureFromFile(DEV,TextureFile,&pTexture);
//This is because we want to hide the back of our polygons
DEV->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
//Turn off lighting because we are specifying that our vertices have colour
DEV->SetRenderState(D3DRS_LIGHTING, FALSE);
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
}
MakeMatRix();
bDraw=TRUE;
//while(GetMessage(&msg,NULL,0,0))
while(bRuning)
{
//UpdateWindow(hWnd);
if(bDraw)
{
Render();
Move();
}
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CleanUp();
UnregisterClass(wc,GetModuleHandle(NULL));
return 0;
}
//===================================================D3DHEAD.H
#include "d3d8.h"
#include "stdio.h"
#include "d3dx8math.h"
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "d3d8.lib")
#pragma comment(lib, "d3dx8.lib")
HRESULT initD3D(HWND hWnd,LPDIRECT3D8 *lpD3D,LPDIRECT3DDEVICE8 *lpDEV)
{
LPDIRECT3D8 LD3D;
LPDIRECT3DDEVICE8 LDEV;
D3DDISPLAYMODE d3ddm;
D3DPRESENT_PARAMETERS d3dpp;
if(NULL==(LD3D = Direct3DCreate8(D3D_SDK_VERSION)))
return E_FAIL;
if(FAILED(LD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
return E_FAIL;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed= TRUE;
d3dpp.SwapEffect= D3DSWAPEFFECT_COPY_VSYNC;
d3dpp.BackBufferFormat= d3ddm.Format;
if(FAILED(LD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&LDEV)))
return E_FAIL;
*lpD3D=LD3D;
*lpDEV=LDEV;
return S_OK;
}
HWND initialise(LPCTSTR *wname,LPCTSTR *wclass,WNDPROC _WinProc,LPDIRECT3D8 *D3D,LPDIRECT3DDEVICE8 *Dev)
{
WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,_WinProc,0L,0L,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
*wclass,NULL};
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
RegisterClassEx(&wc);
HWND hWnd = CreateWindow(*wclass,*wname,
WS_OVERLAPPEDWINDOW,0,0,1024,768,
GetDesktopWindow(),NULL,wc.hInstance,NULL);
initD3D(hWnd,D3D,Dev);
return hWnd;
}
//===================================================================TIMES.H
#include <stdlib.h>
#include <stdio.h>
int i=0;
int rnd(int k)
{
int output;
srand(i);
output=rand()%k;
i++;
return output;
}
|
|