320 likes | 465 Views
计算机游戏实验. 计算机科学与技术学院. 提纲. 实验一 迷宫游戏 实验二 精灵动画 实验三 初始化游戏循环 实验四 二维碰撞检测 实验五 A-star 寻路算法实现 实验六 服务器端和客户端 Socket 编程. 实验一 迷宫游戏. 实验目的: 对游戏元素、游戏有初步认识 理解游戏的开发思想,创建地图等 实验内容: 建立简单的游戏场景:迷宫地图 创建一个小迷宫游戏. 实验准备. 迷宫地图: 笑脸(人) 墙壁 路径 出口 规则: 墙壁不能通过,只能沿地图上的路径行动; 有一个出发点,最终到一个目的地:出口, 到达出口则游戏结束。.
E N D
计算机游戏实验 计算机科学与技术学院
提纲 • 实验一 迷宫游戏 • 实验二 精灵动画 • 实验三 初始化游戏循环 • 实验四 二维碰撞检测 • 实验五 A-star寻路算法实现 • 实验六 服务器端和客户端Socket编程
实验一 迷宫游戏 • 实验目的: • 对游戏元素、游戏有初步认识 • 理解游戏的开发思想,创建地图等 • 实验内容: • 建立简单的游戏场景:迷宫地图 • 创建一个小迷宫游戏
实验准备 • 迷宫地图: • 笑脸(人) • 墙壁 • 路径 • 出口 • 规则: • 墙壁不能通过,只能沿地图上的路径行动; • 有一个出发点,最终到一个目的地:出口,到达出口则游戏结束。
预备知识: • 所需按键键盘码 • #define ESC 0x011b • #define UP 0x4800 • #define DOWN 0x5000 • #define LEFT 0x4b00 • #define RIGHT 0x4d00
游戏流程 退出游戏 ESC键? 接受按键 判断按键 上下左右键? 执行相关操作 无效按键? 忽略处理
实验二 精灵动画 • 实验目的: • 掌握镂空贴图的原理 • 实现精灵动画效果,为二维游戏动画的实现提供基础,为接下来的实验做好准备
实验内容: • 使用Vc6.0和如下素材,实现镂空贴图,并进一步实现精灵动画效果
实验准备 • 镂空贴图原理: • 首先将掩码图和背景图案按位与,将原始图像的主体对应位置挖空 • 然后将原始图像和上一步处理结果按位或,则原始图像的主体部分贴到背景上并遮盖背景
预备知识: • BitBlt()函数 • 光栅运算操作码,操作数SRCAND表示把源图像和目标图像按位与,操作数SRCPAINT则表示按位或 • 双缓存技术 • 不要在窗口中直接贴图,避免闪烁 • 建立一个内存DC,然后把所有的贴图动作都在这个DC上进行,最后把结果显示到操作窗口中
思考: • 如何实现复杂的动画,比如实现人行走的动画效果? • 提示:使用多幅精灵图和对应的掩码图
实验三 初始化游戏循环 • 实验目的:理解和掌握游戏的运行流程 • 实验内容: • 检查系统资源 • 计算CPU速度 • 加载游戏调试选项 • 初始化资源缓存 • 实现游戏的主循环
实验准备: • 游戏的基本运行流程 键盘 鼠标 游戏杆 获得用户输入 • 初始化 • 内存分配 • 构建表格 • 载入文件 • 主菜单 • 载入 • 保存 • Play 执行Gameplay逻辑 • 游戏逻辑 • AI • 碰撞检测 • 运动 主循环 输出到buffer 内存 • 画面更新 • 背景动画 • 音乐,声效 绘制到屏幕 显示器 否 退出循环 同步至大约以每秒30帧
输出 交互 处理游戏运行过程中的各种数据,在输出设备上(显示器、音箱)体现游戏的内容,包括游戏画面、游戏音效、游戏提示等 根据用户的操作,改变游戏的各种数据,以反映游戏的当前状态 调度模块 do-while循环
实验示例 while(game_state!=GAME_EXIT){ //游戏循环的实现部分 switch(game_state) { case GAME_INIT: { //初始化 init(); game_state=GAME_MENU; } break; case GAME_MENU: { //游戏目录 game_state=MENU(); //调用菜单并等待选择 } break; //游戏准备运行,这是个可选部分,但通常使用这个状态来 //将一些游戏中要用到的变量赋值初始化 case GAME_STARTING: {
Setup_For_Run(); //切换到运行状态 game_state=GAME_RUN; } break; case GAME_RUN: { //游戏运行,这部分包括整个游戏逻辑 Clear(); //清屏 //循环过程 Get_Input(); //获取输入 Do_Logic(); //AI逻辑 Render_Frame(); //图像绘制,精灵动画的实现部分 Wait(); //等待显示同步,切换游戏状态的唯一办法就是在 } // Get_Input()中的用户输入ESC break; //游戏重新启动,这部分是用来将游戏循环中改变的状态进行恢复的 case GAME_RESTART: {
Fixup(); //切换回游戏目录 game_state=GAME_MENU; } break; case GAME_EXIT: { //游戏退出,进入这个状态就 //将释放一切内存并退出游戏 Release_And_Cleanup(); error=0; } //正常退出 break; default: break; } //switch结束 } //while结束 return (error); //返回错误代码 } //main函数结束
实验四 二维碰撞检测 • 实验目标 • 理解碰撞检测的基本思想 • 实现一下三种简单的二维碰撞检测方法 • 区域检测 • 碰撞点检测 • 颜色检测 • 比较各种碰撞检测算法的优缺点
实验内容: • 在实现精灵动画的基础上,进一步,在背景上使用镂空贴图贴上一棵树,然后,车在行驶的时候,能够检测是否碰到树,碰撞检测方法任选 • 实验要求: • 实现三种区域检测算法,比较个算法的优缺点,并给出解释和说明。
预备知识: • 区域检测:实验包围盒(长方形)将被测物体包围起来,通过判断包围盒是否接触来判定物体是否碰撞。
实验五 A-star寻路算法的实现 • 实验目的: • 掌握A-star算法 • 理解自动寻路算法的实质 • 理解人工智能的思想
预备知识:A-star算法: • 对可能的后继状态n’,计算其目标函数f(n’),并置于优先队列中 • f(n’) = g(n’) + h(n’),其中g(n’)是从初始状态到n’的“花费”
思考:如果地图上各个区域的权重不一样,又该如何考虑呢?比如某些区域很危险等等。思考:如果地图上各个区域的权重不一样,又该如何考虑呢?比如某些区域很危险等等。
实验六 服务器端和客户端socket编程 • 实验目的: • 理解简单的socket编程过程 • 了解网络程序的编写 • 了解一般网络游戏大厅的原理
预备知识 • Socket编程模式 • 至少需要一对,一个是客户端的ClientSocket;另一个是服务器端的ServerSocket. • Socket的连接过程可分为3个步骤: • 服务器监听,客户端请求,连接确认。 • 服务器监听:处于等待连接状态,实时监控网络 • 客户端请求:客户端socket请求连接服务器端的socket(地址,端口)
Socket的APIs • Socket 的启动与中止---WSAStartup(); WSACleanup() • Socket的创建---Socket()和WSASocket() • 指定本地地址—Bind() • 建立连接----Connect(), WSAConnect() • 监听连接---Listen()
Socket的APIs(续) • 接受连接请求-----accept()和WSAaccept() • 数据发送---send()(TCP协议)和sendto() (UDP协议) • 数据接收---recv() (TCP协议)和recvfrom() (UDP协议) • I/O多路复用----select() • 中断连接---closeSocket()和shutdown()