请问如何用winsock传送二维数组的数据?

lsftest 2003-04-16 11:21:48
有一个二维大数组,希望用winsock把数据传送到别的机子去,用tcp协议,代码如下:

Private Sub Command1_Click()
Dim a(0 To 10000,0 To 10000) As Byte

For i = 0 To 10000
For j = 0 To 10000
.
.
'为数组的元素赋值
.
.
Next
Next

'设置好winsock控件
Winsock1.SendData a()
End Sub



接收端的代码:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim b(0 To 10000, 0 To 10000) As Byte

Winsock1.GetData b()

End Sub

在测试中,winsock控件的连接很正常,我在程序中设置了几个测试连接是否正常的变量都返回了预期的结果,在发送前也检查过了a()数组里面的数据正确,整个过程程序也没有报错...但b()数组里面的却全部都是0......是什么原因呢??应该怎样传输二维数组???
...全文
66 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bhhxd 2003-04-18
  • 打赏
  • 举报
回复
自己编写一段代码,将二维数组转换成字符串,
到接收端在将字符串转换成为二维数组
fuzq 2003-04-18
  • 打赏
  • 举报
回复
have a try
data1 & "#" & data1
of course,data1 and data1 you can instead with the value of array
lsftest 2003-04-18
  • 打赏
  • 举报
回复
up
vicky_jam 2003-04-18
  • 打赏
  • 举报
回复
:)兄弟:)
如果你知道答案的话:)
也高我一声:)
你说除了我的心声:)
谢谢!!!
HUOLI0440 2003-04-17
  • 打赏
  • 举报
回复
I want to know answer……
主要利用VARIANT类型作参数进行的网络数据传送和接收,以及SAFEARRAY,BSTR的详细使用方法。 另外还提供该控件在VC,VB下的调用方式以及相关数据的处理。 关键字:ActiveX,Socket,VARIANT, SAFEARRAY,BSTR。 回顾:在上一篇文章《标准MFC WinSock ActiveX控件开发实例》中我们详细介绍了控件的开发过程,以及接口和事件的 添加和响应方法。现在我们将继续上次没有写完的控件继续进行开发,并完善作为一个WinSock控件应该具备的功能。 二、按照前一篇文章提到的知识,现在我们来添加两个新的接口分别是SendData()和GetData(),它们看起来如下: //网络数据发送,在指定的超时时间内进行发送然后返回,成功返回实际发送字节数,否则返回负数 long CMFCWinSockCtrl::SendData(const VARIANT FAR& Data, const VARIANT FAR& DataType, const VARIANT FAR& DataLength, const VARIANT FAR& TimeOut) { // TODO: Add your dispatch handler code here return 0; } //获取数据,并指定获取数据的超时时间,返回实际获取到的数据长度,否则返回负数 long CMFCWinSockCtrl::GetData(VARIANT FAR* Data, const VARIANT FAR& DataType, const VARIANT FAR& DataMaxLength, const VARIANT FAR& TimeOut) { // TODO: Add your dispatch handler code here return 0; }   两个接口的参数除了第一个参数外,其它都类似。SendData()是发送数据,不要求将数据带回,因此直接用 VARIANT,而GetData()则要求将数据带回来给调用者,因此定义为 VARIANT *类型,第二个参数DataType故名思义是定义所传送或接收数据的类型,第三个参数是传送或接收数据的长度,这里的长度以char作为一个长度,假如传入的类型是int类型,则长度为4,如果定义的是字符串,一个中文字符占用2个长度。最后一个参数,是网络发送或读取时的超时时间。 三、为Connect()接口添加源代码,看起来如下: //网络数据发送,在指定的超时时间内进行发送然后返回,成功返回实际发送字节数,否则返回负数 long CMFCWinSockCtrl::SendData(const VARIANT FAR& Data, const VARIANT FAR& DataType, const VARIANT FAR& DataLength, const VARIANT FAR& TimeOut) { // TODO: Add your dispatch handler code here if(!OnlySock) return -1;//网络尚未开始建立连接 int gDataType = VariantToLong(DataType); long gDataLength = VariantToLong(DataLength); int gTimeOut = VariantToLong(TimeOut); if(gDataType < 0) return -2; if(gDataLength <= 0) return -2; if(gTimeOut < 0) return -2; switch(gDataType) { case 0://默认形式,这时如果发现Data为整型数组,将不进行任何转换,直接把一个int传给一个char传送(数据可能溢出范围) case 1://当指定该值为1时,当Date为长整型数组时,将把一个long转换成四个char传送 case 2://当指定该值为2时,当Date为整型数组时,将把一个int转换成四个char传送 case 3://当指定该值为3时,当Date为无符号短整型数组时,将把一个unsigned short转换成两个char传送 case 4://当指定该值为4时,当Date为BYTE数组时,将把一个BYTE转换成一个char传送 case 5://当指定该值为5时,当Date为短整型数组时,将把一个short转换成两个char传送 case 6://当指定该值为6时,当Date为浮点型数组时,将把一个float转换成四个char传送 case 7://当指定该值为7时,当Date为双精度数组时,将把一个double转换成八个char传送 break; default://如果不在上面取值范围内,将按当前的Data相应类型进行传送 break; } timeval tv; fd_set fdwrite; int len = 0; long m = 0; long n = 0; long changetype = 0;//将浮点型数据进行类型转换,再进行传送 VARIANT gData; VariantInit(&gData); //送出信息至服务器 FD_ZERO(&fdwrite); tv.tv_sec = gTimeOut;//指定时间后返回 tv.tv_usec = 0; FD_SET(OnlySock,&fdwrite);//是否可以发送数据 select(0,NULL,&fdwrite,NULL,&tv); char *buffer = NULL; if(FD_ISSET(OnlySock,&fdwrite)) { switch(Data.vt) { case VT_BSTR://按字符串形式发送 buffer = _com_util::ConvertBSTRToString(Data.bstrVal); break; case VT_BYREF|VT_UI1: //按BYTE*形式发送 buffer = new char[gDataLength]; memcpy(buffer,Data.pbVal,gDataLength); break; case VT_BYREF|VT_I1://按 char * 发送 buffer = new char[gDataLength]; memcpy(buffer,Data.pcVal,gDataLength); break; case VT_ARRAY|VT_I4://以长整型数组发送 gData.vt = VT_I4; if(gDataType!=0)//long = char*4 { //sizeof(long),在这里一个长整型的长度为4个char buffer = new char[gDataLength]; for(m=0,n=0; n>24)&0xff; buffer[m++] = (gData.lVal>>16)&0xff; buffer[m++] = (gData.lVal>>8)&0xff; buffer[m++] = gData.lVal&0xff; } } else//long = char*1 //数据可能溢出 { buffer = new char[gDataLength]; for(m=0,n=0; n数组发送 gData.vt = VT_INT; if(gDataType != 0) { //一个int等于四个char buffer = new char[gDataLength]; for(m=0,n=0; n>24)&0xff; buffer[m++] = (gData.intVal>>16)&0xff; buffer[m++] = (gData.intVal>>8)&0xff; buffer[m++] = gData.intVal&0xff; } } else { buffer = new char[gDataLength]; for(n=0; n数组发送 gData.vt = VT_UI1;//一个char等于一个BYTE不必进行转换 buffer = new char[gDataLength]; for(n=0; n数据转换处理了,我就偷懒了^_^ return -3;//传入的数据类型不被支持 } len = send(OnlySock, buffer, gDataLength, 0);//发送数据 delete[] buffer; buffer = NULL; if (len>24)&0xff; buffer[1] = (lData>>16)&0xff; buffer[2] = (lData>>8)&0xff; buffer[3] = lData&0xff; //4个char组成一个long lData_2 = ((buffer[0]&0xff)<<24) + ((buffer[1]&0xff)<<16) + ((buffer[2]&0xff)<<8) + (buffer[3]&0xff); 四、现在来看看GetData()的处理,具体实现,请看如下代码: // TODO: Add your dispatch handler code here if(!OnlySock) return -1;//网络尚未开始建立连接 int gDataType = VariantToLong(DataType); long gDataMaxLength = VariantToLong(DataMaxLength); int gTimeOut = VariantToLong(TimeOut); if(gDataType < 0) return -2; if(gDataMaxLength <= 0) return -2; if(gTimeOut < 0) return -2; switch(gDataType) { case 0://默认形式,这时如果发现Data为整型数组,将不进行任何转换,直接把一个int传给一个char传送(数据可能溢出范围) case 1://当指定该值为1时,当Date为长整型数组时,将把一个long转换成四个char传送 case 2://当指定该值为2时,当Date为整型数组时,将把一个int转换成四个char传送 case 3://当指定该值为3时,当Date为无符号短整型数组时,将把一个unsigned short转换成两个char传送 case 4://当指定该值为4时,当Date为BYTE数组时,将把一个BYTE转换成一个char传送 case 5://当指定该值为5时,当Date为短整型数组时,将把一个short转换成两个char传送 case 6://当指定该值为6时,当Date为浮点型数组时,将把一个float转换成四个char传送 case 7://当指定该值为7时,当Date为双精度数组时,将把一个double转换成八个char传送 break; default://如果不在上面取值范围内,将按当前的Data相应类型进行传送 break; } timeval tv; fd_set fdread; int len = -3;//如果找不到该连接,则返回-3 long n = 0; long m = 0; long changetype = 0; VARIANT gData; VariantInit(&gData); char *buffer=NULL; buffer = new char[gDataMaxLength+1]; memset(buffer, 0, gDataMaxLength+1); FD_ZERO(&fdread); tv.tv_sec = gTimeOut;//超过指定时间后返回 tv.tv_usec = 0; FD_SET(OnlySock,&fdread);//是否可以读取数据 select( 0,&fdread,NULL,NULL,&tv); if(FD_ISSET(OnlySock,&fdread)) { len = recv(OnlySock, buffer, gDataMaxLength, 0); if (len<=0) { delete[] buffer; return -102;//无法读取数据,对方可能已断开连接 } if(lenvt) { case VT_BSTR://按字符串形式接收 buffer[gDataMaxLength] = '\0'; Data->bstrVal = _com_util::ConvertStringToBSTR(buffer); break; case VT_BYREF|VT_UI1: //按BYTE*形式接收 memcpy(Data->pbVal,buffer,gDataMaxLength); break; case VT_BYREF|VT_I1://按 char * 形式接收 memcpy(Data->pcVal,buffer,gDataMaxLength); break; case VT_BYREF|VT_I4://以长整型指针接收 buffer[gDataMaxLength]='\0'; for(n=0; nplVal[n] = buffer[n]; } break; case VT_ARRAY|VT_I4://以长整型数组接收 gData.vt = VT_I4; if(gDataType != 0) { for(m=0,n=0; n数组接收 gData.vt = VT_INT; if(gDataType != 0) { for(m=0,n=0; n数组接收 gData.vt = VT_UI1; for(n = 0; nparray,&n,&gData.bVal); } break; default://其它类型,请各位看官自行实现处理,嘿嘿 delete[] buffer; return -3;//无法识别传入的数据类型 } } else { delete[] buffer; return 0;//网络数据读取超时 } VariantClear(&gData); delete[] buffer; return len; 五、接下来,我们看看VC和VB如何调用该控件: VC调用控件方式: 新建一对话框工程,然后在工程中添加该控件,设置如下图: 图一 创建新对话框工程,并加入控件 响应控件的断网和数据到达事件,设置如下图: 图二 响应控件的两个事件 添加相应代码,看起来如下: void CTestMFCWinSockDlg::OnRecvSockEventMfcwinsockctrl1() { // TODO: Add your control notification handler code here SAFEARRAYBOUND Bound[1];//一维数组 Bound[0].lLbound=0; Bound[0].cElements=100;//该一维数组最大接收100个元素 VARIANT *data; data = new VARIANT; VariantInit(data); data->vt = VT_ARRAY|VT_I4;//指明为长整型数组 data->parray = SafeArrayCreate(VT_I4,1,Bound);//创建SAFEARRAY结构 long l = m_sock.GetData(data, COleVariant((long)0), COleVariant((long)100), COleVariant((long)3)); if(l<=0) { ;//在这里判断出错信息,并作相应处理,我就偷懒了. } char pData[100]={0};//这里以字符数组显示结果 long change = 0; for(long n=0; nparray,&n,&change); pData[n] = (char)change; } CString mess; mess.Format("%s",pData); AfxMessageBox(mess); SafeArrayDestroy(data->parray); delete data; } void CTestMFCWinSockDlg::OnCloseWinsockMfcwinsockctrl1() { // TODO: Add your control notification handler code here m_sock.DisConnect();//调用断开连接接口 AfxMessageBox("服务器断开了该次连接,请检查!"); } void CTestMFCWinSockDlg::OnConnect() { // TODO: Add your control notification handler code here UpdateData(TRUE); if(!m_sock.Connect(COleVariant(m_ip),COleVariant(m_port))) AfxMessageBox("与服务器建立连接失败,请确认服务器是否存在!"); } VB调用控件方式: VB时面调用要方便很多,这得益于VB的很多自动化功能,请看下图: 图三 VB调用控件方法 同样,双击我们的控件,然后添加控件事件,如下图: 图四 VB响应控件事件 然后,添加相关代码如下: Private Sub Command1_Click() MFCWinSock1.Connect CStr(ip), CLng(port) End Sub Private Sub Command2_Click() MFCWinSock1.SendData "SendData: 欢迎使用!", 0, 50, 3 End Sub Private Sub MFCWinSock1_CloseWinsock() MFCWinSock1.DisConnect MsgBox "服务器断开了连接,请检查!" End Sub Private Sub MFCWinSock1_RecvSockEvent() Dim data As Variant Dim data2(100) As Long Dim data3 As String Dim l As Long data = data2 '在VB里当把一个Variant变量data等于另一个确定变量data2时,data将被初始化为与data2相同的类型变量 'data = data3 '如果让data等于data3,那么data将变成字符串型的变量参数 l = MFCWinSock1.GetData(data, 0, 100, 3) '这时data里面已存放了接收到的数据 data3 = data(0) '这里只显示接收到的首字符编码 MsgBox data3 End Sub 大家可以看到,对于SAFEARRAY类型的数据进行相关处理也并不可怕,由于在源码里给出了具体代码和详细注解,在这里我就不再赘述了, 至于BSTR和char *类型的数据,相信不用我多说,大家也已经知道如何使用了。 结束语:   全文至此暂告一段落,本文向大家展示了MFC ActiveX控件的魅力,以及所用的VARIANT类型参数,还详细给出了WinSock的开发代码, 以用在VC,VB的调用方法,由于这段时间忙于一些新项目的开发,因此没办法花太多时间进行详细解释,所以很多地方都直接给出源代码 再加上注解,而没有进行通俗的讲解,还请各位读者仔细查看源代码。 本控件目前只能作为客户端,阁下还可以继续进行完善,比如进行端口的监听,实现服务器的相关处理等等,但这已经不是本文的目的, 授人以鱼,不如授人如渔,剩下的功能,就由各位读者去实现了,也欢迎与我进行交流,谢谢! 另外:本文的示例,需要一个服务器程序,大家可以在网上随便下载一下进行测试,我就不提供了。 声明: 部分资料来源于网络,本文所用的所有源代码仅供非商业用途,并请保留原版权,否则后果自负! 欢迎大家拍砖,指正错误或不足的地方,一起探导更好的方法。 欢迎访问www.59186618.com,感谢您的支持!
游戏编程指南 1 目 录 1 导 读 1 第一章 表述游戏的语言 1 1.1 VC.net概述 1 1.2 入门知识 4 1.2.1 数与数据类型 4 1.2.2 变量与常量 4 1.2.3 Namespace 5 1.2.4 操作符与表达式 6 1.3 预编译指令 7 1.4 结构,联合和枚举 8 1.4.1 结构 8 1.4.2 联合 9 1.4.3 枚举 10 1.5 控制语句 10 1.5.1 判断和跳转语句 10 1.5.2 选择语句 11 1.5.3 循环语句 13 1.6 函数 13 1.7 指针、数组与字符串 17 1.7.1 指针 17 1.7.2 数组 19 1.7.3 字符串 21 1.7.4 小结 22 1.8 多文件程序的结构 22 1.9 常用函数 24 第二章 如何说得更地道 28 2.1 定义和使用类 28 2.2 类的构造函数 31 2.3 类的静态成员 32 2.4 运算符重载 33 2.5 类的继承 36 2.6 虚函数和抽象类 39 2.7 模板 40 2.8 优化程序 43 2.9 调试程序 44 第三章 容纳游戏的空间 46 3.1 基本Windows程序 46 3.2 WinMain函数 50 3.2.1 简介 50 3.2.2 注册窗口类 50 3.2.3 创建窗口 52 3.2.4 显示和更新窗口 53 3.2.5 消息循环 54 3.3 消息处理函数 55 3.4 常用Windows函数 56 3.4.1 显示对话框 56 3.4.2 定时器 56 3.4.3 得到时间 57 3.4.4 播放声音 57 第四章 描绘游戏的画笔 58 4.1 初始化DirectDraw 58 4.1.1 简介 58 4.1.2 DirectDraw对象 59 4.1.3 设置控制级和显示模式 60 4.1.4 创建页面 61 4.2 后台缓存和换页 63 4.3 调入图像 64 4.4 页面的丢失与恢复 64 4.5 透明色 65 4.6 图像传送 65 4.7 程序实例 69 4.8 图像缩放 69 4.9 释放DirectDraw对象 69 第五章 丰富画面的技巧 71 5.1 填涂颜色 71 5.2 输出文字 72 5.3 GDI作图 72 5.4 程序实例 73 5.5 锁定页面 73 5.6 程序提速 75 5.7 特殊效果 79 5.7.1 减暗和加亮 79 5.7.2 淡入淡出 80 5.7.3 半透明 80 5.7.4 光照 81 5.7.5 动态光照 82 第六章 加速游戏的魔法 86 6.1 内嵌汇编简介 86 6.2 基本指令 87 6.3 算术指令 88 6.4 逻辑与移位指令 90 6.5 比较、测试、转移与循环指令 90 6.6 MMX指令集之基本指令 93 6.7 MMX指令集之算术与比较指令 95 6.8 MMX指令集之逻辑与移位指令 96 6.9 MMX指令集之格式调整指令 97 第七章 我没有想好名字 99 7.1 读取键盘数据 99 7.2 读取鼠标数据 100 7.3 恢复和关闭DirectInput 101 7.3.1 恢复DirectInput设备 101 7.3.2 关闭DirectInput 101 7.4 初始化和关闭DirectX Audio 101 7.4.1 初始化DirectX Audio 101 7.4.2 关闭DirectX Audio 102 7.5 播放MIDI和WAV音乐 102 7.5.1 调入MIDI和WAV文件 102 7.5.2 播放MIDI和WAV文件 103 7.5.3 停止播放 104 7.6 在3D空间中播放音乐 104 7.7 播放MP3音乐 106 7.7.1 调入MP3文件 106 7.7.2 播放MP3文件 106 7.7.3 停止播放和释放对象 107 第八章 支撑游戏的基石 108 8.1 链表 108 8.2 哈希表 108 8.3 快速排序 109 8.4 深度优先搜索 110 8.5 广度优先搜索 114 8.6 启发式搜索 117 8.7 动态规划 123 8.8 神经网络 125 8.9 遗传规划 126 第九章 向三维世界迈进 128 9.1 概述 128 9.2 基本知识 130 9.2.1 初始化DXGraphics 130 9.2.2 关闭DXGraphics 132 9.2.3 恢复DXGraphics设备 132 9.3 设置场景 132 9.3.1 设置渲染状态 132 9.3.2 设置矩阵 133 9.4 创建场景 134 9.4.1 调入3D场景 135 9.4.2 调入2D图像 136 9.5 刷新场景 137 9.6 渲染场景 138 9.6.1 渲染3D场景 138 9.6.2 渲染2D图像 138 9.7 改变场景 138 9.8 显示文字 139 9.9 程序实例 140 第十章 我没有想好名字 141 10.1 灯光 141 10.2 半透明 142 10.3 纹理混合 143 10.4 雾 145 10.5 凹凸贴图与环境贴图 146 10.6 粒子系统 146 10.7 骨骼动画 146 10.8 镜子 146 10.9 影子 146 第十一章 我没有想好名字 148 11.1 基本概念 148 11.2 程序流程 148 11.2.1 服务器端 148 11.2.2 客户端 149 11.3 程序实例 149 11.4 错误处理 154 11.5 显示IP地址 154 11.6 Multicast技术 155 11.7 更有效地传送数据 156 第十二章 创造我们的世界 157 12.1 程序流程 157 12.2 程序结构 158 12.3 基本方法 159 12.4 SLG编程要点 159 12.4.1 电脑AI 159 12.5 RPG & ARPG编程要点 159 12.5.1 迷宫的生成 159 12.5.2 脚本技术 159 12.6 RTS编程要点 159 12.6.1 寻路 159 12.6.2 电脑AI 159 12.7 FPS编程要点 160 12.7.1 移动 160 12.7.2 碰撞检测 160 附 录 162 附录一 Windows常见消息列表 162 附录二 虚拟键列表 167 Windows消息中的虚拟键 167 DirectInput中的虚拟键 168 附录三 DirectX函数返回值列表 170 DirectDraw部分 170 Direct3D部分 177 附录四 Winsock函数返回值列表 179 附录五 游戏编程常用网址 183 附录六 中英文名词对照 184 附录七 常见问题及解决办法 185 1. 程序编译时出现"Warning" 185 2. "Cannot Execute Program" 185 3. "Unresolved External Symbol" 185 4. 运行时出错 185
目 录 游戏编程指南... 1 目 录... 1 导 读... 1 第一章 表述游戏的语言... 1 1.1 VC.net概述... 1 1.2 入门知识... 4 1.2.1 数与数据类型... 4 1.2.2 变量与常量... 4 1.2.3 Namespace. 5 1.2.4 操作符与表达式... 6 1.3 预编译指令... 7 1.4 结构,联合和枚举... 8 1.4.1 结构... 8 1.4.2 联合... 9 1.4.3 枚举... 10 1.5 控制语句... 10 1.5.1 判断和跳转语句... 10 1.5.2 选择语句... 11 1.5.3 循环语句... 13 1.6 函数... 13 1.7 指针、数组与字符串... 17 1.7.1 指针... 17 1.7.2 数组... 19 1.7.3 字符串... 22 1.7.4 小结... 23 1.8 多文件程序的结构... 23 1.9 常用函数... 25 第二章 如何说得更地道... 29 2.1 定义和使用类... 29 2.2 类的构造函数... 32 2.3 类的静态成员... 34 2.4 运算符重载... 35 2.5 类的继承... 38 2.6 虚函数和抽象类... 41 2.7 模板... 42 2.8 优化程序... 45 2.9 调试程序... 47 第三章 容纳游戏的空间... 49 3.1 基本Windows程序... 49 3.2 WinMain函数... 53 3.2.1 简介... 53 3.2.2 注册窗口类... 53 3.2.3 创建窗口... 55 3.2.4 显示和更新窗口... 56 3.2.5 消息循环... 57 3.3 消息处理函数... 58 3.4 常用Windows函数... 59 3.4.1 显示对话框... 59 3.4.2 定时器... 59 3.4.3 得到时间... 60 3.4.4 播放声音... 60 第四章 描绘游戏的画笔... 61 4.1 初始化DirectDraw.. 61 4.1.1 简介... 61 4.1.2 DirectDraw对象... 62 4.1.3 设置控制级和显示模式... 63 4.1.4 创建页面... 64 4.2 后台缓存和换页... 66 4.3 调入图像... 67 4.4 页面的丢失与恢复... 67 4.5 透明色... 68 4.6 图像传送... 68 4.7 程序实例... 72 4.8 图像缩放... 72 4.9 释放DirectDraw对象... 72 第五章 丰富画面的技巧... 74 5.1 填涂颜色... 74 5.2 输出文字... 75 5.3 GDI作图... 75 5.4 程序实例... 76 5.5 锁定页面... 76 5.6 程序提速... 78 5.7 特殊效果... 82 5.7.1 减暗和加亮... 82 5.7.2 淡入淡出... 83 5.7.3 半透明... 83 5.7.4 光照... 84 5.7.5 动态光照... 85 5.7.6 光照系统... 88 5.7.7 天气效果... 88 第六章 加速游戏的魔法... 89 6.1 内嵌汇编简介... 89 6.2 基本指令... 90 6.3 算术指令... 91 6.4 逻辑与移位指令... 93 6.5 比较、测试、转移与循环指令... 93 6.6 MMX指令集之基本指令... 96 6.7 MMX指令集之算术与比较指令... 98 6.8 MMX指令集之逻辑与移位指令... 99 6.9 MMX指令集之格式调整指令... 100 第七章 我没有想好名字... 102 7.1 读取键盘数据... 102 7.2 读取鼠标数据... 103 7.3 恢复和关闭DirectInput 104 7.3.1 恢复DirectInput设备... 104 7.3.2 关闭DirectInput 104 7.4 初始化和关闭DirectX Audio. 104 7.4.1 初始化DirectX Audio. 104 7.4.2 关闭DirectX Audio. 105 7.5 播放MIDI和WAV音乐... 105 7.5.1 调入MIDI和WAV文件... 105 7.5.2 播放MIDI和WAV文件... 106 7.5.3 停止播放... 107 7.6 在3D空间中播放音乐... 107 7.7 播放MP3音乐... 109 7.7.1 调入MP3文件... 109 7.7.2 播放MP3文件... 109 7.7.3 停止播放和释放对象... 110 第八章 支撑游戏的基石... 111 8.1 链表... 111 8.2 哈希表... 111 8.3 快速排序... 112 8.4 深度优先搜索... 113 8.5 广度优先搜索... 117 8.6 启发式搜索... 120 8.7 动态规划... 126 8.8 神经网络... 128 8.9 遗传规划... 129 第九章 向三维世界迈进... 131 9.1 概述... 131 9.2 基本知识... 133 9.2.1 初始化DXGraphics. 133 9.2.2 关闭DXGraphics. 135 9.2.3 恢复DXGraphics设备... 135 9.3 设置场景... 135 9.3.1 设置渲染状态... 135 9.3.2 设置矩阵... 136 9.4 创建场景... 137 9.4.1 调入3D场景... 138 9.4.2 调入2D图像... 139 9.5 刷新场景... 140 9.6 渲染场景... 141 9.6.1 渲染3D场景... 141 9.6.2 渲染2D图像... 141 9.7 改变场景... 141 9.8 显示文字... 142 9.9 程序实例... 143 第十章 我没有想好名字... 144 10.1 灯光... 144 10.2 半透明... 145 10.3 纹理混合... 146 10.4 雾... 148 10.5 凹凸贴图与环境贴图... 149 10.6 粒子系统... 149 10.7 骨骼动画... 149 10.8 镜子... 151 10.9 影子... 151 第十一章 我没有想好名字... 152 11.1 基本概念... 152 11.2 程序流程... 152 11.2.1 服务器端... 152 11.2.2 客户端... 153 11.3 程序实例... 153 11.4 错误处理... 158 11.5 显示IP地址... 158 11.6 更有效地传送数据... 159 第十二章 创造我们的世界... 161 12.1 程序流程... 161 12.2 程序结构... 162 12.3 基本方法... 163 12.4 SLG编程要点... 163 12.4.1 电脑AI 163 12.5 RPG & ARPG编程要点... 163 12.5.1 迷宫的生成... 163 12.5.2 脚本技术... 163 12.6 RTS编程要点... 163 12.6.1 寻路... 163 12.6.2 电脑AI 163 12.7 FPS编程要点... 164 12.7.1 移动... 164 12.7.2 碰撞检测... 164 12.8 游戏中的物理学... 165 附 录... 166 附录一 Windows常见消息列表... 166 附录二 虚拟键列表... 171 Windows消息中的虚拟键... 171 DirectInput中的虚拟键... 172 附录三 DirectX函数返回值列表... 174 DirectDraw部分... 174 Direct3D部分... 181 附录四 Winsock函数返回值列表... 183 附录五 游戏编程常用网址... 187 附录六 中英文名词对照... 188 附录七 常见问题及解决办法... 189 1. 程序编译时出现"Warning". 189 2. "Cannot Execute Program". 189 3. "Unresolved External Symbol". 189 4. 运行时出错... 189 5. 大家还有什么问题,可以告诉我... 189

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧