2024年2月8日发(作者:)
学习资料收集于网络,仅供参考
用VB和TV3D从零开始轻松制作3D游戏教程 第一章 熟悉vb和tv3d
(2011-12-25 23:07:17)
转载
前言
版权所有,转载请注明出处。
大家好,我是Reity。
这次终于开始做3d游戏的教程了。很多人都以为3d游戏的制作要比2d游戏复杂的多,其实呢,如果知道了制作方法,3d游戏反而比2d游戏的制作花费的精力少。3d本身就是一种视觉效果,即使美工很差,给人的感觉也会比2d的要优越。如果一个游戏含有很多人物动作,3d游戏只需要一个蒙皮的人物模型,然后就可以按照自己的设计拖拽出任意的动作,而2d游戏则需要把每一帧的人物造型全部画出来。比如拳皇这种格斗游戏,每个人物都需要几百张动作图呢。废话不多说了,总之,我希望通过我的教程,能够让你发现制作3d游戏原来如此简单。好了,我们开始吧。
第一章
熟悉vb和tv3d
Vb就是Visualbasic,是一种可视化的基础编程语言。为什么用vb呢?因为它简单嘛,学得快的人几个小时就能学会。有人说我只会C++,没关系,原理都是相通的,你学vb只会更快。有人说,我不会vb怎么办?既然是从零开始的教程,我自然已经考虑到了这个问题。既然只是做游戏,又不是制作应用软件,所以我们只需要知道几个常用的命令就可以了。下面列出来就是vb在游戏制作中常用的命令,有vb基础的同学可以直接跳过这里了。
1、
变量:用来储存数据或文字
常用的变量类型
Long 整数
Single 浮点,也就是有小数点的数
String 文字
实际上制作游戏只需要用到这3种类型,甚至连long都可用single代替。
举例:
dim aaa as single
Aaa=100
就是定义了一个名为aaa的小数变量,且aaa的值为100
2、
条件命令
格式:
If 条件 then
结果
Else
没达到条件的结果
End if
举例:if aaa=100 then
aaa= aaa+1
End if
当条件a=100时,运行结果aaa=aaa+1,这样aaa的值就变为101了。
3、
重复命令For next
格式:
dim i as long
for i= 1 to 重复次数
重复内容
学习资料
学习资料收集于网络,仅供参考
Next
举例:
for i=1 to 10
aaa=aaa+1
next
也就是把aaa+1重复10次,这样也就相当于是aaa+10了
这里顺便提一个命令
格式:
Do
重复内容
Loop until 条件
这个就是无限循环了,不达到条件是不会停止的,这个游戏中只有主循环才会用一次,所以大家知道一下就可以了。
4、
随机函数 rnd*最大范围
游戏中会用到很多的随机事件,实际上,世界上根本就没有随机,我们是不知道原理或者不想去细致的讨论全部因素才会用随机来代替。比如敌方的子弹射过来,子弹的路径之所以不同,主要是由枪的后座力、稳定性,子弹的规整度,风力、空气密度,敌人的瞄准能力、反应能力、手臂肌肉强度,以及敌人在射击的一瞬间的心理活动……总之,我们不想,也没必要去考虑这些问题,所以在游戏中干脆就把敌人的命中率设为30%就ok啦。
代码如下,你可以好好研究下
Dim aaa as long
Aaa=rnd*100
If aaa<=30 then
命中
Else
没命中
End if
基本就是这么几个常用的东西啦,只要熟练掌握这几个命令,简单的游戏都可以做了。不过我还是建议你能系统的自学一下vb,这样会更熟悉Vb一些。
我们把这几个命令用猜数字的游戏实际应用一下,这是代码,直接全部替换到vb的窗口代码中。里面有些命令我们是用不到的,所以不需要记住。“’”符号后面的内容是注释,不影响代码。
Option Explicit '这条语句是表示所用到的变量必须先定义,建议每次开头都加上这条语句,养成好习惯。
Private Sub Form_Load()
Dim a As Long
Dim b As Long '定义a,b两个整数型变量
Randomize Time '这个语句是让每次的随机值都不一样,如果不加,你测试的时候会发现,每次随机的值都是一样的,但是生成exe以后不会,所以只用于测试。
b = Int(Rnd * 99) + 1 'rnd是随机函数,游戏中非常常用,大家记住Int(Rnd * 99)这条语句是随机取0—98共99个整数,而我们要1—99的数,所以后边要加1。
Do’循环
a = InputBox("请猜一个数,此数为1-99之间。") '这条语句是让你输入一个数然后储存到变量a中。
If a = b Then 'a=b自然就是猜对了
MsgBox "猜对了!"
End '然后结束程序
学习资料
学习资料收集于网络,仅供参考
End If
If a > b Then MsgBox "大了" 'if语句写在一行之内可以省去结尾的end if
If a < b Then MsgBox "小了"
Loop
End Sub
也许有人会问了,vb不是效率很低么?不是很多人都认为vb不能制作大型游戏么?
我要说的是,直接用vb来制作游戏,确实效率很低,这本没有错。这样就必须引出vb亲密的伙伴tv3d了。Tv3d全名TrueVision3D,是美国的一款免费的商业3d游戏引擎。其实tv3d也支持c++,Delphi等编程语言,只不过你学习别的编程语言至少也要1个月。Tv3d是以微软发布的dx作为底层,也就是运行效率和vb没有多少关系,vb只需要调用tv3d命令和一些表层数据的计算就可以了,其余的包括渲染,碰撞都是由tv3d完成,所以制作大型游戏完全没有问题,而且tv3d的效率还是相当高的。
Tv3d的官方网站是
6.3版本下载(特点,直接支持cs的bsp地图,以及mdl骨骼动画,并且附带很多基础的教程和例子)
/downloads/?go=2&file=16&mirror=23
6.5版本下载(特点,拥有更强大的特效,如水面反射、动态阴影、泛光、物理引擎等。支持win7)
/downloads/?file=28
我要教大家的就是6.5版本,一个更加高效率,更强大特效的版本。
之前的6.3版本使用的人已经很多了,也有很多人制作出了很棒的游戏。比如《梦幻战争》系列,这可是一个人制作的哦。
学习资料
学习资料收集于网络,仅供参考
但是用6.5制作的游戏确不多见,主要原因就是因为例子和教程比较少,所以希望我的教程能够填补这一空白,使大家对6.5能有个进一步的了解。我们也来看看6.5强大的特效。
学习资料
学习资料收集于网络,仅供参考
学习资料
学习资料收集于网络,仅供参考
好,我们下载完成后安装,然后打开vb,点上面菜单中的工程,然后点引用。注意这是很重要的一步,如图,把tv3d的dll引用了,点确定,这样才能让vb能够调用tv3d。
学习资料
学习资料收集于网络,仅供参考
像往常一样,我们先来个helloworld吧,来做我们的第一个tv3d程序。
下面是全部代码,直接复制替换即可,运行后我们会看到一个旋转的白色茶壶。看出来了么?这可是3D的哦,可不是那种不入流的2D了,我们已经步入了3D时代。
Option Explicit
Dim Tv As New TVEngine '调用tv3d所必需的
Dim Scene As New TVScene '调用tv3d所必需的
Dim Mesh As TVMesh '定义一个网格物体
Private Sub Form_Load()
'显示当前窗口,每次都加上错不了
3DWindowed '用窗口模式启动tv3d
Set Mesh = MeshBuilder '网格物体初始化,必加
学习资料
学习资料收集于网络,仅供参考
Teapot '建立一个茶壶
ition 0, 0, 3 '设定物体的位置坐标
Do '主循环
'清屏
Y 0.001 '沿y轴以0.001每帧的速度转动
'渲染茶壶
ToScreen '把所得最终结果渲染到屏幕
DoEvents '这句是把线程空出来,使其他的的程序能运行,必加
Loop
End Sub
用VB和TV3D轻松制作3D游戏教程2 灯光材质贴图
(2011-12-26 14:33:47)
转载
第二章
灯光材质贴图
在上一章里,看到的白色茶壶就是没有任何材质贴图的物体,我们要让它好看,就必须加入材质贴图和灯光。
首先加入贴图吧,就以这张名为贴图为例,大家可以把图片保存到程序目录并改名。
首先我们要添加一个tv3d的贴图库
Dim TF As New TVTextureFactory '添加一个贴图库
然后要指定图片的读取目录
rchDirectory '设定贴图读取目录为当前目录
把贴图读取到贴图库
xture "", "pic" '读取名为的贴图,并命名为pic
为了能更好的展示贴图,我们把模型换为球体,其他相关代码如下:
Sphere 1 '建立一个半径为1的球
学习资料
学习资料收集于网络,仅供参考
ture GetTex("pic") '赋予物体pic贴图
运行一下
这样就ok了,很简答吧,一共也就4-5行代码。
有光照效果才能更真实,我们要给它加上光照,而要让光照的效果发生作用就必须要有材质。
同理,和添加贴图一样,先添加库。
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
然后设置材质,相关代码:
Material "solid" '建立名为solid的材质
ient GetMat("solid"), 0, 0, 0, 1 '环境光
fuse GetMat("solid"), 1, 1, 1, 1 '扩散光,即物体的固有颜色
ssive GetMat("solid"), 0, 0, 0, 0 '自发光
city GetMat("solid"), 1 '不透明度
cular GetMat("solid"), 1, 1, 1, 1 '高光色
er GetMat("solid"), 60 '散射强度
然后把材质赋予物体
erial GetMat("solid") '赋予物体solid材质
这样材质就完成了
添加灯光就更简单了
灯光有三种,分别是平行光、点光源、聚光灯。
平行光就是全场景只有一个方向的光,如果我们的游戏是在室外场景,就应该采用平行光。
建立平行光:DirectionalLight Vector(平行光的方向向量), r, g, b,灯的名字 , 高光范围
其中向量不懂的话可以百度,也可以等高中学习了立体几何自然就懂了。Rgb是灯光的红绿蓝三色的比例,可以取0-1的值。
点光源,就像我们室内的白炽灯,光线是从一个点向外扩散出去的,用在室内效果比较好。
建立点光源:PointLight vector(光源位置坐标),r,g,b, 半径,名字,高光
聚光灯:就像探照灯那样,光线路径是一个圆锥,cs中的手电筒就是用聚光灯做的。
建立聚光灯:SpotLight Vector(位置), Vector(方向), r, g, b, 半径, 光锥衰减外角, 光锥衰减内角, 名字, 高光
学习资料
学习资料收集于网络,仅供参考
我们一般做游戏就用平行光好了,所以这里只建立一个平行光,名字如果不需要调用是可以空着的。
DirectionalLight Vector(1, -1, 1), 1, 1, 1, , 1 '添加一个平行光
同时,我们可以把灯光的高光打开。
cularLighting True '高光开关
然后让光对物体起作用
htingMode TV_LIGHTING_NORMAL’这个最常用的灯光模式
还有另外两种常用的灯光模式
htingMode TV_LIGHTING_NONE’就是灯光对物体不起作用
htingMode TV_LIGHTING_BUMPMAPPING_TANGENTSPACE’这种模式是为法线贴图准备的效果更精细些,但是速度较慢。
好了一切完成,全部代码如下,我们测试一下。为了能让大家看得更清楚,我加了一个垂直同步的语句,目的是为了把刷新频率降下来,和屏幕的刷新频率一致。不然在我的电脑上,每秒钟刷新的频率是8000帧,太浪费cpu了。
Option Explicit
Dim Tv As New TVEngine '调用tv3d所必需的
Dim Scene As New TVScene '调用tv3d所必需的
Dim Mesh As TVMesh '添加一个网格物体
Dim TF As New TVTextureFactory '添加一个贴图库
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
Private Sub Form_Load()
'显示当前窗口,每次都加上错不了
rchDirectory '设定贴图读取目录为当前目录
nc True '垂直同步开关
3DWindowed '用窗口模式启动tv3d
xture "", "pic" '读取名为的贴图,并命名为pic
学习资料
学习资料收集于网络,仅供参考
Material "solid" '建立名为solid的材质
ient GetMat("solid"), 0, 0, 0, 1 '环境光
fuse GetMat("solid"), 1, 1, 1, 1 '扩散光,即物体的固有颜色
ssive GetMat("solid"), 0, 0, 0, 1 '自发光
city GetMat("solid"), 1 '不透明度
cular GetMat("solid"), 1, 1, 1, 1 '高光色
er GetMat("solid"), 60 '散射强度
DirectionalLight Vector(1, -1, 1), 1, 1, 1, , 1 '添加一个平行光
cularLighting True '高光开关
Set Mesh = MeshBuilder '网格物体初始化,必加
Sphere 1 '建立一个半径为1的球
ture GetTex("pic") '赋予物体pic贴图
ition 0, 0, 3 '设定物体的位置坐标
erial GetMat("solid") '赋予物体solid材质
htingMode TV_LIGHTING_NORMAL '这个最常用的灯光模式
Do '主循环
'清屏
Y 0.01 '沿y轴以0.01每帧的速度转动
'渲染茶壶
ToScreen '把所得最终结果渲染到屏幕
DoEvents '这句是把线程空出来,使其他的的程序能运行,必加
Loop
End Sub
接下来我们可以自己做一些调试,我会先领着大家做一些简单的调试,但是以后就需要大家自己去调试了。拿到一段代码,你可能不了解它具体的原理,但是你可以修改修改里面的数据,看看什么发生了变化,自然就知道它究竟是干什么的了。要想自学编程就需要这种探究精神,不然你绝对学不好。
学习资料
学习资料收集于网络,仅供参考
比如光照模式改为 TV_LIGHTING_BUMPMAPPING_TANGENTSPACE
er GetMat("solid"), 5 '散射强度设为5
ssive GetMat("solid"), 1, 0, 0, 1 '自发光设为红色
DirectionalLight Vector(1, -1, 1), 0, 0, 1, , 1 '将光源的颜色变为蓝色
另外修改不透明度不会起作用,这个等我们学习高阶教程,渲染半透明物体时,我再详细给大家讲。
学习资料
学习资料收集于网络,仅供参考
用VB和TV3D轻松制作3D游戏教程3 按键检测
(2011-12-28 11:13:57)
转载
第三章 按键检测系统与自由观看
在设计任何3d游戏之前,我们必须要先设计一个能自由观看全部场景的程序,这样才能随时调试、发现问题。
先学按键检测吧。
首先添加一个按键检测库。
dim Inp As New TVInputEngine
然后需要在主循环之前初始化一下。
lize
这样按键检测就启动了,检测的方法如下:
If ressed(按键代码) then 按下后的结果
例:在主循环中加入代码
If ressed(TV_KEY_W) Then MsgBox ("按了W")
运行,按w是不是会出现窗口了?就这么简单。
关于高阶自定义按键以及全部按键代码的对应表请在此贴中找,这里不再重复。
/s/blog_
会了按键我们再学鼠标检测。
鼠标检测分为连续鼠标检测和绝对鼠标检测,一种检测的是每帧的鼠标坐标变化值,一种检测的是当前鼠标所在的坐标。
游戏中我们通常用第一种,第二种在我们开始介绍ui的制作时再详细介绍。
先定义一些变量:
Dim Mx As Long, My As Long, B1 As Boolean, B2 As Boolean, Roll As Long '接收鼠标信息
Mx为x(横)方向上的变化量,My为y(纵)方向上的变化量,B1为检测鼠标左键,B2为检测鼠标右键键,Roll为鼠标滚轮的变化量。这里遇到了Boolean型变量,我们只需要知道他只有真假两个值就行了,只能做开关。
然后在主循环中加入检测代码就可以了
seState Mx, My, B1, B2, , , Roll '接收鼠标信息
准备工作已完成,开始自由观看和移动的代码。
从现在开始,我们要统一单位了,只有统一了单位,做出的东西才不会乱,不会出现有些东西很大,有些东西很小的问题。鉴于大家做的宏观游戏比较多,一般场景都大于是 10米,所以我们规定1单位=1米,养成好习惯很重要。另外为了照顾下低学历的人,我们采用角度制:leSystem TV_ANGLE_DEGREE
定义:
学习资料
学习资料收集于网络,仅供参考
Dim Camera As New TVCamera '定义一个摄像机,相当于人的眼睛
Dim CameraPozX As Single, CameraPozY As Single, CameraPozZ As Single '摄像机位置坐标
Dim CameraAngX As Single, CameraAngY As Single '摄像机角度
另外我要说一下,在tv3d的坐标系中,xz是垂直于电脑屏幕的面,y轴是竖直的,这点和我们所学的立体几何略有不同。
检测代码:
CameraAngX = CameraAngX - 0.1 * Mx
CameraAngY = CameraAngY - 0.1 * My
'限制范围
If CameraAngY > 90 Then CameraAngY = 90
If CameraAngY < -90 Then CameraAngY = -90
If ressed(TV_KEY_Q) Then CameraPozY = CameraPozY + 0.1
If ressed(TV_KEY_E) Then CameraPozY = CameraPozY - 0.1
If ressed(TV_KEY_W) Then CameraPozX = CameraPozX + 0.1
If ressed(TV_KEY_S) Then CameraPozX = CameraPozX - 0.1
If ressed(TV_KEY_A) Then CameraPozZ = CameraPozZ + 0.1
If ressed(TV_KEY_D) Then CameraPozZ = CameraPozZ - 0.1
最后把坐标传递给摄像机
ation CameraAngY, CameraAngX, 0
ition CameraPozX, CameraPozY, CameraPozZ
这样就完成了,为了能看的更清楚,我们加一个地面 floor,增加地面的语句就不用学了,反正没什么用。
全部代码如下:
Option Explicit
Dim Tv As New TVEngine '调用tv3d所必需的
学习资料
学习资料收集于网络,仅供参考
Dim Scene As New TVScene '调用tv3d所必需的
Dim Mesh As TVMesh '添加一个网格物体
Dim Inp As New TVInputEngine
Dim TF As New TVTextureFactory '添加一个贴图库
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
Dim Mx As Long, My As Long, B1 As Boolean, B2 As Boolean, Roll As Long '接收鼠标信息
Dim Camera As New TVCamera '定义一个摄像机,相当于人的眼睛
Dim CameraPozX As Single, CameraPozY As Single, CameraPozZ As Single '摄像机位置坐标
Dim CameraAngX As Single, CameraAngY As Single '摄像机角度
Dim Floor As TVMesh '添加一个网格物体
Private Sub Form_Load()
'显示当前窗口,每次都加上错不了
rchDirectory '设定贴图读取目录为当前目录
nc True '垂直同步开关
3DWindowed '用窗口模式启动tv3d
lize
leSystem TV_ANGLE_DEGREE
xture "", "pic" '读取名为的贴图,并命名为pic
Material "solid" '建立名为solid的材质
ient GetMat("solid"), 0, 0, 0, 1 '环境光
fuse GetMat("solid"), 1, 1, 1, 1 '扩散光,即物体的固有颜色
ssive GetMat("solid"), 0, 0, 0, 1 '自发光
city GetMat("solid"), 1 '不透明度
cular GetMat("solid"), 1, 1, 1, 1 '高光色
er GetMat("solid"), 60 '散射强度
学习资料
学习资料收集于网络,仅供参考
DirectionalLight Vector(1, -1, 1), 1, 1, 1, , 1 '添加一个平行光
cularLighting True '高光开关
Set Floor = MeshBuilder '网格物体初始化,必加
or 0, -10, -10, 10, 10, -1
Set Mesh = MeshBuilder '网格物体初始化,必加
Sphere 1 '建立一个半径为1的球
ture GetTex("pic") '赋予物体pic贴图
ition 0, 0, 3 '设定物体的位置坐标
erial GetMat("solid") '赋予物体solid材质
htingMode TV_LIGHTING_NORMAL '这个最常用的灯光模式
Do '主循环
'清屏
seState Mx, My, B1, B2, , , Roll '接收鼠标信息
CameraAngX = CameraAngX - 0.1 * Mx
CameraAngY = CameraAngY - 0.1 * My
'限制范围
If CameraAngY > 90 Then CameraAngY = 90
If CameraAngY < -90 Then CameraAngY = -90
If ressed(TV_KEY_Q) Then CameraPozY = CameraPozY + 0.1
If ressed(TV_KEY_E) Then CameraPozY = CameraPozY - 0.1
If ressed(TV_KEY_W) Then CameraPozZ = CameraPozZ + 0.1
If ressed(TV_KEY_S) Then CameraPozZ = CameraPozZ - 0.1
If ressed(TV_KEY_A) Then CameraPozX = CameraPozX + 0.1
If ressed(TV_KEY_D) Then CameraPozX = CameraPozX - 0.1
'设定摄像机
ation CameraAngY, CameraAngX, 0
ition CameraPozX, CameraPozY, CameraPozZ
Y 0.5 '沿y轴以0.5°每帧的速度转动
学习资料
学习资料收集于网络,仅供参考
'渲染茶壶
'渲染地面
ToScreen '把所得最终结果渲染到屏幕
DoEvents '这句是把线程空出来,使其他的的程序能运行,必加
Loop
End Sub
运行后用鼠标可以自由查看,按键盘qe控制上下,wsad控制平面移动。
当然,这只是简单的控制,在初级篇中,我的计划是能做出个类似CS的游戏就算完成,其他的东西等进阶篇再去研究。
用VB和TV3D轻松制作3D游戏教程4 天空与大气
转载
(2011-12-28 15:01:42)
第4章 天空与大气系统
直到现在为止,我们的背景都是黑色的,很难看。
但是我一直觉得,我们游戏制作者在我们的游戏里面就是真正的上帝。我们说要有光,光就出现了;我们说要有天空,天空就出现;我们说要有山有水,山水就出现了;我们说还要有人,人就出现了,结果人的AI这个模块出了Bug,不能让人类出现在伊甸园这个地图中,至于后来的事,大家都知道了——
没错,上帝从某种意义上来讲,就是个程序员。
好,这一章我们就来学习,造天。
学习资料
学习资料收集于网络,仅供参考
在3d游戏中,主要就是天空盒和天空球两种,而且摄像机就在其中。天空球更真实些,类似而球幕影院,而且可以让这个球根据时间不停旋转体现出昼夜的变化,但是贴图的绘制较麻烦。如果有美工支持的可以尝试,和天空盒原理差不多,不多做讲解,这里主要讲天空盒。
天空盒原理简单,而且素材很多,网上一找一大堆,而且效果很好。
首先准备天空盒的贴图,6张图片放入程序目录。
学习资料
学习资料收集于网络,仅供参考
学习资料
学习资料收集于网络,仅供参考
学习资料
学习资料收集于网络,仅供参考
学习资料
学习资料收集于网络,仅供参考
学习资料
学习资料收集于网络,仅供参考
先添加大气系统:
Dim Atmos As New TVAtmosphere '添加大气系统
读取图片:
xture "", "SKYBOX_Back" '读取天空背景
xture "", "SKYBOX_Front"
xture "", "SKYBOX_Left"
xture "", "SKYBOX_Right"
xture "", "SKYBOX_Up"
xture "", "SKYBOX_DOWN"
_Enable True '开启天空盒
_SetTexture GetTex("SKYBOX_Front"), GetTex("SKYBOX_Back"), GetTex("SKYBOX_Left"), GetTex("SKYBOX_Right"), GetTex("SKYBOX_Up"),
GetTex("SKYBOX_DOWN") '设定贴图
然后在渲染的位置加上就可以了:
here_Render '渲染大气
运行一下试试:
学习资料
学习资料收集于网络,仅供参考
我们还可以加点迷雾效果代码如下:
_Enable True '开启雾
_SetColor 1, 0, 0 '颜色RGBA,例如红
_SetParameters 1, 20, 0 '最近距离,最远距离,浓度
_SetType TV_FOG_LINEAR, TV_FOGTYPE_PIXEL '雾的类型
如果让雾不影响天空,可以在渲染天空时时把雾关掉。
动态云得代码如下,没什么用,有兴趣的可以研究下。
'///////////建立云
_Enable True
_Create 1, 200, 200'云层数,范围
学习资料
学习资料收集于网络,仅供参考
_SetLayerParameters 0, 200, GetTex("clouds"), 3, 3’设置高度,贴图等
_SetLayerAnimation 0, True, 0.01, 0.01'设定移动速度
全部代码如下:
Option Explicit
Dim Tv As New TVEngine '调用tv3d所必需的
Dim Scene As New TVScene '调用tv3d所必需的
Dim Mesh As TVMesh '添加一个网格物体
Dim Inp As New TVInputEngine
Dim TF As New TVTextureFactory '添加一个贴图库
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
Dim Mx As Long, My As Long, B1 As Boolean, B2 As Boolean, Roll As Long '接收鼠标信息
Dim Camera As New TVCamera '定义一个摄像机,相当于人的眼睛
Dim CameraPozX As Single, CameraPozY As Single, CameraPozZ As Single '摄像机位置坐标
Dim CameraAngX As Single, CameraAngY As Single '摄像机角度
Dim Floor As TVMesh '添加一个网格物体
Dim Atmos As New TVAtmosphere '添加大气系统
Private Sub Form_Load()
'显示当前窗口,每次都加上错不了
rchDirectory '设定贴图读取目录为当前目录
nc True '垂直同步开关
3DWindowed '用窗口模式启动tv3d
lize
leSystem TV_ANGLE_DEGREE
xture "", "pic" '读取名为的贴图,并命名为pic
xture "", "SKYBOX_Back" '读取天空背景
xture "", "SKYBOX_Front"
xture "", "SKYBOX_Left"
xture "", "SKYBOX_Right"
xture "", "SKYBOX_Up"
xture "", "SKYBOX_DOWN"
_Enable True '开启天空盒
_SetTexture GetTex("SKYBOX_Front"), GetTex("SKYBOX_Back"), GetTex("SKYBOX_Left"), GetTex("SKYBOX_Right"), GetTex("SKYBOX_Up"),
GetTex("SKYBOX_DOWN") '设定贴图
_Enable True '开启雾
_SetColor 1, 0, 0 '颜色RGBA,例如红
学习资料
学习资料收集于网络,仅供参考
_SetParameters 1, 20, 0 '最近距离,最远距离,浓度
_SetType TV_FOG_LINEAR, TV_FOGTYPE_PIXEL '雾的类型
Material "solid" '建立名为solid的材质
ient GetMat("solid"), 0, 0, 0, 1 '环境光
fuse GetMat("solid"), 1, 1, 1, 1 '扩散光,即物体的固有颜色
ssive GetMat("solid"), 0, 0, 0, 1 '自发光
city GetMat("solid"), 1 '不透明度
cular GetMat("solid"), 1, 1, 1, 1 '高光色
er GetMat("solid"), 60 '散射强度
DirectionalLight Vector(1, -1, 1), 1, 1, 1, , 1 '添加一个平行光
cularLighting True '高光开关
Set Floor = MeshBuilder '网格物体初始化,必加
or 0, -10, -10, 10, 10, -1
Set Mesh = MeshBuilder '网格物体初始化,必加
Sphere 1 '建立一个半径为1的球
ture GetTex("pic") '赋予物体pic贴图
ition 0, 0, 3 '设定物体的位置坐标
erial GetMat("solid") '赋予物体solid材质
htingMode TV_LIGHTING_NORMAL '这个最常用的灯光模式
Do '主循环
seState Mx, My, B1, B2, , , Roll '接收鼠标信息
CameraAngX = CameraAngX - 0.1 * Mx
CameraAngY = CameraAngY - 0.1 * My
'限制范围
If CameraAngY > 90 Then CameraAngY = 90
If CameraAngY < -90 Then CameraAngY = -90
If ressed(TV_KEY_Q) Then CameraPozY = CameraPozY + 0.1
If ressed(TV_KEY_E) Then CameraPozY = CameraPozY - 0.1
If ressed(TV_KEY_W) Then CameraPozZ = CameraPozZ + 0.1
If ressed(TV_KEY_S) Then CameraPozZ = CameraPozZ - 0.1
If ressed(TV_KEY_A) Then CameraPozX = CameraPozX + 0.1
学习资料
学习资料收集于网络,仅供参考
If ressed(TV_KEY_D) Then CameraPozX = CameraPozX - 0.1
'设定摄像机
ation CameraAngY, CameraAngX, 0
ition CameraPozX, CameraPozY, CameraPozZ
Y 0.5 '沿y轴以0.5°每帧的速度转动
'清屏
_Enable False
here_Render '渲染大气
_Enable True
'渲染球体
'渲染地面
ToScreen '把所得最终结果渲染到屏幕
DoEvents '这句是把线程空出来,使其他的的程序能运行,必加
Loop
End Sub
用VB和TV3D轻松制作3D游戏教程5 场景的制作与读取
(2011-12-28 17:53:34)
转载
第5章 场景的制作与读取
一般3d游戏的场景都是用3dmax制作的,如果你会再好不过,如果不会也可以自学一点,至少能够使用现成模型也好。网上的场景模型还是很多的,我就随便用3dmax做了个场景示范一下。
模型做好后要导出成tv3d支持的格式,6.5中将场景格式统一加密成后缀为tvm的文件,将带动作的模型统一加密成后缀为tva的文件。你可以导出成3ds格式然后再用modelconverter进行转化,也可以用导出插件直接导出成tvm格式。
1、导出成3ds格式就不说了,导出后运行6.5目录下的
如果无法打开,说明你的电脑没装net framework,下载安装即可,这也是我为什么不喜欢用.net编程的原因,现在装了net framework的电脑还是少数,而且它的体积还如此之大,很不方便。
点右边的Browse,选择刚才的3ds文件,如图配置即可。
学习资料
学习资料收集于网络,仅供参考
2、6.5目录下,plugins文件夹下有各个软件的导出插件。
比如你用3dmax8,就把plugins3dsmax 8.0目录下的放到3dmax目录下的plugins文件夹中即可。
另外还需要把6.5的拷贝到3dmax的根目录下
然后就可以导出tvm,tva格式了,导出tvm如下设置即可。
学习资料
学习资料收集于网络,仅供参考
由于需要观看场景了,所以我们还是把窗口弄大些,比如把窗口的height值设为9480,width值设为12120.基本上这就是800*600像素的大小。
读取的代码:
M ""
最后别忘了渲染。
不过我们还是改用All True了,因为这样就全部都渲染了,省的忘记。
效果如图,如果需要例子中的场景可以到/file/beliibw8#下载,解压放在游戏目录中:
全部代码如下:
Option Explicit
Dim Tv As New TVEngine '调用tv3d所必需的
Dim Scene As New TVScene '调用tv3d所必需的
Dim Mesh As TVMesh '添加一个网格物体
Dim Inp As New TVInputEngine
Dim TF As New TVTextureFactory '添加一个贴图库
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
Dim Mx As Long, My As Long, B1 As Boolean, B2 As Boolean, Roll As Long '接收鼠标信息
Dim Camera As New TVCamera '定义一个摄像机,相当于人的眼睛
Dim CameraPozX As Single, CameraPozY As Single, CameraPozZ As Single '摄像机位置坐标
Dim CameraAngX As Single, CameraAngY As Single '摄像机角度
Dim Atmos As New TVAtmosphere '添加大气系统
Private Sub Form_Load()
学习资料
学习资料收集于网络,仅供参考
'显示当前窗口,每次都加上错不了
ugFile & ""
ugMode True, True
rchDirectory '设定贴图读取目录为当前目录
nc True '垂直同步开关
3DWindowed '用窗口模式启动tv3d
lize
leSystem TV_ANGLE_DEGREE
wFrustum 45, 20000 '可视范围200米 100单位=1米
xture "", "pic" '读取名为的贴图,并命名为pic
xture "", "SKYBOX_Back" '读取天空背景
xture "", "SKYBOX_Front"
xture "", "SKYBOX_Left"
xture "", "SKYBOX_Right"
xture "", "SKYBOX_Up"
xture "", "SKYBOX_DOWN"
_Enable True '开启天空盒
_SetTexture GetTex("SKYBOX_Front"), GetTex("SKYBOX_Back"), GetTex("SKYBOX_Left"), GetTex("SKYBOX_Right"), GetTex("SKYBOX_Up"),
GetTex("SKYBOX_DOWN") '设定贴图
_Enable True '开启雾
_SetColor 1, 1, 1 '颜色RGBA,例如红
_SetParameters 10, 60, 0 '最近距离,最远距离,浓度
_SetType TV_FOG_LINEAR, TV_FOGTYPE_PIXEL '雾的类型
Material "solid" '建立名为solid的材质
ient GetMat("solid"), 0.1, 0.1, 0.1, 1 '环境光
fuse GetMat("solid"), 1, 1, 1, 1 '扩散光,即物体的固有颜色
ssive GetMat("solid"), 0, 0, 0, 1 '自发光
city GetMat("solid"), 1 '不透明度
cular GetMat("solid"), 1, 1, 1, 1 '高光色
er GetMat("solid"), 60 '散射强度
DirectionalLight Vector(1, -1, 1), 1, 1, 1, , 1 '添加一个平行光
cularLighting True '高光开关
Set Mesh = MeshBuilder '网格物体初始化,必加
学习资料
学习资料收集于网络,仅供参考
M "", True, True
htingMode TV_LIGHTING_NORMAL
erial GetMat("solid")
Do '主循环
seState Mx, My, B1, B2, , , Roll '接收鼠标信息
CameraAngX = CameraAngX - 0.1 * Mx
CameraAngY = CameraAngY - 0.1 * My
'限制范围
If CameraAngY > 90 Then CameraAngY = 90
If CameraAngY < -90 Then CameraAngY = -90
If ressed(TV_KEY_Q) Then CameraPozY = CameraPozY + 0.1
If ressed(TV_KEY_E) Then CameraPozY = CameraPozY - 0.1
If ressed(TV_KEY_W) Then CameraPozZ = CameraPozZ + 0.1
If ressed(TV_KEY_S) Then CameraPozZ = CameraPozZ - 0.1
If ressed(TV_KEY_A) Then CameraPozX = CameraPozX + 0.1
If ressed(TV_KEY_D) Then CameraPozX = CameraPozX - 0.1
'设定摄像机
ation CameraAngY, CameraAngX, 0
ition CameraPozX, CameraPozY, CameraPozZ
'清屏
_Enable False
here_Render '渲染大气
_Enable True
All True
ToScreen '把所得最终结果渲染到屏幕
DoEvents '这句是把线程空出来,使其他的的程序能运行,必加
Loop
End Sub
用VB和TV3D6.5轻松制作3D游戏教程6 简单的碰撞检测
(2011-12-29 16:37:26)
转载
继续用上一章的代码。
学习资料
学习资料收集于网络,仅供参考
碰撞检测算是3d游戏中比较常用的,但是也是最消耗cpu的。
既然我们要模拟CS,就先把CS的第一人称行动方式模拟出来。
第一人称移动涉及到了三角函数的知识,如果会算的固然好,不会的直接复制代码即可。
vb中的三角函数采用弧度制,而我们采用角度制,为了计算方便,我们采用tv3d的数学运算库来进行转换。
Dim Math As New TVMathLibrary '添加tv3d数学运算库
第一人称运动相关代码:
If ressed(TV_KEY_W) Then '前
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX - 90)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX - 90)) * 0.2
End If
If ressed(TV_KEY_S) Then '后
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX + 90)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX + 90)) * 0.2
End If
If ressed(TV_KEY_A) Then '左
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX + 180)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX + 180)) * 0.2
End If
If ressed(TV_KEY_D) Then '右
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX)) * 0.2
End If
另外人本身也是有高度的,一般第一人称游戏都是把摄像机高度定义为人眼睛的高度。
CameraPozY = 1.7 '人眼的高度,1.7米
看着很复杂,其实很简单。2Rad就是把角度制转为弧度制,0.2就是每帧移动距离。学过三角函数的做个图就知道怎么算了,初中毕业应该都会了。
碰撞检测后一般都是恢复上一次的坐标,这样可以保证不会穿墙。
所以要定义旧坐标:
Dim CameraPozXOld As Single, CameraPozYOld As Single, CameraPozZOld As Single '摄像机上一帧位置坐标
碰撞检测部分代码:
if ion(旧坐标, 当前坐标 ) then
碰撞结果
else
未碰撞结果
end if
最后的全部代码如下,基本上你可以在这个地图中自由行走了。
学习资料
学习资料收集于网络,仅供参考
Option Explicit
Dim Tv As New TVEngine '调用tv3d所必需的
Dim Scene As New TVScene '调用tv3d所必需的
Dim Mesh As TVMesh '添加一个网格物体
Dim Inp As New TVInputEngine
Dim TF As New TVTextureFactory '添加一个贴图库
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
Dim Mx As Long, My As Long, B1 As Boolean, B2 As Boolean, Roll As Long '接收鼠标信息
Dim Camera As New TVCamera '定义一个摄像机,相当于人的眼睛
Dim CameraPozX As Single, CameraPozY As Single, CameraPozZ As Single '摄像机位置坐标
Dim CameraAngX As Single, CameraAngY As Single '摄像机角度
Dim Atmos As New TVAtmosphere '添加大气系统
Dim Math As New TVMathLibrary '添加tv3d数学运算库
Dim CameraPozXOld As Single, CameraPozYOld As Single, CameraPozZOld As Single '摄像机上一帧位置坐标
Private Sub Form_Load()
'显示当前窗口,每次都加上错不了
ugFile & ""
ugMode True, True
rchDirectory '设定贴图读取目录为当前目录
nc True '垂直同步开关
3DWindowed '用窗口模式启动tv3d
lize
leSystem TV_ANGLE_DEGREE
wFrustum 45, 20000 '可视范围200米 100单位=1米
xture "", "pic" '读取名为的贴图,并命名为pic
xture "", "SKYBOX_Back" '读取天空背景
xture "", "SKYBOX_Front"
xture "", "SKYBOX_Left"
xture "", "SKYBOX_Right"
xture "", "SKYBOX_Up"
xture "", "SKYBOX_DOWN"
_Enable True '开启天空盒
_SetTexture GetTex("SKYBOX_Front"), GetTex("SKYBOX_Back"), GetTex("SKYBOX_Left"), GetTex("SKYBOX_Right"), GetTex("SKYBOX_Up"),
GetTex("SKYBOX_DOWN") '设定贴图
学习资料
学习资料收集于网络,仅供参考
_Enable True '开启雾
_SetColor 1, 1, 1 '颜色RGBA,例如红
_SetParameters 10, 60, 0 '最近距离,最远距离,浓度
_SetType TV_FOG_LINEAR, TV_FOGTYPE_PIXEL '雾的类型
Material "solid" '建立名为solid的材质
ient GetMat("solid"), 0.1, 0.1, 0.1, 1 '环境光
fuse GetMat("solid"), 1, 1, 1, 1 '扩散光,即物体的固有颜色
ssive GetMat("solid"), 0, 0, 0, 1 '自发光
city GetMat("solid"), 1 '不透明度
cular GetMat("solid"), 1, 1, 1, 1 '高光色
er GetMat("solid"), 60 '散射强度
DirectionalLight Vector(1, -1, 1), 1, 1, 1, , 1 '添加一个平行光
cularLighting True '高光开关
Set Mesh = MeshBuilder '网格物体初始化,必加
M "", True, True
htingMode TV_LIGHTING_NORMAL
erial GetMat("solid")
CameraPozY = 1.7 '人眼的高度,1.7米
CameraPozYOld = CameraPozY
Do '主循环
seState Mx, My, B1, B2, , , Roll '接收鼠标信息
CameraAngX = CameraAngX + 0.1 * Mx
CameraAngY = CameraAngY + 0.1 * My
'限制范围
If CameraAngY > 90 Then CameraAngY = 90
If CameraAngY < -90 Then CameraAngY = -90
If ressed(TV_KEY_W) Then '前
学习资料
学习资料收集于网络,仅供参考
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX - 90)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX - 90)) * 0.2
End If
If ressed(TV_KEY_S) Then '后
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX + 90)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX + 90)) * 0.2
End If
If ressed(TV_KEY_A) Then '左
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX + 180)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX + 180)) * 0.2
End If
If ressed(TV_KEY_D) Then '右
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX)) * 0.2
End If
If ion(Vector(CameraPozXOld, CameraPozYOld, CameraPozZOld), Vector(CameraPozX, CameraPozY, CameraPozZ)) Then '碰撞检测
'如果碰撞恢复上一帧坐标
CameraPozX = CameraPozXOld
CameraPozY = CameraPozYOld
CameraPozZ = CameraPozZOld
Else
'没碰撞则更新坐标
CameraPozXOld = CameraPozX
CameraPozYOld = CameraPozY
CameraPozZOld = CameraPozZ
End If
'设定摄像机
ation CameraAngY, CameraAngX, 0
ition CameraPozX, CameraPozY, CameraPozZ
'清屏
_Enable False
here_Render '渲染大气
_Enable True
学习资料
学习资料收集于网络,仅供参考
All True
ToScreen '把所得最终结果渲染到屏幕
DoEvents '这句是把线程空出来,使其他的的程序能运行,必加
Loop
End Sub
用VB和TV3D6.5轻松制作3D游戏教程7 角色动作
(2011-12-30 12:41:35)
转载
tv3d6.5虽然不能直接读取mdl格式的模型,但是可以通过附带的modelconverter把mdl转换成tv3d6.5的专用格式tva.
转换完以后,把tva文件和贴图都考入到程序目录。
然后就是读取角色了,代码如下:
Dim Enemy As New TVActor '添加一个角色
Set Enemy = Actor '角色初始化
A ("") '读取橘色
erial GetMat("solid") '设定材质
htingMode TV_LIGHTING_NORMAL '设定光照模式
le 0.025, 0.025, 0.025 '设定大小,因为cs模型是40单位=1米,所以我们把模型缩小40倍
ition 0, 1, 0 '设定模型位置
我们可以用附带的 modelview来查看模型,这样就能知道模型都有什么动作了。
学习资料
学习资料收集于网络,仅供参考
让人物模型做指定动作的代码如下:
学习资料
学习资料收集于网络,仅供参考
mationByName ("idle1") '执行的动作名称
imation 1 '播放动作速度
果然非常简答吧,运行效果如图:
然后让敌人拿上武器,我们添加一个武器模型:
Dim EnemyGun As TVMesh '添加一个武器
Set EnemyGun = MeshBuilder '网格物体初始化,必加
M "", True, True '读取地图
htingMode TV_LIGHTING_NORMAL
erial GetMat("solid")
le 0.025, 0.025, 0.025 '设定大小,因为cs模型是40单位=1米,所以我们把模型缩小40倍
然后把武器绑定到敌人的手里,放在主循环中:
rix eMatrix(eID("Bip01 R Hand"))
这条代码就是把武器的矩阵设为敌人名为"Bip01 R Hand"的骨骼矩阵,也就是绑定到了右手上。
Y -90
Z -90
学习资料
学习资料收集于网络,仅供参考
lative 0.2, -1.2, 0.17
然后再进行位置的微调,保证确实在敌人手中。运行如图。
然后当然我们自己也要拿上枪。
Dim Weapon As New TVActor '添加一个手型
Set EnemyGun = MeshBuilder '网格物体初始化,必加
M "", True, True '读取地图
htingMode TV_LIGHTING_NORMAL
学习资料
学习资料收集于网络,仅供参考
erial GetMat("solid")
le 0.025, 0.025, 0.025 '设定大小
'武器位置设定
ition CameraPozX, CameraPozY, CameraPozZ
ation 0, CameraAngX + 90, CameraAngY
全部代码如下,效果如图
Option Explicit
Dim Tv As New TVEngine '调用tv3d所必需的
Dim Scene As New TVScene '调用tv3d所必需的
Dim Mesh As TVMesh '添加一个网格物体
Dim Inp As New TVInputEngine
Dim TF As New TVTextureFactory '添加一个贴图库
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
Dim Mx As Long, My As Long, B1 As Boolean, B2 As Boolean, Roll As Long '接收鼠标信息
Dim Camera As New TVCamera '定义一个摄像机,相当于人的眼睛
Dim CameraPozX As Single, CameraPozY As Single, CameraPozZ As Single '摄像机位置坐标
Dim CameraAngX As Single, CameraAngY As Single '摄像机角度
Dim Atmos As New TVAtmosphere '添加大气系统
Dim Math As New TVMathLibrary '添加tv3d数学运算库
Dim CameraPozXOld As Single, CameraPozYOld As Single, CameraPozZOld As Single '摄像机上一帧位置坐标
Dim Enemy As New TVActor '添加一个角色
Dim EnemyGun As TVMesh '添加一个武器
Dim Weapon As New TVActor '添加一个手型
Private Sub Form_Load()
'显示当前窗口,每次都加上错不了
ugFile & ""
ugMode True, True
rchDirectory '设定贴图读取目录为当前目录
nc True '垂直同步开关
3DWindowed '用窗口模式启动tv3d
lize
leSystem TV_ANGLE_DEGREE
wFrustum 45, 0 '可视范围无限,1单位=1米,可视角度45
xture "", "pic" '读取名为的贴图,并命名为pic
xture "", "SKYBOX_Back" '读取天空背景
学习资料
学习资料收集于网络,仅供参考
xture "", "SKYBOX_Front"
xture "", "SKYBOX_Left"
xture "", "SKYBOX_Right"
xture "", "SKYBOX_Up"
xture "", "SKYBOX_DOWN"
_Enable True '开启天空盒
_SetTexture GetTex("SKYBOX_Front"), GetTex("SKYBOX_Back"), GetTex("SKYBOX_Left"), GetTex("SKYBOX_Right"), GetTex("SKYBOX_Up"),
GetTex("SKYBOX_DOWN") '设定贴图
_Enable True '开启雾
_SetColor 1, 1, 1 '颜色RGBA,例如红
_SetParameters 10, 60, 0 '最近距离,最远距离,浓度
_SetType TV_FOG_LINEAR, TV_FOGTYPE_PIXEL '雾的类型
Material "solid" '建立名为solid的材质
ient GetMat("solid"), 0.1, 0.1, 0.1, 1 '环境光
fuse GetMat("solid"), 1, 1, 1, 1 '扩散光,即物体的固有颜色
ssive GetMat("solid"), 0, 0, 0, 1 '自发光
city GetMat("solid"), 1 '不透明度
cular GetMat("solid"), 0, 0, 0, 0 '高光色
er GetMat("solid"), 60 '散射强度
DirectionalLight Vector(1, -1, 1), 1, 1, 1, , 1 '添加一个平行光
cularLighting True '高光开关
Set Mesh = MeshBuilder '网格物体初始化,必加
M "", True, True '读取地图
htingMode TV_LIGHTING_NORMAL
erial GetMat("solid")
Set Enemy = Actor '角色初始化
A ("") '读取橘色
erial GetMat("solid") '设定材质
htingMode TV_LIGHTING_NORMAL '设定光照模式
le 0.025, 0.025, 0.025 '设定大小,因为cs模型是40单位=1米,所以我们把模型缩小40倍
ition 0, 1, 0 '设定模型位置
mationByName ("idle1") '执行的动作名称
imation 1 '播放动作速度
学习资料
学习资料收集于网络,仅供参考
Set Weapon = Actor '角色初始化
A ("") '读取橘色
erial GetMat("solid") '设定材质
htingMode TV_LIGHTING_NORMAL '设定光照模式
mationByName ("idle1") '执行的动作名称
imation 1 '播放动作速度
le 0.1, 0.1, 0.1 '设定大小,因为cs模型是40单位=1米,所以我们把模型缩小40倍
Set EnemyGun = MeshBuilder '网格物体初始化,必加
M "", True, True '读取地图
htingMode TV_LIGHTING_NORMAL
erial GetMat("solid")
le 0.025, 0.025, 0.025 '设定大小
CameraPozY = 1.7 '人眼的高度,1.7米
CameraPozYOld = CameraPozY
Do '主循环
seState Mx, My, B1, B2, , , Roll '接收鼠标信息
CameraAngX = CameraAngX + 0.1 * Mx
CameraAngY = CameraAngY + 0.1 * My
'限制范围
If CameraAngY > 90 Then CameraAngY = 90
If CameraAngY < -90 Then CameraAngY = -90
If ressed(TV_KEY_W) Then '前
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX - 90)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX - 90)) * 0.2
End If
If ressed(TV_KEY_S) Then '后
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX + 90)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX + 90)) * 0.2
End If
If ressed(TV_KEY_A) Then '左
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX + 180)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX + 180)) * 0.2
End If
学习资料
学习资料收集于网络,仅供参考
If ressed(TV_KEY_D) Then '右
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX)) * 0.2
End If
If ion(Vector(CameraPozXOld, CameraPozYOld, CameraPozZOld), Vector(CameraPozX, CameraPozY, CameraPozZ)) Then '碰撞检测
'如果碰撞恢复上一帧坐标
CameraPozX = CameraPozXOld
CameraPozY = CameraPozYOld
CameraPozZ = CameraPozZOld
Else
'没碰撞则更新坐标
CameraPozXOld = CameraPozX
CameraPozYOld = CameraPozY
CameraPozZOld = CameraPozZ
End If
'设定摄像机
ation CameraAngY, CameraAngX, 0
ition CameraPozX, CameraPozY, CameraPozZ
'武器位置设定
ition CameraPozX, CameraPozY, CameraPozZ
ation 0, CameraAngX + 90, CameraAngY
rix eMatrix(eID("Bip01 R Hand")) '绑定到手
Y -90
Z -90
lative 0.2, -1.2, 0.17
'清屏
_Enable False
here_Render '渲染大气
_Enable True
All True
ToScreen '把所得最终结果渲染到屏幕
DoEvents '这句是把线程空出来,使其他的的程序能运行,必加
Loop
学习资料
学习资料收集于网络,仅供参考
End Sub
用VB和TV3D6.5轻松制作3D游戏教程8 计时器与2d绘图
(2011-12-30 16:22:34)
转载
一些新手做游戏总喜欢用timer控件来做计时器,用控件来做游戏不是什么好习惯,应该摒弃,因为控件所占的cpu和内存会很多。
其实,计时器的原理很简单,就是通过apsed获得每一帧所经过的时间,然后定义一个变量将其累加,当达到所需要的时间是,就执行操作就可以了。
下面,我们就以开枪后要停止一段时间才能继续下一发为例来介绍。
Dim WeaponState As Long '武器状态0静止,1开枪
Dim FireInterval As Long '武器停顿时间计时器
定义1个计时器,只需要1行,很简单。
If WeaponState = 0 Then '静止状态
学习资料
学习资料收集于网络,仅供参考
If B1 <> 0 Then '开枪
'
mationByName "shoot1" '播放开枪动画
WeaponState = 1 '设为开枪状态
End If
Else '开枪状态
If FireInterval < 200 Then '当计时器小于200毫秒时
FireInterval = FireInterval + apsed '计时累加
Else '到了200毫秒时变为停止状态
FireInterval = 0
WeaponState = 0
mationByName "idle1"
End If
End If
这样就完成了。
开枪应该有枪火,我们这里用到了2d绘图,会了2d绘图以后,用tv3d也可以做2d游戏了,只不过就是杀鸡用牛刀了。
Dim Scr As New TVScreen2DImmediate '2d处理库
xture "", "flash", , , TV_COLORKEY_USE_ALPHA_CHANNEL '读取带透明通道的贴图
我们把模型的渲染分开来,这样方便控制。
If FireInterval > 0 And FireInterval < 100 Then
_Sprite GetTex("flash"), 530, 330’
End If
全部代码如下:
Option Explicit
Dim Tv As New TVEngine '调用tv3d所必需的
Dim Scene As New TVScene '调用tv3d所必需的
Dim Mesh As TVMesh '添加一个网格物体
Dim Inp As New TVInputEngine
Dim TF As New TVTextureFactory '添加一个贴图库
Dim MF As New TVMaterialFactory ''添加一个材质库
Dim LE As New TVLightEngine '添加一个灯光库
Dim Mx As Long, My As Long, B1 As Boolean, B2 As Boolean, Roll As Long '接收鼠标信息
Dim Camera As New TVCamera '定义一个摄像机,相当于人的眼睛
Dim CameraPozX As Single, CameraPozY As Single, CameraPozZ As Single '摄像机位置坐标
Dim CameraAngX As Single, CameraAngY As Single '摄像机角度
学习资料
学习资料收集于网络,仅供参考
Dim Atmos As New TVAtmosphere '添加大气系统
Dim Math As New TVMathLibrary '添加tv3d数学运算库
Dim CameraPozXOld As Single, CameraPozYOld As Single, CameraPozZOld As Single '摄像机上一帧位置坐标
Dim Enemy As New TVActor '添加一个角色
Dim EnemyGun As TVMesh '添加一个武器
Dim Weapon As New TVActor '添加一个手型
Dim WeaponState As Long '武器状态0静止,1开枪
Dim FireInterval As Long '武器停顿时间计时器
Dim Scr As New TVScreen2DImmediate '2d处理库
Private Sub Form_Load()
'显示当前窗口,每次都加上错不了
ugFile & ""
ugMode True, True
rchDirectory '设定贴图读取目录为当前目录
nc True '垂直同步开关
3DWindowed '用窗口模式启动tv3d
lize
leSystem TV_ANGLE_DEGREE
wFrustum 45, 0 '可视范围无限,1单位=1米,可视角度45
xture "", "pic" '读取名为的贴图,并命名为pic
xture "", "SKYBOX_Back" '读取天空背景
xture "", "SKYBOX_Front"
xture "", "SKYBOX_Left"
xture "", "SKYBOX_Right"
xture "", "SKYBOX_Up"
xture "", "SKYBOX_DOWN"
xture "", "flash", , , TV_COLORKEY_USE_ALPHA_CHANNEL '读取带透明通道的贴图
_Enable True '开启天空盒
_SetTexture GetTex("SKYBOX_Front"), GetTex("SKYBOX_Back"), GetTex("SKYBOX_Left"), GetTex("SKYBOX_Right"), GetTex("SKYBOX_Up"),
GetTex("SKYBOX_DOWN") '设定贴图
_Enable True '开启雾
_SetColor 1, 1, 1 '颜色RGBA,例如红
_SetParameters 10, 60, 0 '最近距离,最远距离,浓度
_SetType TV_FOG_LINEAR, TV_FOGTYPE_PIXEL '雾的类型
学习资料
学习资料收集于网络,仅供参考
Material "solid" '建立名为solid的材质
ient GetMat("solid"), 0.1, 0.1, 0.1, 1 '环境光
fuse GetMat("solid"), 1, 1, 1, 1 '扩散光,即物体的固有颜色
ssive GetMat("solid"), 0, 0, 0, 1 '自发光
city GetMat("solid"), 1 '不透明度
cular GetMat("solid"), 0, 0, 0, 0 '高光色
er GetMat("solid"), 60 '散射强度
DirectionalLight Vector(1, -1, 1), 1, 1, 1, , 1 '添加一个平行光
cularLighting True '高光开关
Set Mesh = MeshBuilder '网格物体初始化,必加
M "", True, True '读取地图
htingMode TV_LIGHTING_NORMAL
erial GetMat("solid")
Set Enemy = Actor '角色初始化
A ("") '读取橘色
erial GetMat("solid") '设定材质
htingMode TV_LIGHTING_NORMAL '设定光照模式
le 0.025, 0.025, 0.025 '设定大小,因为cs模型是40单位=1米,所以我们把模型缩小40倍
ition 0, 1, 0 '设定模型位置
mationByName ("idle1") '执行的动作名称
imation 1 '播放动作速度
Set Weapon = Actor '角色初始化
A ("") '读取橘色
erial GetMat("solid") '设定材质
htingMode TV_LIGHTING_NORMAL '设定光照模式
mationByName ("idle1") '执行的动作名称
imation 1 '播放动作速度
le 0.1, 0.1, 0.1 '设定大小,因为cs模型是40单位=1米,所以我们把模型缩小40倍
Set EnemyGun = MeshBuilder '网格物体初始化,必加
M "", True, True '读取地图
htingMode TV_LIGHTING_NORMAL
erial GetMat("solid")
le 0.025, 0.025, 0.025 '设定大小
CameraPozY = 1.7 '人眼的高度,1.7米
CameraPozYOld = CameraPozY
Do '主循环
学习资料
学习资料收集于网络,仅供参考
seState Mx, My, B1, B2, , , Roll '接收鼠标信息
CameraAngX = CameraAngX + 0.1 * Mx
CameraAngY = CameraAngY + 0.1 * My
If WeaponState = 0 Then '静止状态
If B1 <> 0 Then '开枪
'
mationByName "shoot1" '播放开枪动画
WeaponState = 1 '设为开枪状态
End If
Else '开枪状态
If FireInterval < 200 Then '当计时器小于200毫秒时
FireInterval = FireInterval + apsed '计时累加
Else '到了200毫秒时变为停止状态
FireInterval = 0
WeaponState = 0
mationByName "idle1"
End If
End If
'限制范围
If CameraAngY > 90 Then CameraAngY = 90
If CameraAngY < -90 Then CameraAngY = -90
If ressed(TV_KEY_W) Then '前
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX - 90)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX - 90)) * 0.2
End If
If ressed(TV_KEY_S) Then '后
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX + 90)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX + 90)) * 0.2
End If
学习资料
学习资料收集于网络,仅供参考
If ressed(TV_KEY_A) Then '左
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX + 180)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX + 180)) * 0.2
End If
If ressed(TV_KEY_D) Then '右
CameraPozX = CameraPozX + Cos(2Rad(CameraAngX)) * 0.2
CameraPozZ = CameraPozZ - Sin(2Rad(CameraAngX)) * 0.2
End If
If ion(Vector(CameraPozXOld, CameraPozYOld, CameraPozZOld), Vector(CameraPozX, CameraPozY, CameraPozZ)) Then '碰撞检测
'如果碰撞恢复上一帧坐标
CameraPozX = CameraPozXOld
CameraPozY = CameraPozYOld
CameraPozZ = CameraPozZOld
Else
'没碰撞则更新坐标
CameraPozXOld = CameraPozX
CameraPozYOld = CameraPozY
CameraPozZOld = CameraPozZ
End If
'设定摄像机
ation CameraAngY, CameraAngX, 0
ition CameraPozX, CameraPozY, CameraPozZ
'武器位置设定
ition CameraPozX, CameraPozY, CameraPozZ
ation 0, CameraAngX + 90, CameraAngY
rix eMatrix(eID("Bip01 R Hand")) '绑定到手
Y -90
Z -90
lative 0.2, -1.2, 0.17
'清屏
_Enable False
here_Render '渲染大气
_Enable True
学习资料
发布者:admin,转转请注明出处:http://www.yc00.com/news/1707358516a1495792.html
评论列表(0条)