当前位置: 首页 > 科技观察

从零开始23天完成一个Android游戏开发(7)_0

时间:2023-03-13 05:28:36 科技观察

本文是本系列的第七篇,记录了作者从第18天到第20天的情况。第18天:带有循环冲突的外星图形,完美的子弹轨迹今天我受够了“射月”错误。有时外星人即使出现在屏幕上也可能会错过。我做了很多测试,用外星人填充屏幕并使月亮半透明以查明此错误的原因。我发现测试命中区域的坐标移动了一位,但即使修复了这个问题,原来的错误仍然存??在。外星人图形不能简单的用圆圈覆盖,否则玩家要么射不到外星人,要么射中躲在月亮下的外星人。所以我决定使用循环检查。由于月球比外星人大很多,因此很容易检查外星人图形边缘的四个点都在圆形月球内部。为了进行测试,我使用了libGDX的内置ShapeRender类。具体实现代码如下:shapeRenderer.setProjectionMatrix(camera.combined);shapeRenderer.begin(ShapeType.Circle);shapeRenderer.setColor(1,1,1,1);shapeRenderer。圆(sMoon.getX()+119,sMoon.getY()+116,167);shapeRenderer.end();上面的代码是在SpriteBatch完成后添加的,沿着月球表面绘制了一个白色的圆圈。同样,为外星人边界画一个矩形。测试点是否在圆内的一种有效方法不是计算平方根(速度较慢),而是比较距离的平方。libGDX的内置函数Circle.contains(x,y)正是这样做的,所以我用这个函数来检查。事实证明,这种方法非常有效。我在半径长度上加了一些像素值,因为所有的外星人之间都会有一些空隙。我对修改的结果很满意。完美的子弹轨迹在这个游戏中,子弹从屏幕底部50像素的距离发射。我使用函数atan2使子弹旋转并击中目标,但我的代码中存在一些错误,并且在未击中目标时不断弹出错误。要理解这部分,请注意本游戏中的所有投篮均使用HitScan策略。译注:HitScan与射击目标相反,意思是发射的子弹不瞄准任何目标,而是摧毁子弹轨迹上的任何物体。现在,代码在未击中目标时将子弹轨迹延伸到屏幕末尾,而之前的代码将末尾设置得太远。由于子弹的飞行使用中间位置,结果看起来有一个很大的跳跃,并且在子弹离开屏幕之前只能看到2或3个点。通过将终点设置为屏幕边缘修复了此问题,现在您可以清楚地看到子弹飞过。这时又暴露出另一个问题:有时子弹距离玩家触摸的屏幕点只有10到20个像素。出现这个问题的原因有以下三个。对于第一个问题,我使用了子弹的X和Y坐标。由于此坐标位于屏幕的底角。通过将子弹的中心坐标增加一半的宽度和高度解决了这个问题。但是还是有一些子弹没射中。第二个问题,我忘了设置原点,所以子弹绕着左下角旋转。这个问题也解决了,但是还是有一些子弹射向了屏幕的左边,没有命中。第三个问题,我意识到子弹旋转时宽度和高度是变化的,所以旋转后需要重新计算子弹的中心点。已修复此问题,以便从玩家触摸的地方正确发射子弹。修改后的代码如下://BulletflightLaserBulletlb=newLaserBullet(tUI,65,64,20,40);lb.setPosition(0,-450);lb.setOrigin(10,20);lb.setRotation((浮动)(Math.atan2(-x,450f+y)*180f/Math.PI));Rectangler=lb.getBoundingRectangle();x=(int)(x-r.width*0.5f);y=(int)(y-r.height*0.5f);lb.target.set(x,y);bullets.add(lb);Tween.to(lb,SpriteTweenAccessor.POSITION_XY,delay).target(x,y).start(tweenManager);Day19:DailyChallengesandTasks每日挑战是收集5个字母,操作方法同道具。收集完所有字母后,您可以获得一些可用于购买道具的游戏内货币。这是一种通过玩受地铁跑酷启发的游戏来赚取金币的简单方法。任务由许多子任务组成,完成这些子任务可以获得金币。硬币可用于购买升级和消耗品,例如盔甲、炸弹等。每日任务由三部分组成,您必须完成所有三个子任务才能获得奖励。我发现使用内置的文本换行来显示任务更简单。但是行高会显得太大,直接修改代码没有办法降低行高。所以我选择编辑BMFont生成的.fnt文件,做如下调整:lineHeight=33变成lineHeight=23当我开始生成位图时,我在字母周围添加了5像素的阴影,所以现在我需要降低高度10像素(上方5像素,下方5像素)。在为此寻找文档时,我发现了我之前遗漏的一些东西:在为游戏选择字体时,可能数字看起来不太好。1号看起来修长,而11号看起来怪怪的。为了解决这个问题,可以给图中的字体设置一个固定的宽度。font.setFixedWidthGlyphs("0123456789");这样的效果会很好看。但是,由于已经决定使用slim字体,因此没有使用固定宽度。Day20:每周挑战,用户数据持久化,JavaDate灾难每周挑战是在一周内收集一定数量的星星,可以获得一些优秀的奖励,比如8颗原子弹,5个防具等等,我做了一个不错的金星使用Gimp并尝试了不同的闪烁和星光效果,但这些效果看起来并不是特别好。于是想到了power-up的粒子效果,一直改到满足star的要求。星星现在有自己的闪烁节奏,星星和道具可以同时显示在屏幕上。我还添加了播放器数据的加载和保存。这比我想象的要简单。我以为我必须学习一些Android数据存储API,但是libGDX提供了简单的键值存储类。只需调用以下代码进行初始化:Preferencesprefs=Gdx.app.getPreferences("DroneInvaders");然后使用get("key",defaultValue)和set(key,value)来读写值。我遇到的唯一麻烦是时间问题。为了跟踪每天和每周的挑战,必须存储上次玩游戏的时间。当玩家开始游戏时,系统会比较这个时间并重置一些计数器。理论上我可以阻止玩家将系统日历更改为过去的时间,但我不想那样做。当时间倒流时,我所做的是设置新的每日挑战和每周挑战,并重置星星和收集的字母数量。为了实现这个功能,需要获取上次玩游戏的时间,并计算与当前时间的差值。是同一天、一天前还是几天前都会影响计算结果。我用谷歌搜索,发现许多网站都在讨论这个问题以及StackOverflow问题。大多数答案都很搞笑。很多程序员只是单纯计算秒差然后除以60*60*24得到天数,完全忽略了夏令时和闰秒。有些人可能会争辩说,这种差异对于游戏来说并不重要。但我不喜欢每年收到2次大量错误报告。其他人只是简单地将开始日期到结束日期的天数相加。循环看起来是正确的,但计算仍然会损失一些时间。比如1月1日早上5点存了一个对象,然后你计算1月2日23:00的时差,第一个时间点加1天还是小于第二个时间点。但是按照他们的计算方式,实际增加了2天。我在这种情况下使用的一个技巧是始终将上一场比赛的日期设置为上午10点,将最后一场比赛的日期设置为下午5点。尽管DST总是在晚上变化,但此设置是安全的。因为即使有一天有人决定夏令时更改发生在中午,中间仍然有7个小时。相关:在23天内从头开始开发一个Android游戏(1)在23天内从头开始开发一个Android游戏(2)在23天内从头开始开发一个Android游戏(3)在23天内从头开始开发一个Android游戏Android游戏开发(4)从零开始23天完成一个安卓游戏开发(5)从零开始23天完成一个安卓游戏开发(6)从零开始23天完成一个安卓游戏开发(8)翻译:bigosaurImportNew.comTranslation链接:http://www.importnew.com/6897.html