台球游戏的骨干算法和AI(2)

前言:
  最近研究了box2dweb, 觉得好编辑Html5本子台球游戏之机遇已经然成熟.
这也毕竟圆和谐之一个意, 一个梦想.
  承接该队的相关博文:
  • 台球游戏为主算法和AI(1) 
  同时结合html5的攻笔记:
  • box2dweb
学习笔记–sample讲解 
  这首稿子, 具体讲解台球游戏的box2d模型抽象, 并给有一个初步版本.

上海葡京国际会所 1

演示:
  台球游戏的雏形如下所示:
  上海葡京国际会所 2
  该台球游戏, 改编自box2dweb的demo程序, 可据此鼠标拖动球来移动.
  代码的产充斥链接: http://pan.baidu.com/s/1sjzCwqD

太原   下了同庙会下雨   我当努力撑起全方位

分析:
  让咱们本着台球游戏做只简单的物理抽象, 然后”庖丁解牛”,
对每个组件结合box2d进行剖析.
  上海葡京国际会所 3
  如图所示, 其抽象为6单球袋和6单框构成, 球袋是球落入的靶子,
边框则限定了台球的移动范围.
  • 边框抽象
  台球边框相对简便易行, 其可说是静态物体. 其大体形态就是平长边.

By 没有故事之安东尼

// 设置为静态物体类型
wallBodyDef.type = b2Body.b2_staticBody;

// 采用多边形形状,然后SetAsEdge设置为边
wallFixDef.shape = new b2PolygonShape;
wallFixDef.shape.SetAsEdge(new b2Vec2(x1, y1), new b2Vec2(x2, y2));

自己于童年时常就是开始发誓长大后肯定要是远走他乡,因为爸妈没有停歇了争吵。

流动: 边框转为box2d对象或简单的.
  • 球袋抽象
  球袋本身吗是静态物体, 但不同为边框, 其的box2d泛,
多了碰复杂与技巧. 
  1). 影响装置
  球袋区域应为感应区, 球可以上该区域, 但并无跟之起碰反应.
  可以透过设定定制器(Fixture)的isSensor属性也true来实现,
如下面代码所示:

这小发过多高高兴兴的天天,但并无总是持久,我看见母亲摔烂了门的瓷碗,爸喝醉了降跌撞撞地深夜晚归,我看成老婆唯一的观众,只能卷曲在角落里哽咽,把发誓要远行的想法一样整所有仍指甲掐上手心被。

var holeFixtureDef = new b2FixtureDef;
holeFixtureDef.shape = new b2CircleShape(0.5);
holeFixtureDef.isSensor = true;

平等年前自己离家,一底下迈入大学的底土地,把坏就也自读与活唠叨不鸣金收兵的老爸,留在了话筒里。

流淌: 其性状也可知感知碰撞不有相撞反应
  2). 落袋有效区域易
  球袋和球的区域相交时, 并无代表球就进洞. 如下图所示:
  上海葡京国际会所 4
  注: 红球刚好和球袋区域相交, 但红球重心并不曾落入球袋的得力限制内.
  为了到解决球进洞的逻辑判断, 我们出少数种思路去解决. 
  一种植思路为: 从今生的冲击接触对象b2Contact中, 计算两者的去,
若两者圆心距离小于球袋半径, 则算进洞, 否则无算.
  另一样种植思路, 是做一个trick的技术, 构造一个半径 = 球袋半径 – 球半径,
圆心依旧是球袋中心的周到
, 并代替作为球袋的box2d物理模型. 该圆若与球相交,
则可以认为球重心落入球袋区域. 这可无去前者的计算.
  上海葡京国际会所 5
  注: 绿色的内部圆即是构造之球袋核心圆, 其表的应有尽有是大体表象的圆.
该现象吧球和球袋相交, 但球重心和中间宏观没有轧,
即重心没有落入球袋区域.
  环绕球袋本身的3/4周, 则采用多边形来逼近模拟(样例采用16边形),
这吗是防球有中区域(实际上这可以忽略).
  • 圆球放置
  我们且亮, 台球模拟, 最艰苦的再三是开球的时候. 一堆球挤在联名,
每个转, 都来成百上千球彼此相互接触.
  球体的积其实是产生技巧的, 摆放的圆球不需每个都艰难临的,
可以适宜的留些空隙. 如下所示:
  上海葡京国际会所 6
  • 完全法
  由于用垂直视角看台球桌面, 重力方向是依赖于中. 创建世界对象时,
可概括设置gravity也零向量.

自身个性独立,脾气刚烈,不喜为不擅与人口来往。一夹眼睛才看见这之外世界之妙,却看不显现那么扒着电动车及送自己失去公交站牌提在我行李箱的老爸。

var world = new b2World(new b2Vec2(0, 0), true)

就之外的世界真好哎,走不了事的马路,吃不完的拼盘,逛不结的风光,每天她还动上前走来自我之活。

如若台球桌面本身的摩擦阻力, 由于台球游戏在box2社会风气, 没有是相关物理物体,
因此我们得设置球的线速度减震来模拟台球桌摩擦阻力.

自整整人口同可新鲜的状态,欣喜二十年来直接让老爸所界定的肆意,终于画上完美的句号。

ballBodyDef.linearDamping = 0.25;

自得一整天不叠被子,可以打台球唱唱喝啤酒,可以整夜到凌晨五碰半才转宿舍……这无异年,这大学世界面临的具有惊喜,都仿若等待自己平同等去征服。

末了台球游戏整体的box2d大体模型, 对转移为如下图:
上海葡京国际会所 7
  • 进球处理
  球进球袋后, 需要消失, 可以知晓为该球从box2d之大体世界面临消除.
  对于拍反应, box2d供了简单栽方法去处理.
  1). 注册ContactListener方式
  2). 遍历ContactList列表
  样例代码应用第二种艺术, 原盖如下:
  1).
ContactListener的回调处于step的拟过程遭到, box2d明确规定step模拟过程被,
不允许修改物理性
.
  2). 由于台球游戏之体个数并无多,
因此遍历ContactList列表其性质是不过承受的.

本人是那样地忙碌,忙在读书,忙在班里,忙在当当时所陌生的都市去过一样了恣意汪洋的风流人生。在初期的一半年里,我几完美由一坏电话回家,有时还是只要隔半单月,一整年都没有用完二百块的话费。

/* 清除落入袋中球 */
var contactList = world.GetContactList();
for ( var contact = contactList; contact; contact = contact.GetNext() ) {
    if ( !contact.IsTouching() ) {   /* 接触只代表AABB重合 但不代表形体碰撞 */
        continue;
    }
    var b1 = contact.GetFixtureA().GetBody();
    var b2 = contact.GetFixtureB().GetBody();

    if (b1.GetUserData() && b2.GetUserData()) {
        if (b1.GetUserData() === BALL_TYPE.BG_HOLE_TYPE && b2.GetUserData() === BALL_TYPE.BG_BALL_TYPE ) {
            world.DestroyBody(b2);
        }
        if ( b2.GetUserData() === BALL_TYPE.BG_HOLE_TYPE && b1.GetUserData() === BALL_TYPE.BG_BALL_TYPE ) {
            world.DestroyBody(b1);
        }
    }
}

当下电话是老爸的挂,却成自我的背,他非明了我而之即兴,我无晓他的焦虑。

注: 该处理代码在world.Step调用之后上行.

话筒中,老爸急急地问我。

总结:
  这边的demo图形是据box2d的DrawDebug来渲染之.
下一样步计划用精练的资料替换, 并完善台球的游戏规则. 虽然程度有限,
但感觉上迈了稳固的同步, 这种感觉格外好的.

“你用了邪?”

“你怎么十点钟尚不困?”

“学校那里冷不冷?”

“每天非常辛苦吧?”

“钱还够花啊?”

自我总是在就电话中不耐烦地报着他谈。

“知道啦”

“烦不烦啊你”

“那即便这么吧”

“我今天精疲力尽了,有空再起给你吧”

“先挂了哈”

心头嘟囔着:天啦,我爹为什么而看用是好酷之转业?我以为何要睡觉那基本上觉?我花钱来那么大方吗?我何以不能够整宿整宿的免回家?我以对讲机的立刻同匹,翻在白,翘着腿,故意冷在会。我早就二十秋了,哪里还需要如此的关爱?

但是我接连忘记,那话筒里嘟嘟的鸣响,是老爸所收的,来自海外儿子之绝无仅有信号。

很一齐学期的考复习月,也许是自无限忙碌的下。专业课非专业课的预习复习,奔波于图书馆和自习室,忙在读书及之零碎,维系着雷同段落段岌岌可危的涉嫌,处理在学院分配到班里的事体,我期盼分身乏术来搪塞着这永远忙不收场的在旁人看来理所应当都欠我失去举行的天职。

自我无空去受老婆为老爸从独电话,去咨询吃饱穿暖了没有。

不行意外,最后之一半单月,老爸居然给自家从了五不好电话。那是一向没有了之。好几不行我还迫不及待接自,说“爸,班里的从业最好多,还发了碰状况,现在忙在也”。言语中露有一丝不满跟牢骚。

老爸一句子:“爸爸有些想你了,有空回家一回吧。”让自家同一怔,有些踌躇,又看可笑,他还会想自己?

那时为高考失利使无使去补习而和自我争斗,因为填报志愿的失误而大动干戈,因为他平句被自己滚蛋而三只月无回家。他甚至说想我了?

一样句子简单的“知道了”硬生生的搪塞回去。

当法理学考卷收于的那么一刻,我想到的莫是就打个电话说一样句“老爸我怀念你了,我随即回家”,而是想着什么寻找个借口晚回几龙。我带在哥们去太原底特产店里抢购,在宿舍玩手游磕瓜子,硬是当实在没意思才办东西回家。

本身记忆那天,开门的凡老爸,面容惨白,有气无力,额头出汗。我先是潮看是喜欢唠唠叨叨在自身在里狂的先生还是老矣。

老爸的率先句话不是“回来了”,而是“孩儿,下午及爸去医院吧,爸心脏有硌难被。”声音沙哑,嘴唇干裂,满头冷汗。

对接下的均等龙,因为大病问题想只要开始转院证明,这个病怏怏的先生当卫生局从同楼到四楼来来回回跑了十几蹩脚;因为程序因在急诊部辗转一个而且一个诊室上海葡京国际会所而着急血压飙高;因为胸闷气短浑身没能力而睡在病榻一动不动……

自是在父亲患一直错过之早晚,瞬间发现及温馨长大了,这种感觉甚痛苦,让“学习就是行,家里的另从事发生外”成为了千夫所依赖的叛逆。

原先父亲,也会见痛。爸爸只有是直在胜忍在 ,忙在做作为父母应该举行的事
,用故作坚强来顶住年龄的重担。

于放假至小年,我还记不清了父子俩更了什么。

老子并未完没了底抽血化验,一不好同不良的病重通知,忽快忽慢的呼吸声,一点且吃不生的饭量,浑身插满监护器和管子,扎到滞胀黑青的手背,打至终极都不痛的肚皮针。

他人放假一寒口进年货高兴的过年,我一身绝望的呆在心血管医院及同一多老太太早于排队抢饭数在钱勉强过在。办住院,喂饭,洗碗,搓澡,换药,最后一个人数拘禁在各种手术危险硬生生的惨无人道下心签字把大人送上了手术台,我在挺缺乏日含在泪花一下子长大了。

自我在别人眼中成了懂事的孩子,而自己可明白自己,只是不落娇罢了,只是适应了条件做懂事的男女,适应了人家擦把他算大人的眼力,懂事的孩子,也就是亲骨肉。

夫近乎五十夏的汉子,也肩膀耸动,鼻尖通红,眼泪像断线的串珠,流满了整理张脸,他拘留正在平等步一步自己的小子直至手术室门关上,竟伤心地哭成了子女。

人家四五十夏经历的从事本身提前了二十年。我抱怨在大的人为什么那么非争气,为什么吃自身早日担起这个小之重负,却忘记心疼我之翁得矣人家七八十岁才得之大病。

偶还要觉得,我真正吓自私,我真好没有因此,我上上没完结最好好将不交又多的奖学金,生活遭要么多还是有失以及他人的涉处在崩溃的边缘,我天真的终究以为爸爸还年轻自己还不怎么那些生老病死的事离得自己最远太远。

可是生而为人,哪来哪个之人生会一帆风顺呢?

一半年后的今天,爸爸又住院,睡梦被他哼着歌,我之心房也只听见酸楚。

妈妈缝针的手多会儿抽线,奶奶经常吓时机坏的胃部多会儿好转,我陪侍的立刻几龙内洗衣做饭的活着来没有人干,我而能否按期开学报道让全班把开作一起为全班觉得我这班长称职?

怀念在想在,爸爸打起了鼾声。

旋即同潮,我尚未为难了到落泪,我眷恋,我之泪水应该是流为他起床出院的那天。