OpenGLVisual Studio 6Visual Basic 6Visual C++ 6.0MFCIntermediateDevVisual StudioWindowsC++Visual Basic
Miner3D_viewer ActiveX 控件(用于 Miner3D 游戏)






4.33/5 (6投票s)
使用 VC 结合 VB 编写 3D 游戏解决方案。
引言
上个月,我写了一篇关于 OpenGL 选择的文章(可以在本节找到)。现在您可以看到我的全部代码了!
使用代码
首先,您需要了解 MFC ActiveX 控件向导的使用方法。您可以在 这里 找到教程。
Miner3D_viewer 控件
方法
AddChar
: 绘制一个数字AddColorTile
: 绘制一个带指定颜色的立方体AddColorWireTile
: 绘制一个带指定颜色的线框立方体AddFace
: 绘制一个矩形AddPoint
: 绘制一个光点AddTile
: 绘制一个默认颜色(蓝色)的立方体AddWireTile
: 绘制一个默认颜色的线框立方体ChangeTileColor
: 更改立方体的颜色Clear All
: 清除屏幕上的所有内容GetCamDirX
: 返回相机方向的 X 维度GetCamDirY
: 返回相机方向的 Y 维度GetCamDirZ
: 返回相机方向的 Z 维度GetHandleActiveWindow
: 返回当前活动窗口的句柄GetTilePos
: 获取立方体的位置OpenTile
: 打开一个立方体Pick
: 确定屏幕上某个点对应的立方体PlayMidiFile
: 播放 MIDI 文件Refresh
: 重新绘制StopPlayMidi
: 关闭声音
属性
BackColor
: 背景颜色CamAxz
: 沿 XZ 平面的角度CamAzy
: 沿 ZY 平面的角度CamPosX
: 相机的 X 维度CamPosY
: 相机的 Y 维度CamPosZ
: 相机的 Z 维度CharRotateDegree
: 数字的旋转角度FogColor
: 雾的颜色FogDensity
: 雾的密度Interval
: 类似于计时器,但增加了屏幕刷新Light1
: 光线从上到下PickLessExact
: 选择时精度较低SeeAngle
: 可视角度SeeFarthest
: 看最远SeeNearest
: 看最近
事件
EndPlayMidi
: 结束后播放 MIDI 文件LeftButtonDown
: 点击鼠标左键时(x, y 遵循屏幕像素)RightButtonDown
: 点击鼠标右键时(x, y 遵循屏幕像素)Timer
: 类似于计时器VcKeyDown
: 类似于按键按下,但会捕获箭头键VcKeyUp
: 类似于按键抬起,但会捕获箭头键
要运行此程序,您需要通过两种方式注册此 OCX
-
- 在“运行...”中输入:regsvr32。
- 打开文件资源管理器,并将此 OCX 拖到“运行”对话框中。
(类似这样:regsvr32 d:\Miner3D_viewer.ocx)
- “回车”。
- 编译 VC 代码!
之后,您可以运行游戏或查看 VB 源代码!
现在我来解释我代码中的一些部分
CMiner3D_viewerCtrl
是您需要编写的内容!- 我制作了一个列表来保存绘制数字的方式:
MakeCharList()
。您可以将我的数字视为一个对象,并用这种方式制作它。glNewList(1,GL_COMPILE); // call this by : glCallList(1); ... // code painting here glEndList();
- 对于选择,我使用函数:
CMiner3D_viewerCtrl::pick(double x,double y, BOOL FAR* miss)
我不知道为什么 Z 维度不起作用,所以我不得不计算每个距离的平方来确定哪个对象最近,有时还会抛出“除零”异常!如果您知道原因,请告诉我!谢谢!
- 将 RGB 颜色转换为 OpenGL 颜色:您可以将 RGB
COLORREF
了解为:color = 0x00112233
- 11:蓝色分量。您可以通过 (color & 0xff0000) 获取。
- 22:绿色分量。您可以通过 (color & 0xff00) 获取。
- 33:红色分量。您可以通过 (color & 0xff) 获取。
之后,除以 255 即可获得 OpenGL 颜色!
- 如果我有时间,我会解释更多,或者您可以发送邮件至 chithien@hotpop.com!
关注点
- 我尝试编写了一个 3D 游戏,并找到了结合 VC 和 VB 的方法。我成功了!
- 我曾使用过纹理和混合函数,但我的电脑对此太慢了,所以我已经将其移除了!