Pygame程序设计边界碰撞检测总结

24 2021-11-20 12:54

Pygame程序设计边界碰撞检测总结

一、 背景图设计历程

1. 一张背景走天下

将背景图真的想成纯纯的场景背景。在背景下发生游戏中的故事。除了能动的和需要接触的之外,都是背景的东西。

因为设计中马路两侧不允许随意穿行。所以起初在想用防护栏或者地砖来围起马路,但是这种砖和护栏,都是规矩的长方形,很难设计拐弯。不自然、不协调。遂放弃。

后来想起参考网上的迷宫墙体。大部分也都是用颜色图块来生成。但是,搜索过程中有幸搜到了mask的像素级完美碰撞。觉得这是一个突破口。

于是将马路两侧用黑线勾勒描出。然后判断碰撞非透明颜色,然后再判断颜色是否是黑色,若是黑色隔离带,那么认为不可通过。

于是问题来了,什么是黑,背景图转化过程中,边缘的羽化、透明度,都是渐变的。靠RGB+alpha值来判定碰撞。阈值确定让人想想就头大。重新去看迷宫游戏,又找到了超级玛丽的游戏复刻。觉得自己好容易被分散注意力啊。

回来尝试研究screen上blit以及background上blit的区别。发现国内各种翻译什么是blit的什么位块传送、块移。说不清是覆盖、嵌入、钳入(螃蟹么)、粘贴、遮盖。最后只能从函数返回值的底层观念安慰自己:这多年的面向对象编程。让我知道,函数之所以返回值,拷贝副本,返还新的碗给你装吐出来的东西。就是因为不想自身受到影响。函数本身在意的是过程。并不想各种结果会导致自身功能的变化。但是

函数都是改变他人,但是对象里的函数都是改变自己。这个自己对应的不是函数而是对象。

所以那么blit应该是改变了surface本身,融合进去了。

最后确立方案,就是背景是一回事,背景的阻碍、再描边来探测障碍碰撞是另一回事。

再后来,更新了怕重复描边越描越黑的情况,就将边界从原背景中删除了。

2. 多张背景各司其职

背景就是灰色马路、透明的街角、白色的人行横道。

屏幕填充白色,上面盖上背景。那么街角就是白的了。

然后上面再盖上马路两侧的围挡,以免行人去送人头。

然后在以上三层不断刷新的情况下。各种精灵登场:有外星人换了皮肤当车的、有玩家开着坦克后期会制作成小人的、还有一杆小红旗用来得分的、还有一块记分牌。

二、 碰撞设计历程

这里有三段视频,里面还有一些慢慢更改的小细节,由于没有及时记录下来。虽然冥思苦想浪费了许久的时光,但是不愿意再复现当年的错误了。就拿这三段现存记录说事吧。

 

1. 第一段

讲述了一个很激动的初次上路的人(这时候还是用坦克代替)。撞上了马路牙子,倒栽葱一般陷进去了。当时的设计就是碰到马路边界就会马上停止,然后反向加速退出。

但是实现起来却是,它搁那儿抖,你是抖M么,吓唬谁呢。然后嚎嘛,卡住了,不动了。不动就不动吧,本来设计就是让你停下的,但是没想到你卡进去了。想着谁是内鬼中光子公司用了多少个月?几年?来修复各种卡bug、卡盒子的?我到哪里去找原因?

然后一顿操作猛如虎,竟然真的上窜下跳之后卡出来了。顺道还学会了新技能。那就是当你横着卡进墙的时候,你获得了纵向加倍的技能。我靠,进马路之前你娇羞怯懦。上了马路你开始报复性消费了。往上走就是加倍下沉,往下走就是双倍飞升。最后看你死不死啊。

2. 第二段

讲述了一个骂骂咧咧却胆战心惊的再生小人,尝试撞墙的故事。

当他碰到墙的时候,他疼的闭上了眼睛。于是整个世界安静了。连马路上的车都给吓停了。虽然有点儿科幻。但是很符合超时空电影的主观能动。就是我不动,敌也不能动。谁让我有主角光环呢。

成功解决了卡进墙的问题。顺便限制了不能斜着走的问题。知道为什么斜飞会变快么?就是当扫描到你向前的按键和向一侧(比如右)的按键同时按住时,你既要向前走,又不耽误向右走,于是你的速度从原来设定的1,变成了45度的根号2,1.414,你说快不快,你是不是又超脱了这个世界对你的限制?现在好了。你只能选择要么横着走、要么竖着走。你没有八个方向的特权了。虽然你可以扭扭捏捏的完成斜着走,那就是你单身手速去模拟了,腿是迈不开的。

Ps:虽然简单的限制了斜飞,但是横向和纵向并不平等,这若不是一个专业测试员是感觉不出来,甚至不会有这种大胆想法的。除非他有见地的去想,当我竖着走的时候,我脑子横着想一下会怎样。结果,真的腿也横过来了。但是横着走的时候,竖着想是白日梦。

 

到底如何不撞入墙里呢。问题的原因就是横着撞进去的时候反弹回来,但是反弹的时候依然还有按键命令在前进,那么就暂停一下好不啦?于是就发生了时间停止的大事件。虽然很影响体感,但是正好让用户静下心来不要那么执着和冲动。

3. 第三段

好吧,睡了一觉觉得还是不能让环境被人的意志所转移,要不然岂不是有点儿唯心主义了。

于是这一段重新去找回逻辑。梳理了思路。想到了之前撞墙之后需要做的就是停止。而反弹是包含在继续前进的动作判断里面。

想明白之后,把反弹单独做出来,然后放到停止之后赶紧补救一下。

 

于是,世界不会再等你喊疼而停止了。抖动的仅仅还是你一个人的苦痛。

重新设计了水平和垂直的按键响应规则,又能愉快的斜飞了。

 

 

 

 

 

 

全部评论

·