游戏开发论坛

 找回密码
 立即注册
搜索
楼主: fsfool

mir3 源代码研究

[复制链接]

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2007-9-15 16:07:00 | 显示全部楼层

第31讲:mir3地图观察器的最终解决方案



这段代码使用vc6.0编译通过,完美的解决了地图察看的问题。
#include <string>
#include <control.h>
//#include <d3d.h>
//#include <dshow.h>
#include "..\StdAfx.h"
#include "..\WindHorn\WHEngine.h"        //这个头文件中包含了d3d.h,如果上面再包含则出现二义性。
#include "..\WindHorn\WHWilImage.h"        //包含外部库函数的声明(窗口引擎类)
#include "..\Common\DblList.h"        //避免编译错误,将模板类头文件从预编译头文件中移出,vc6.0会出现内部错误!

#include "..\GFun.h"
#include "..\Define.h"

//连接时使用的外部库所在的目录,
//作为参数时要使用“\\”,作为字符串时“\”或“\\”都 可以。
#pragma comment(lib, "..\\..\\Mir3_Clint\\Lib\\WindHorn.lib")

#define WIDTH        800
#define HEIGHT        492
#define DEPTH        16
//图形主窗口对象,注意这里创建了主窗口对象,
//需要时再通过定制这个窗口对象实现需要的窗口。
CWHDXGraphicWindow                g_xMainWnd(WIDTH,HEIGHT        ,DEPTH);        //注意构造函数参数列表指定一个硬件支持的模式
CImageHandler                        g_xImage;                                                        //图像处理器
CMapHandler                                g_xMap;                                                                //地图处理器

void RenderObject(INT nLoopTime);

/*
win32程序主进程的启动代码块调用的窗口主函数
*/
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG        msg;        //用于保存从消息队列检索到的消息

//调CWHDXGraphicWindow对象的方法创建一个DX窗口
INT        h =        g_xMainWnd.Create(
                                                hInstance,                //应用程序进程句柄
                                 "Mir3 mapview ",                //主窗口标题
                                                        NULL,                //菜单
                                                        NULL,                //图标
                        _DXG_SCREENMODE_WINDOW,                //窗口模式。
                        //_DXG_SCREENMODE_FULLSCREEN,        //全屏模式
                _DXG_DEVICEMODE_PRIMARY|_DXG_DEVICEMODE_D3D|_DXG_DEVICEMODE_ZBUFFER        //主表面、D3D、Z缓冲
                );

        DWORD        dwStyle;
        dwStyle  = GetWindowStyle(g_xMainWnd.GetSafehWnd());        //取得DX图形窗口的风格
        dwStyle &= ~dwStyle;        //原始窗口风格清零
        dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_SYSMENU;
        SetWindowLong(g_xMainWnd.GetSafehWnd(), GWL_STYLE, dwStyle);        //重新设置窗口风格
        g_xMainWnd.CenterMainWindow();

        //设置主窗口显示特性
        ShowWindow(g_xMainWnd.GetSafehWnd(),
                SW_SHOW
                );

        g_xImage.LoadAllImage();                //加载所有图像库
        g_xMap.LoadMapImage(&g_xImage);        //加载指向构成地图的瓷砖图像库的指针

        //开始游戏的观察点单元坐标
        g_xMap.m_shStartViewTileX = 0;        //358察看0.map        察看238
        g_xMap.m_shStartViewTileY = 0;        //264察看0.map        察看238

        //加载指定名字的地图数据
        g_xMap.LoadMapData("zzz1");        //这里给m_wSavedMapBuffer缓冲区加载了解密后的图像数据

        //绘制地图的地面。
        WORD* pwSrc = g_xMap.m_wSavedMapBuffer;                //地图的一个视区的图像数据源缓冲区24*24个48*32的瓷砖范围

//下面的代码块可以替换g_xMainWnd.DrawWithImagePerLineClipRgn函数调用。
{
        DDSURFACEDESC2        ddsd;

        //取得后缓冲区指针
        LPDIRECTDRAWSURFACE7 pBackBuffer = g_xMainWnd.GetBackBuffer();
       
        if ( pBackBuffer != NULL )
        {
                        //初始化DD表面描述结构
                        ddsd.dwSize        = sizeof(DDSURFACEDESC2);
                        ddsd.lpSurface = NULL;
                       
                        //锁定后缓冲区表面
                        pBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
                        if ( !ddsd.lpSurface )                        return FALSE;        //锁定失败返回

                        WORD* pwdDst;
                        pwdDst = (WORD*)ddsd.lpSurface;        //使用16位指针指向后缓冲区表面,

                        //按列(按行)绘制后缓冲区表面,16位色深每次拷贝2个字节.
                        //这里(0,0) 是目标矩形的左上角,WIDTH,HEIGHT 是目标矩形的宽高,
                        //目标矩形与DD主表面必须有交集矩形
                        //注意,源缓冲区可以看成是_VIEW_CELL_X_COUNT*_CELL_WIDTH*_VIEW_CELL_Y_COUNT*_CELL_HEIGHT*16的表面,
        for (INT Y = 0 ; Y <HEIGHT; Y++)                                //目标矩形高
                for(INT X = 0; X<WIDTH;  X++)                                //目标矩形宽
                        //for (INT Y = 0 ; Y <HEIGHT; Y++)       
                                {
                                memcpy(&pwdDst[Y * (ddsd.lPitch >> 1) + X], &pwSrc[Y*_VIEW_CELL_X_COUNT*_CELL_WIDTH + X], 2);
                                }
       
                        pBackBuffer->Unlock(NULL);        //解锁
                }
        }

/*       
        g_xMainWnd.DrawWithImagePerLineClipRgn(
                        g_xMap.m_rcView.left - g_xMap.m_shViewOffsetX,        //目标矩形x
                        g_xMap.m_rcView.top - g_xMap.m_shViewOffsetY,        //目标矩形y
                        g_xMap.m_rcView.right - g_xMap.m_rcView.left,        //目标矩形宽
                        g_xMap.m_rcView.bottom - g_xMap.m_rcView.top,        //目标矩形高
                        g_xMap.m_wSavedMapBuffer,        //地图的图像数据源缓冲区
                        _CLIP_WIDTH, _CLIP_HEIGHT
                        );        //剪刀矩形宽高
        */
        g_xMainWnd.CenterMainWindow();

        DWORD dwLastTime, dwTime, dwDelay;        //用于纪录最后时间,时间,延时等数据的全局变量
        dwLastTime = dwTime = dwDelay = 0;        //初值为0

        //消息循环
        while (TRUE)
    {
        if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
        {
            if ( 0 == GetMessage(&msg, NULL, 0, 0) )
                return (int) msg.wParam;

                TranslateMessage(&msg);
            DispatchMessage(&msg);

                }
                //没有消息处理就来呈现场景,也就是将后缓冲区表面交换到主表面,若失败则重建主窗口对象的表面。
                else {
                        dwTime = timeGetTime();        //获取系统当前消息循环的滴答数
                        dwDelay = dwTime - dwLastTime;        //当前消息循环滴答数减去上一次的消息循环的滴答数为两次消息处理的延时间隔。
                        dwLastTime = dwTime;        //保存当前滴答数为最近一次消息循环的时间
                        if ( dwDelay!=0)
                                RenderObject(dwDelay);        //渲染地图上的物体

                        if( FAILED(g_xMainWnd.Present()))
                                g_xMainWnd.RestoreSurfaces();
                        }

        
        }//end while

        return msg.wParam;        //将消息参数返回给进程主代码块
}

void RenderObject(INT nLoopTime)
{
        INT         nStartX , nStartY ;
        INT  nObjFileIdx , nImgIdx , nArrayNum;
        BOOL bFocused = FALSE;
        BOOL bLongObj = FALSE;
        BOOL bBlend          = FALSE;
        BOOL bDrawShadow = TRUE;

        g_xMap.SetAniTileFrame(nLoopTime);        //设置地图上的动画帧

        // 以地图单元为单位扫描地图的可视区域
        for ( INT nXCnt = g_xMap.m_shStartViewTileX; nXCnt < g_xMap.m_shStartViewTileX + _VIEW_CELL_X_COUNT; nXCnt++ )
        {
                for ( INT nYCnt = g_xMap.m_shStartViewTileY; nYCnt < g_xMap.m_shStartViewTileY + _VIEW_CELL_Y_COUNT; nYCnt++ )
                {
                        //扫描按列进行,外循环纵向达到或超过地图边界则说明扫描完毕,应该退出循环。
                        if ( nXCnt >= g_xMap.m_stMapFileHeader.shWidth )
                                break;

                        //内循环横向达到或超过地图边界则说明横向一列扫描完毕,继续扫描下一列。
                        if ( nYCnt >= g_xMap.m_stMapFileHeader.shHeight || nXCnt < 0 || nYCnt < 0 )
                                continue;

                        //由当前二维地图单元坐标换算出一维地图单元数组的索引
                        nArrayNum = nYCnt + nXCnt*g_xMap.m_stMapFileHeader.shHeight;

                        // 渲染底层对象 ,底层对象索引文件合法。
                        if ( g_xMap.m_pstCellInfo[nArrayNum].bFileIdx2 != 255 )
                        {
                                // 底层对象索引号合法
                                if ( g_xMap.m_pstCellInfo[nArrayNum].wObj2 != 65535 )
                                {
                                        //注意如何从单元结构的bFileIdx成员计算出图像库文件的索引号,这个算法必须与对应的图像存储一致。
                                        //这里bFileIdx2的低4位是底层对象图像库文件的索引,先绘制底层对象,再绘制顶层对象。
                                        nObjFileIdx = (g_xMap.m_pstCellInfo[nArrayNum].bFileIdx2 & 0X0F);

                                        //底层图像在图像库里的索引号
                                        nImgIdx        = g_xMap.m_pstCellInfo[nArrayNum].wObj2;

                                        //图像库文件索引合法,0~2是背景瓷砖。
                                        if ( nObjFileIdx > 2 && nObjFileIdx < 14 )
                                        {
                                                //当前图像设置成功
                                                assert(nImgIdx >=0 && nImgIdx <= 0x7fffffff);
                                                if ( g_xMap.m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx) )        //有了对象文件库和图像索引就可以定位对象图像了
                                                {
                                                        //图像的宽高合乎规定
                                                        if ( g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth == 48 &&
                                                                   g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight >= 32 )
                                                        {
                                                                bBlend = FALSE;        //非混合绘制
                                                               
                                                        //        nImgIdx += g_xMap.GetDoorImgIdx(nXCnt, nYCnt);        //越过门,门由单独的代码处理
                                                               
                                                               
                                                                //底层动画
                                                                if ( g_xMap.m_pstCellInfo[nArrayNum].bObj2Ani != 255 )
                                                                {
                                                                        BYTE  bTickType;
                                                                        SHORT shAniCnt;
                                                                       
                                                                        //计算滴答类型和动画帧数
                                                                        bTickType = (g_xMap.m_pstCellInfo[nArrayNum].bObj2Ani & 0X70) >> 4;
                                                                        shAniCnt = g_xMap.m_pstCellInfo[nArrayNum].bObj2Ani & 0X0F;
                                                                       
                                                                        //计算是否混合绘制
                                                                        if ( (g_xMap.m_pstCellInfo[nArrayNum].bObj2Ani & 0X80) >> 7 )
                                                                                bBlend = TRUE;

                                                                        //得到动画图像索引并设置为当前图像
                                                                        nImgIdx += g_xMap.m_bAniTileFrame[bTickType][shAniCnt];
                                                                        assert(nImgIdx >=0 && nImgIdx <= 0x7fffffff);
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx);
                                                                }
                                               
                                                                if ( !bBlend )        //非混合绘制
                                                                {
                                                                        g_xMainWnd.DrawWithImageForCompClipRgn(
                                                                        (nXCnt-g_xMap.m_shStartViewTileX)*_CELL_WIDTH -g_xMap.m_shViewOffsetX,
                                                                        (nYCnt-g_xMap.m_shStartViewTileY)*_CELL_HEIGHT-g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-g_xMap.m_shViewOffsetY,
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
                                                                        (WORD*)g_xMap.m_pxTileImg[nObjFileIdx]->m_pbCurrImage,
                                                                        _CLIP_WIDTH, _CLIP_HEIGHT);
                                                                //        return;
                                                                }
                                                                else        //混合绘制
                                                                {
                                                                /*        g_xImage.AddTextr(_TEXTR_FILE_MAP, nObjFileIdx, nImgIdx);
                                                                        LPDIRECTDRAWSURFACE7 lpddsTextr = g_xImage.GetTextrImg(_TEXTR_FILE_MAP, nObjFileIdx, nImgIdx);

                                                                        nStartX = (nXCnt-g_xMap.m_shStartViewTileX)*_CELL_WIDTH -g_xMap.m_shViewOffsetX;
                                                                        nStartY = (nYCnt-g_xMap.m_shStartViewTileY)*_CELL_HEIGHT-g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-g_xMap.m_shViewOffsetY;

                                                                        D3DMATERIAL7 mtrl;
                                                                        D3DVECTOR        vecTrans(nStartX, nStartY, 0);
                                                                        D3DVECTOR        vecScale(g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth, g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight, 1);

                                                                        D3DUtil_InitMaterial(mtrl, (FLOAT)255/255.0f, (FLOAT)255/255.0f, (FLOAT)255/255.0f);
                                                                        mtrl.diffuse.a = 1.0f/255.0f;
                                                                        g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
                                                                        g_xImage.DrawBillBoard(g_xMainWnd.Get3DDevice(), vecTrans, vecScale, mtrl, lpddsTextr);
                                                                        */
                                                                }
                                                        }//if图像的宽高合乎规定
                                                }//if当前图像设置成功
                                        }//if图像库文件索引合法
                                }//if底层对象索引号合法
                        }//当前单元的底层图像库文件索引合法

                //渲染顶层对象
                //顶层对象库文件索引合法
                if (g_xMap.m_pstCellInfo[nArrayNum].bFileIdx1 != 255 )
                {
                        //顶层对象索引合法
                        if ( g_xMap.m_pstCellInfo[nArrayNum].wObj1 != 65535 )
                        {
                                //bFileIdx1 & 0X0F是低4位表示顶层对象图像库文件的索引
                                nObjFileIdx = (g_xMap.m_pstCellInfo[nArrayNum].bFileIdx1 & 0X0F);
                                nImgIdx                = g_xMap.m_pstCellInfo[nArrayNum].wObj1;

                                        //在规定的对象文件索引范围
                                        if ( nObjFileIdx > 2 && nObjFileIdx < 14 )
                                        {
                                                //成功设置当前图像
                                                assert(nImgIdx >=0 && nImgIdx <= 0x7fffffff);
                                                if ( g_xMap.m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx) )
                                                {
                                                        //画面尺寸符合规范
                                                        if ( g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth == 48 &&
                                                                 g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight >= 32 )
                                                        {
                                                                bBlend = FALSE;
                                                               
                                                        //        nImgIdx += g_xMap.GetDoorImgIdx(nXCnt, nYCnt);        //越过门
                                                               
                                                                //顶层动画
                                                        /*        if ( g_xMap.m_pstCellInfo[nArrayNum].bObj1Ani != 255 )
                                                                {
                                                                        BYTE  bTickType;
                                                                        SHORT shAniCnt;
                                                                       
                                                                        bTickType = (g_xMap.m_pstCellInfo[nArrayNum].bObj1Ani & 0X70) >> 4;
                                                                        shAniCnt = g_xMap.m_pstCellInfo[nArrayNum].bObj1Ani & 0X0F;        //低4位是动画帧数
                                                                       
                                                                        if ( (g_xMap.m_pstCellInfo[nArrayNum].bObj1Ani & 0X80) >> 7 )
                                                                                bBlend = TRUE;

                                                                        nImgIdx += g_xMap.m_bAniTileFrame[bTickType][shAniCnt];
                                                                        assert(nImgIdx >=0 && nImgIdx <= 0x7fffffff);
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx);
                                                                }*/
                                                               
                                                                if ( !bBlend )
                                                                        g_xMainWnd.DrawWithImageForCompClipRgn(
                                                                        (nXCnt-g_xMap.m_shStartViewTileX)*_CELL_WIDTH-g_xMap.m_shViewOffsetX,
                                                                        (nYCnt-g_xMap.m_shStartViewTileY)*_CELL_HEIGHT-g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-g_xMap.m_shViewOffsetY,
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
                                                                        (WORD*)g_xMap.m_pxTileImg[nObjFileIdx]->m_pbCurrImage,
                                                                        _CLIP_WIDTH, _CLIP_HEIGHT);
                                                                else
                                                                {
                                                                        g_xImage.AddTextr(_TEXTR_FILE_MAP, nObjFileIdx, nImgIdx);
                                                                        LPDIRECTDRAWSURFACE7 lpddsTextr = g_xImage.GetTextrImg(_TEXTR_FILE_MAP, nObjFileIdx, nImgIdx);

                                                                        nStartX = (nXCnt-g_xMap.m_shStartViewTileX)*_CELL_WIDTH -g_xMap.m_shViewOffsetX;
                                                                        nStartY = -(nYCnt-g_xMap.m_shStartViewTileY)*_CELL_HEIGHT-g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-g_xMap.m_shViewOffsetY;

                                                                        D3DMATERIAL7 mtrl;
                                                                        D3DVECTOR        vecTrans(nStartX, nStartY, 0);
                                                                        D3DVECTOR        vecScale(g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth, g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight, 1);

                                                                        D3DUtil_InitMaterial(mtrl, (FLOAT)255/255.0f, (FLOAT)255/255.0f, (FLOAT)255/255.0f);
                                                                        mtrl.diffuse.a = 1.0f/255.0f;
                                                                        g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
                                                                        g_xImage.DrawBillBoard(g_xMainWnd.Get3DDevice(), vecTrans, vecScale, mtrl, lpddsTextr);
                                                                       
                                                                }
                                                        }//画面尺寸符合规范
                                                }//成功设置当前图像
                                        }//在规定的对象文件索引范围
                                }//顶层对象索引合法
                        }//渲染顶层对象
                }//for       
        }//for

        // 48*32
/*        for (  nXCnt = g_xMap.m_shStartViewTileX; nXCnt < g_xMap.m_shStartViewTileX + _VIEW_CELL_X_COUNT; nXCnt++ )
        {
                for ( INT nYCnt = g_xMap.m_shStartViewTileY; nYCnt < g_xMap.m_shStartViewTileY + _VIEW_CELL_Y_COUNT; nYCnt++ )
                {
                        if ( nXCnt >= g_xMap.m_stMapFileHeader.shHeight )
                                break;
                        if ( nYCnt >= g_xMap.m_stMapFileHeader.shWidth || nXCnt < 0 || nYCnt < 0 )
                                continue;

                        bLongObj = FALSE;

                        nArrayNum = nYCnt + nXCnt*g_xMap.m_stMapFileHeader.shHeight;

                /*        //图像库文件索引合法
                        if ( g_xMap.m_pstCellInfo[nArrayNum].bFileIdx2 != 255 )
                        {
                                //底层对象索引合法
                                if ( g_xMap.m_pstCellInfo[nArrayNum].wObj2 != 65535 )
                                {
                                        nObjFileIdx = (g_xMap.m_pstCellInfo[nArrayNum].bFileIdx2 & 0X0F);
                                        nImgIdx        = g_xMap.m_pstCellInfo[nArrayNum].wObj2 - 1;
                                        if(nImgIdx <0)        nImgIdx = 0;
       
                                        if ( nObjFileIdx > 2 && nObjFileIdx < 14 )
                                        {
                                                assert(nImgIdx >=0 && nImgIdx <= 0x7fffffff);
                                                if ( g_xMap.m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx) )
                                                {
                                                        if ( !(g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth == 48 &&
                                                                   g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight >= 32) )
                                                        {
                                                                bBlend = FALSE;
                                                               
                                                                nImgIdx += g_xMap.GetDoorImgIdx(nXCnt, nYCnt);

                                                                //底层动画对象索引合法
                                                                if ( g_xMap.m_pstCellInfo[nArrayNum].bObj2Ani != 255 )
                                                                {
                                                                        BYTE  bTickType;
                                                                        SHORT shAniCnt;
                                                                       
                                                                        bTickType = (g_xMap.m_pstCellInfo[nArrayNum].bObj2Ani & 0X70) >> 4;
                                                                        shAniCnt = g_xMap.m_pstCellInfo[nArrayNum].bObj2Ani & 0X0F;
                                                                       
                                                                        if ( (g_xMap.m_pstCellInfo[nArrayNum].bObj2Ani & 0X80) >> 7 )
                                                                                bBlend = TRUE;

                                                                        nImgIdx += g_xMap.m_bAniTileFrame[bTickType][shAniCnt];
                                                                        assert(nImgIdx >=0 && nImgIdx <= 0x7fffffff);
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx);
                                                                }
                                                               
                                                                if ( !bBlend )
                                                                        g_xMainWnd.DrawWithImageForCompClipRgn(
                                                                        (nXCnt-g_xMap.m_shStartViewTileX)*_CELL_WIDTH-g_xMap.m_shViewOffsetX,
                                                                        (nYCnt-g_xMap.m_shStartViewTileY)*_CELL_HEIGHT-g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-g_xMap.m_shViewOffsetY,
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
                                                                        (WORD*)g_xMap.m_pxTileImg[nObjFileIdx]->m_pbCurrImage,
                                                                        _CLIP_WIDTH, _CLIP_HEIGHT);
                                                                else
                                                                {
                                                                        g_xImage.AddTextr(_TEXTR_FILE_MAP, nObjFileIdx, nImgIdx);
                                                                        LPDIRECTDRAWSURFACE7 lpddsTextr = g_xImage.GetTextrImg(_TEXTR_FILE_MAP, nObjFileIdx, nImgIdx);

                                                                        nStartX = (nXCnt-g_xMap.m_shStartViewTileX)*_CELL_WIDTH -g_xMap.m_shViewOffsetX+g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shPX;
                                                                        nStartY = (nYCnt-g_xMap.m_shStartViewTileY)*_CELL_HEIGHT-g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-g_xMap.m_shViewOffsetY+g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shPY;

                                                                        D3DMATERIAL7 mtrl;
                                                                        D3DVECTOR        vecTrans(nStartX, nStartY, 0);
                                                                        D3DVECTOR        vecScale(g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth, g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight, 1);

                                                                        D3DUtil_InitMaterial(mtrl, (FLOAT)255/255.0f, (FLOAT)255/255.0f, (FLOAT)255/255.0f);
                                                                        mtrl.diffuse.a = 0.0f/255.0f;
                                                                        g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
                                                                        g_xImage.DrawBillBoard(g_xMainWnd.Get3DDevice(), vecTrans, vecScale, mtrl, lpddsTextr);
                                                                       
                                                                }
       
                                                                bLongObj = TRUE;
                                                        }
                                                }
                                        }
                                }

                                //顶层对象索引合法
                                if ( g_xMap.m_pstCellInfo[nArrayNum].wObj1 != 65535 )
                                {
                                        nObjFileIdx = (g_xMap.m_pstCellInfo[nArrayNum].bFileIdx1 & 0X0F);
                                        nImgIdx                = g_xMap.m_pstCellInfo[nArrayNum].wObj1 - 1;
                                        if(nImgIdx<0)                nImgIdx = 0;

                                        if ( nObjFileIdx > 2 && nObjFileIdx < 14 )
                                        {
                                                assert(nImgIdx >=0 && nImgIdx <= 0x7fffffff);
                                                if ( g_xMap.m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx) )
                                                {
                                                        if ( !(g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth == 48 &&
                                                                 g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight >= 32) )
                                                        {
                                                                bBlend = FALSE;
                                                               
                                                                nImgIdx += g_xMap.GetDoorImgIdx(nXCnt, nYCnt);

                                                                //顶层动画索引合法
                                                                if ( g_xMap.m_pstCellInfo[nArrayNum].bObj1Ani != 255 )
                                                                {
                                                                        BYTE  bTickType;
                                                                        SHORT shAniCnt;
                                                                       
                                                                        bTickType = (g_xMap.m_pstCellInfo[nArrayNum].bObj1Ani & 0X70) >> 4;
                                                                        shAniCnt = g_xMap.m_pstCellInfo[nArrayNum].bObj1Ani & 0X0F;
                                                                       
                                                                        if ( (g_xMap.m_pstCellInfo[nArrayNum].bObj1Ani & 0X80) >> 7 )
                                                                                bBlend = TRUE;

                                                                        nImgIdx += g_xMap.m_bAniTileFrame[bTickType][shAniCnt];
                                                                        assert(nImgIdx >=0 && nImgIdx <= 0x7fffffff);
                                                                        g_xMap.m_pxTileImg[nObjFileIdx]->NewSetIndex(nImgIdx);
                                                                }

                                                                if ( !bBlend )
                                                                        g_xMainWnd.DrawWithImageForCompClipRgn(
                                                                                                (nXCnt-g_xMap.m_shStartViewTileX)*_CELL_WIDTH -g_xMap.m_shViewOffsetX,
                                                                                                (nYCnt-g_xMap.m_shStartViewTileY)*_CELL_HEIGHT-g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-g_xMap.m_shViewOffsetY,
                                                                                                g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth,
                                                                                                g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight,
                                                                                                (WORD*)g_xMap.m_pxTileImg[nObjFileIdx]->m_pbCurrImage,
                                                                                                _CLIP_WIDTH, _CLIP_HEIGHT);
                                                                else
                                                                {
                                                                        g_xImage.AddTextr(_TEXTR_FILE_MAP, nObjFileIdx, nImgIdx);
                                                                        LPDIRECTDRAWSURFACE7 lpddsTextr = g_xImage.GetTextrImg(_TEXTR_FILE_MAP, nObjFileIdx, nImgIdx);

                                                                        nStartX = (nXCnt-g_xMap.m_shStartViewTileX)*_CELL_WIDTH-g_xMap.m_shViewOffsetX;
                                                                        nStartY = -(nYCnt-g_xMap.m_shStartViewTileY)*_CELL_HEIGHT-g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight+_CELL_HEIGHT-g_xMap.m_shViewOffsetY;
       
                                                                        D3DMATERIAL7 mtrl;
                                                                        D3DVECTOR        vecTrans(nStartX, nStartY, 0);
                                                                        D3DVECTOR        vecScale(g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shWidth, g_xMap.m_pxTileImg[nObjFileIdx]->m_lpstNewCurrWilImageInfo->shHeight, 1);

                                                                        D3DUtil_InitMaterial(mtrl, (FLOAT)255/255.0f, (FLOAT)255/255.0f, (FLOAT)255/255.0f);
                                                                        mtrl.diffuse.a = 1.0f/255.0f;
                                                                        g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
                                                                        g_xImage.DrawBillBoard(g_xMainWnd.Get3DDevice(), vecTrans, vecScale, mtrl, lpddsTextr);
                                                                       
                                                                }
                                                               
                                                                   bLongObj = TRUE;
                                                        }
                                                }
                                        }
                                }
                        }
                        */
                       
                //绘制开门
        /*        g_xMap.DrawOpenDoor(nXCnt, nYCnt);

                        INT         nMapViewX                = 0;
                        INT         nMapViewY                = 0;
                        BOOL bIsMapViewTime = FALSE;
                        if ( nXCnt >= g_xMap.m_shStartViewTileX && nXCnt < g_xMap.m_shStartViewTileX + _VIEW_CELL_X_COUNT &&
                                 nYCnt >= g_xMap.m_shStartViewTileY && nYCnt < g_xMap.m_shStartViewTileY + _VIEW_CELL_Y_COUNT )
                        {
                                bIsMapViewTime = TRUE;
                                nMapViewX = nXCnt - g_xMap.m_shStartViewTileX;
                                nMapViewY = nYCnt - g_xMap.m_shStartViewTileY;
                        }
       
                }        //for
        }        //for*/
}

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
发表于 2007-9-16 10:23:00 | 显示全部楼层

Re:mir3 源代码研究

bFileIdx1 bFileIdx2从哪里来的啊????

18

主题

631

帖子

660

积分

高级会员

Rank: 4

积分
660
发表于 2007-9-16 17:00:00 | 显示全部楼层

Re:mir3 源代码研究

源代码哪里有下?

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2007-10-28 17:03:00 | 显示全部楼层

第32讲 有一个真的游戏c++程序员吗?



奇怪的是,我上面已经毫无保留的提供了在vc6.0下编译通过的MIR3的地图察看器的源码,任何一个熟练使用vc的正牌程序员应该都可以将该贴中的代码拷贝回去后顺利编译、验证!当然编译器是需要正确设置环境的。有人只是一个劲地向我要源码,想想吧,给你源码有什么用呢?你还是编译不了的,因为你根本不是一个国际标准下专业意义上的程序员,更是对vc6.0半通不通,给你源码有什么用呢?你肯定会对我说你精通更高级的版本的,我现在还谈vc6.0太土了的,没办法,我在威美达上海公司的同事们至今都是用的vc6.0,操作系统有一半使用的是98,另一半使用xp,编程时使用汇编和vc6.0,而且几乎不使用MFC,您知道是为什么吗?所以我的感觉是:
这个论坛并没有一个真的游戏c++程序员吗?

8

主题

390

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-10-28 18:36:00 | 显示全部楼层

Re:mir3 源代码研究

楼上的兄弟,知道mfc是啥不?

3

主题

13

帖子

17

积分

新手上路

Rank: 1

积分
17
QQ
发表于 2007-10-29 07:58:00 | 显示全部楼层

Re:mir3 源代码研究

感觉LZ是个愤世嫉俗者,或者去中国化者,或者····表面上专注于技术,实则漂浮。邪恶的狼路过····

3

主题

13

帖子

17

积分

新手上路

Rank: 1

积分
17
QQ
发表于 2007-10-29 07:59:00 | 显示全部楼层

Re:mir3 源代码研究

可以参考传奇的技术,但是,游戏创意····

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2007-10-31 14:27:00 | 显示全部楼层

第33讲 学而时习之,不亦乐乎?



使用 sdk + dx9 + C++ 编制游戏软件
Delph中的VCL BCB中的VCL 以及VC++中的MFC ,还有ATL,ms Net等等都是为一般的对效率和定制特性没有太高要求的软件而设计的快速应用库,大规模多人游戏世界对效率的要求是永远无止境的,因而上面的这些库在严肃的游戏程序设计中是不使用的(当然在打草稿时偶尔还是用一下的)。原因一是这些框架类往往给一个特定的游戏程序引入了太多不必要的累缀物,增加了太多的间接性,从而大大影响了效率;二是这些库庞大而复杂,不可避免有错误存在,这样在开发过程中的查错会变成一种灾乱,往往学习使用这些库和这些库给查找错误带来的困难抵消了使用这些库给我们的时间上的节约带来的好处还有余;三是使用这些库的结果使我们远离编程艺术而变成一些库代码开发商的解释使用工具,在库框架的约束下不可能有什么高程度的创意或定制。微软的核心级工程师从来不使用什么库,至今还是在dos6.0下编制c程序,这是因为唯如此才能体会到程序设计的本质的自在之物!
另外说一句,如果你使用我上面提到的 sdk + dx9 + C++ 的组合在windows下编程,也要注意不要使用dx中的dxp、 dxi、dxs等等垃圾库,在游戏编程中一切相信自己,尽量从底层做起,这才是专业的游戏编程方法。
一般就是 sdk + dx9 + C++

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2007-11-1 13:22:00 | 显示全部楼层

第34讲 mir3中数据库的常见问题的解决



在mir3源代码的调试过程中,经常会遇到一些莫名其妙的问题,我发现有很多都是因为SQL数据库中的表格不匹配引起的,比如一些表格中存在一些完全重复的纪录,这会导致客户端黑屏!解决的办法很简单,我现在公布如下,希望对您有帮助:
/* **************************************************************************
当一个表中存在若干行完全一样的纪录时,这时修改某一行就会出现"键列信息不足或不正确。影响更多行"的错误信息,
解决办法是将所有重复的行删去,仅仅保留一个无重复行的表。
举例:例如LEGENDOFMIR3 中的某个表出现上述问题,按如下操作:
企业管理器->点选SQL服务器->点选LEGENDOFMIR3 数据库->点选企业管理器菜单里的"工具" ->点选SQL查询分析器
打开查询分析器后粘贴以下语句,哪个表有这个问题,就将脚本中的表名字替换为有问题的表即可以了。
   *************************************************************************** */
USE LEGENDOFMIR3
GO

select distinct * into #temp from TBL_MOVEMAPEVENT
truncate table TBL_MOVEMAPEVENT
insert TBL_MOVEMAPEVENT select * from #temp
drop table #temp

go

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2007-11-2 13:49:00 | 显示全部楼层

第35讲 我将公布一组MIR3源码调试的图像



为了使同仁对MIR3源码调试情况有一个直观的映像,我决定将一些初期MIR3源码调试的图像公布在下面的各讲之中。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-25 08:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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