|
|
接上一篇 http://bbs.gameres.com/showthread.asp?threadid=103144
这篇文章的特点是先照抄在分析,看到自己的程序能够运行了,有效果了,就有信心和动力了。但是...
额,怎么编译不了,有错误。怎么搞的。 [em5]
那个新手没犯过错误,而且文章本身也有一些错误。
我遇到的错误及修改方法
*file: undeclared identifier
GDISurface.h 中加入 #include<stdio.h>
*E:\project\battlecity\GDISurface.cpp(190) : error C2065: 'SelectPen' : undeclared identifier 将SelectPen() 改为 SelectObject()
*E:\project\battlecity\GDISurface.cpp(196) : error C2065: 'DeletePen' : undeclared identifier 将DeletePen() 改为 DeleteObject()
*E:\project\battlecity\GDISurface.cpp(190) : error C2440: 'initializing' : cannot convert from 'void *' to 'struct HPEN__ *'
将SelectObject( m_hDC, hPen ); 改为(HPEN)SelectObject( m_hDC, hPen );
*E:\project\battlecity\GDISurface.cpp(212) : error C2061: syntax error : identifier 'BltMode'
将BltMode改为SurfaceBltMode
终于编译通过啦。
咦,效果不对,没透明啊。经我反复查找发现是因为我的分辨率是32bit,改为16bit的就好了。具体原因不明,请高人指点。
这一章增加了2个重要的模块CGDIGraphicsDevice,CGDISurface
CGDISurface的作用是生成缓冲表面,一方面用来存储从文件读入的图片,并实现对图像的处理,另一方面作为显示缓冲的主表面。
这里作者使用的是GDI函数,没有使用DX,便于简化。后面我们将尝试将其替换为DX实现。对于掩码不理解的朋友可以查看动画原理。
CGDIGraphicsDevice的主要作用就是利用CGDISurface生成一个表面m_pMainSurface作为主表面,这个主表面我理解为相当于DX中的副表面。
这一章还增加了一组文件ShareData.cpp,ShareData.h
GameApp.cpp正是通过这里边的变量来使用其他模块的。这样各模块相对独立,结构清晰。便于修改和扩展。可能使用了某种设计模式(关于设计模式我也不太了解,有兴趣的朋友可以阅读《设计模式》)。那位朋友有更好的架构,不要藏着,贴出来一起学习。
不知为什么,作者不将定义直接放在ShareData.h中,而是放在ShareData.cpp中,通过extern声明。请高手指点。
这种写法有些编译器无法使用ShareData.cpp中的变量,因其作用域只在本文件内,如BC3.0。而VC却可以。不同的编译器实现规则不一样啊。
欢迎讨论 [em2] |
|