- 浏览: 962837 次
文章分类
最新评论
-
l67721363:
感谢分享,要是有各个函数性能比较就好了。
SQL优化 数据库优化 -
hanmiao:
此图片来自QQ空间,未经允许不可引用。
Hacking QQ空间
用DirectX设计游戏主角运动
用DirectX设计游戏主角运动
今天工作了一整天,就是在弄这个。DirectX的强大之处多得是,只要你肯发掘。像今天我就弄了一个让主角运动的程序,自己还制作了动画呢。画得不好请见谅啊。
程序呢,就是将sprite类简单地封装了一下,变得更加易用。但是遗憾的是,我还没有实现主角的跳跃。怎么办呢?只好再奋斗一天了。
程序是载入八个图像,然后每次显示不同的图像,这样主角的运动就显示出来啦。这就是我动画的奥秘。虽然这个类还有些成员函数是空的,但是总体来说,我对这个自己编写的类还是满意的。因为它有点继承了DIrectX库的特点,这样也比较易用。我会以这个程序为经验,下次开发出更好的程序的。
这是我的PlayerAction.h文件。
Code:
- /*---------------------------------------------------------------------------
- 蒋轶民制作E-mail:jiangcaiyang123@163.com
- 文件名:PlayerAction.h
- 作用:让主角运动的实现
- ----------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------*/
- //条件编译
- #ifndef_PLAYERACTION_H_
- #define_PLAYERACTION_H_
- //定义的宏
- #defineSPRITE_WIDTH50
- #defineSPRITE_HEIGHT50
- //将主角这个类封装起来
- classJPlayer
- {
- public:
- JPlayer():xPos(WINDOW_WIDTH*0.5f),yPos(WINDOW_HEIGHT-100),
- pPlayerSprite(0),pPlayerTexture(0)
- {spriteRect.top=0;}//默认构造函数
- ~JPlayer(){}//默认析构函数
- boolInitialize(void);//初始化主角
- boolGoLeft(void);//向左走
- boolGoRight(void);//向右走
- boolJump(void);//跳跃
- boolDisplay(void);//显示主角
- voidRelease(void);//释放空间
- private:
- floatxPos,yPos;//主角的横纵坐标的位置
- RECTspriteRect;//精灵动画的矩形框
- LPD3DXSPRITEpPlayerSprite;//主角的子图形指针
- LPDIRECT3DTEXTURE9pPlayerTexture;//主角的图像纹理指针
- };
- typedefJPlayer*LPJPLAYER;//定义主角的指针类型
- /*--------------------------------------------------------------------------*/
- //初始化主角
- boolJPlayer::Initialize(void)
- {
- //载入纹理图像并使用双线性滤波
- if(FAILED(D3DXCreateTextureFromFileEx(g_JDevice,"蘑菇(合图).png",
- 200,//我不得不手动设置。D3DPOOL_DEFAULT在纹理中起作用,但是应用在D3DXSPRITE中会产生问题。
- 100,//我不得不手动设置。D3DPOOL_DEFAULT在纹理中起作用,但是应用在D3DXSPRITE中会产生问题。
- 1,//不要创建mip-map。它在子图形动画中会抛弃像素数学计算
- D3DPOOL_DEFAULT,
- D3DFMT_UNKNOWN,
- D3DPOOL_DEFAULT,
- D3DX_DEFAULT,
- D3DX_DEFAULT,
- D3DCOLOR_XRGB(0,0,0),
- NULL,
- NULL,
- &pPlayerTexture)))
- returnfalse;
- g_JDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
- g_JDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
- //设置三角形的背面不被剔除
- g_JDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
- //创建子图形
- if(FAILED(D3DXCreateSprite(g_JDevice,&pPlayerSprite)))
- returnfalse;
- returntrue;
- }
- /*--------------------------------------------------------------------------*/
- //向左走
- boolJPlayer::GoLeft(void)
- {
- xPos-=4.0f;
- spriteRect.top=0;
- returntrue;
- }
- /*--------------------------------------------------------------------------*/
- //向右走
- boolJPlayer::GoRight(void)
- {
- xPos+=4.0f;
- spriteRect.top=50;
- returntrue;
- }
- /*--------------------------------------------------------------------------*/
- //跳跃
- boolJPlayer::Jump(void)
- {
- returntrue;
- }
- /*--------------------------------------------------------------------------*/
- //显示主角
- boolJPlayer::Display(void)
- {
- //碰撞检测
- if(xPos<0.0f)
- xPos=0.0f;
- elseif(xPos>WINDOW_WIDTH-SPRITE_WIDTH)
- xPos=WINDOW_WIDTH-SPRITE_WIDTH;
- //显示每一个子图形
- staticfloatframe=0;
- spriteRect.left=(long)floor(frame)*50;
- spriteRect.bottom=spriteRect.top+50;
- spriteRect.right=spriteRect.left+50;
- frame+=0.05f;
- if(frame>=4.0f)frame=0.0f;
- //设置D3DXVECTOR3结构体,在D3DXSPRITE::Draw函数中有应用
- D3DXVECTOR3vCenter(0.0f,0.0f,0.0f);
- D3DXVECTOR3vPosition(xPos,yPos,0.0f);
- //渲染Sprite
- pPlayerSprite->Begin(D3DXSPRITE_ALPHABLEND);//以Alpha混合形式进行渲染
- pPlayerSprite->Draw(pPlayerTexture,&spriteRect,&vCenter,&vPosition,
- D3DCOLOR_XRGB(255,255,255));
- pPlayerSprite->End();//结束渲染
- returntrue;
- }
- /*--------------------------------------------------------------------------*/
- //释放空间
- voidJPlayer::Release(void)
- {
- if(pPlayerSprite)pPlayerSprite->Release();pPlayerSprite=NULL;
- if(pPlayerTexture)pPlayerTexture->Release();pPlayerTexture=NULL;
- }
- /*--------------------------------------------------------------------------*/
- #endif
下面是我的MainFrame.h文件:
Code:
- /*---------------------------------------------------------------------------
- 蒋轶民制作E-mail:jiangcaiyang123@163.com
- 文件名:MainFrame.cpp
- 作用:设计主角移动的主框架
- ----------------------------------------------------------------------------*/
- /*--------------------------------------------------------------------------*/
- //头文件
- #include<windows.h>
- #include<d3d9.h>
- #include<d3dx9.h>
- #include<stdio.h>
- //库文件
- #pragmacomment(lib,"d3d9.lib")
- #pragmacomment(lib,"d3dx9.lib")
- //定义的宏
- #defineJCLASSNAME"优化的程序"
- #defineJCAPTION"程序演示"
- #defineFULLSCREENFALSE//全屏非全屏的标识符
- #defineSAFE_RELEASE(p)if(p)p->Release();p=NULL;
- //调整编译器设置
- #pragmawarning(disable:4100)
- #ifFULLSCREEN//全屏非全屏的设置
- #defineWINDOW_WIDTH640
- #defineWINDOW_HEIGHT480
- #defineWINDOW_STYLEWS_EX_TOPMOST|WS_POPUP|WS_VISIBLE
- #else
- #defineWINDOW_WIDTH320
- #defineWINDOW_HEIGHT320
- #defineWINDOW_STYLEWS_CAPTION|WS_SYSMENU
- #endif
- /*----------------------------------------------------------------------------*/
- //全局变量
- LPDIRECT3D9g_JD3D=NULL;//D3D结构体
- LPDIRECT3DDEVICE9g_JDevice=NULL;//D3D装置结构体
- LPD3DXFONTg_FPSFont=NULL;//指向FPS字体的指针
- RECTg_FPSFontPos={WINDOW_WIDTH-100,WINDOW_HEIGHT-15,
- WINDOW_WIDTH,WINDOW_HEIGHT};//FPS所在的矩形框
- INTg_FrameCount=0;//帧的计数器
- INTg_lastTime=0;//记录上一秒的时间
- INTg_currentTime=0;//记录当前的时间
- CHARg_FPSstr[25]={0};//记录当前帧率的字符串
- IDirect3DSurface9*g_surface=NULL;//平面的指针
- /*----------------------------------------------------------------------------*/
- //让主角运动的实现的头文件
- #include"PlayerAction.h"
- //额外的全局变量
- LPJPLAYERg_JPlayer;//包含主角这个类的指针
- /*----------------------------------------------------------------------------*/
- //函数的声明
- BOOLInitializeD3D(HWNDhWnd)
- {
- D3DDISPLAYMODEdisplayMode;
- //创建D3D对象
- g_JD3D=Direct3DCreate9(D3D_SDK_VERSION);
- if(g_JD3D==NULL)
- returnFALSE;
- //获取显示器的模式
- if(FAILED(g_JD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)))
- returnFALSE;
- //D3D显示的参数
- D3DPRESENT_PARAMETERSjd3dpp;
- ZeroMemory(&jd3dpp,sizeof(jd3dpp));
- //初始化D3DPRESENT_PARAMETERS
- jd3dpp.Windowed=!FULLSCREEN;
- jd3dpp.BackBufferWidth=WINDOW_WIDTH;
- jd3dpp.BackBufferHeight=WINDOW_HEIGHT;
- jd3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
- jd3dpp.BackBufferFormat=displayMode.Format;
- jd3dpp.EnableAutoDepthStencil=TRUE;
- jd3dpp.AutoDepthStencilFormat=D3DFMT_D16;
- //创建设备
- if(FAILED(g_JD3D->CreateDevice(D3DADAPTER_DEFAULT,
- D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &jd3dpp,&g_JDevice)))
- returnFALSE;
- //设置渲染状态
- g_JDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
- g_JDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
- //创建字体
- if(FAILED(D3DXCreateFont(g_JDevice,15,0,1,1,0,DEFAULT_CHARSET,
- OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,
- "Impact",&g_FPSFont)))returnFALSE;
- //创建离屏平面
- if(FAILED(g_JDevice->CreateOffscreenPlainSurface(WINDOW_WIDTH,WINDOW_HEIGHT,
- D3DFMT_X8R8G8B8,//平面格式
- D3DPOOL_DEFAULT,//内存池格式
- &g_surface,//保存结果的缓存
- NULL)))//保留参数
- returnFALSE;
- //载入背景平面图像
- if(FAILED(D3DXLoadSurfaceFromFile(g_surface,NULL,NULL,"背景图案.tga",
- NULL,D3DX_DEFAULT,0,NULL)))returnFALSE;
- //初始化主角
- g_JPlayer=newJPlayer;
- g_JPlayer->Initialize();
- returnTRUE;
- }
- /*----------------------------------------------------------------------------*/
- //释放所有资源
- voidReleaseMemory(void)
- {
- SAFE_RELEASE(g_JD3D);
- SAFE_RELEASE(g_JDevice);
- SAFE_RELEASE(g_FPSFont);
- SAFE_RELEASE(g_surface);
- SAFE_RELEASE(g_JPlayer);//释放JPlayer所占的内存
- }
- /*----------------------------------------------------------------------------*/
- //渲染屏幕
- voidRenderScene(void)
- {
- //计数器开始计数(以毫秒计)
- g_currentTime=GetTickCount();
- if(g_currentTime-g_lastTime>1000)
- {
- sprintf_s(g_FPSstr,25,"当前FPS:%d",g_FrameCount);
- g_lastTime=g_currentTime;
- g_FrameCount=0;
- }
- elseg_FrameCount++;
- g_JDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
- D3DCOLOR_XRGB(0,0,0),1.0f,0);//清除屏幕
- //载入背景平面图像
- IDirect3DSurface9*backbuffer=NULL;
- g_JDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,
- &backbuffer);//获取后台缓存
- g_JDevice->StretchRect(g_surface,NULL,
- backbuffer,NULL,D3DTEXF_NONE);//将后台矩形放入前景矩形
- //开始渲染
- g_JDevice->BeginScene();
- g_JPlayer->Display();//显示主角
- g_FPSFont->DrawText(NULL,g_FPSstr,-1,&g_FPSFontPos,DT_CENTER,
- D3DCOLOR_XRGB(0,0,0));//显示字体
- //结束渲染
- g_JDevice->EndScene();
- g_JDevice->Present(NULL,NULL,NULL,NULL);
- }
- /*----------------------------------------------------------------------------*/
- //回调函数,用来处理消息
- HRESULTCALLBACKMyAppProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
- {
- if(g_JPlayer==NULL)
- return(HRESULT)DefWindowProc(hWnd,msg,wParam,lParam);
- switch(msg)
- {
- caseWM_DESTROY:
- PostQuitMessage(0);break;
- caseWM_KEYDOWN:
- if(wParam==VK_ESCAPE)PostQuitMessage(0);
- if(wParam==VK_LEFT)g_JPlayer->GoLeft();
- if(wParam==VK_RIGHT)g_JPlayer->GoRight();
- break;
- caseWM_KEYUP:break;
- default:break;
- }
- return(HRESULT)DefWindowProc(hWnd,msg,wParam,lParam);
- };
- /*----------------------------------------------------------------------------*/
- //程序的入口,主函数
- INTWINAPIWinMain(HINSTANCEhInst,HINSTANCEhPrevInst,LPSTRcmd,INTshow)
- {
- //设置WindowClass结构并且注册它
- WNDCLASSEXjWndCls={sizeof(jWndCls),CS_CLASSDC,MyAppProc,0L,0L,hInst,
- NULL,LoadCursor(NULL,IDC_ARROW),0,NULL,JCLASSNAME,NULL};
- RegisterClassEx(&jWndCls);
- //设置窗口并且显示窗口
- HWNDhWnd=CreateWindow(JCLASSNAME,JCAPTION,WINDOW_STYLE,100,40,
- WINDOW_WIDTH,WINDOW_HEIGHT,GetDesktopWindow(),NULL,jWndCls.hInstance,NULL);
- if(hWnd==NULL)
- returnFALSE;
- ShowWindow(hWnd,SW_SHOWDEFAULT);
- UpdateWindow(hWnd);
- //初始化设置
- if(InitializeD3D(hWnd)==FALSE)
- returnFALSE;
- //进入消息循环
- MSGmsg;
- ZeroMemory(&msg,sizeof(msg));
- while(msg.message!=WM_QUIT)
- {
- if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else
- {
- //渲染屏幕
- RenderScene();
- }
- }
- //程序结束,释放内存所有资源
- ReleaseMemory();
- //解除窗口注册
- UnregisterClass(JCLASSNAME,jWndCls.hInstance);
- return(INT)msg.wParam;
- }
程序需要载入背景图和纹理图,分别如下:
程序的动态显示如下:
我的更多DirectX文章:
使用DirectX让进行Alpha混合的子图形移动(精灵动画)
设计DirectX游戏开头动画效果设计DirectX游戏开头画面淡入淡出的效果
怎么样?这个和我心目中的游戏还差得远呢。以后要做比这个更加强大的游戏!!!
相关推荐
DirectX特效游戏程序设计 源码 DirectX特效游戏程序设计 源码
DirectX游戏程序设计
DirectX 特效游戏程序设计 Launcher Rich Text Format
DirectX 游戏开发终极指南DirectX 游戏开发终极指南DirectX 游戏开发终极指南DirectX 游戏开发终极指南DirectX 游戏开发终极指南DirectX 游戏开发终极指南DirectX 游戏开发终极指南DirectX 游戏开发终极指南DirectX ...
DirectX特效游戏程序设计DirectX特效游戏程序设计DirectX特效游戏程序设计
这个俄罗斯方块程序编写于VC++6.0环境下,并使用DirectX加载MIDI文件作为游戏的音乐。
<<DirectX 9 3D游戏程序设计入门>>是入门必修的课程
这是DirectX特效游戏程序设计这本书的11-17 也就是这本书最关键的地方的源码。
本文主要介绍了用DirectX 9. 0进行计算机图像设计的技术,其中着重强调 了在游戏方面的应用。其中讲述了Direct3D的基本原则和一些较高级的技术。 从开发者的角度来说,DirectX是一组windows平台上的多媒体API。本文...
本文首先介绍了国内外游戏研究发展状况以及游戏引擎的发展及其重要 性。研究了图形编程接口 DirectX(DirectX9.0c)。接着对游戏引擎做了详细的 分析,引擎内核主要提供渲染...后设计开发了一个 3D 赛车游戏作为实践。
directx特效游戏程序设计源码1-4,费了一些功夫搞到的,大家不要介意啊
《DirectX 9 3D游戏设计入门》中文版
本书主要介绍如何使用DirectX 9.0开发交互式3D图形程序,重点是游戏开发。全书首先介绍了必要的数学工具,然后讲解了相关的3D概念。其他主题几乎涵盖了Direct3D中的所有基本运算,例如图元的绘制、光照、纹理、Alpha...
DirectX3D游戏源代码 DirectX3D游戏源代码 DirectX3D游戏源代码 DirectX3D游戏源代码 DirectX3D游戏源代码
[游戏开发参考书-用DirectX编写RPG游戏]. Programming.Role.Playing.Games.with.DirectX
directx特效游戏程序设计18以后的源码
用DirectX.9进行3D游戏引擎设计的介绍
DirectX 12 3D游戏开发实战
directx特效游戏程序设计11-17源码,费了些功夫搞到的,希望不要介意分数啊,对您会有帮助的
用DirectX6开发即时战略游戏.pdf