游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1490|回复: 1

穿透显示怪像求助

[复制链接]

6

主题

20

帖子

35

积分

注册会员

Rank: 2

积分
35
QQ
发表于 2010-5-26 13:43:00 | 显示全部楼层 |阅读模式
代码如下
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-&gtresent(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;
}   

6

主题

20

帖子

35

积分

注册会员

Rank: 2

积分
35
QQ
 楼主| 发表于 2010-5-28 22:39:00 | 显示全部楼层

Re:穿透显示怪像求助

我的天纳到底是什么鬼问题啊
哥哥姐姐救救急啊
求你们了
我疯了,这什么鬼啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 11:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表