游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1225|回复: 0

学写游戏3 (读书贴,新手请进)

[复制链接]

3

主题

28

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2008-1-6 23:13:00 | 显示全部楼层 |阅读模式
接上一篇 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]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 22:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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