目录
一、实验目的与要求
1. 了解物理模拟、精灵的绘制与移动、触摸事件的应用等。
2. 熟悉基于Box2D的物理引擎。
3. 掌握Box2D触屏检测和碰撞检测机制。
二、实验内容与方法
1.完成游戏编译
成功编译并运行教材P150“游戏物理模拟实例-基于Box2D的游戏实例”。
2.修改击球方式
修改教材源代码,使玩家在击球区域拖动鼠标左键,可以实现球杆的瞄准和能量的蓄积;当玩家松开鼠标左键,实现击球。
3.增加进洞口
修改教材源代码,在角落增加(至少)一个进洞口,彩色球接触洞口后消失;白球接触洞口后消失并重启游戏。
4.修改球杆随距离变化的力度
修改教材源代码,使球杆与台球之间的距离能够反映玩家击球力度大小。距离较远,则力度较大;距离较近,则力度较小。
5.其它优化功能
修改教材源代码,使台球游戏性能更佳。
三、实验步骤与过程
1. 完成游戏编译并修改游戏名称和窗口大小。
(1)创建游戏项目,详细步骤见我的实验1的文章。
(2)出现错误:无法打开源文件“#include "Box2D/Box2D.h”,这是因为cocos2dx的版本为3.17,而课件源码是3.15版本。
将课件源码中的Box2D文件夹的内容复制到cocos2dx的3.17版本的对应位置。
2. 修改击球方式。
(1)尝试击打球后,球撞到边界会出现如下图所示的异常,这是因为碰撞的一方是墙,不能转换成BilliardSprite类型的对象。
将其转化为char*对象,然后进行判断,如果为墙就直接退出函数。
char* name1 = (char*)contact->GetFixtureA()->GetBody()->GetUserData();
char* name2 = (char*)contact->GetFixtureB()->GetBody()->GetUserData();
//如果碰到墙则返回
if(strcmp(name1,"boundary")==0|| strcmp(name2, "boundary") == 0)
{
return;
}
CCLOG("%s",static_cast<BilliardSprite*>(contact->GetFixtureA()->GetBody()->GetUserData())->getName());
CCLOG("%s",static_cast<BilliardSprite*