位置: 编程技术 - 正文

我是如何从0开始,在23天里完成一款Android游戏开发的 – Part7– 第18至第20天(从零开始咋样)

编辑:rootadmin

推荐整理分享我是如何从0开始,在23天里完成一款Android游戏开发的 – Part7– 第18至第20天(从零开始咋样),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:如何从0开始赚钱,什么是从零开始,从零开始怎么办,从0开始,我是如何从0开始做到年入1000+万的,我是如何从0开始做到年入1000+万的创业笔记,我是如何从0开始做到年入1000+万的,我是如何从0开始做到年入1000+万的,内容如对您有帮助,希望把文章链接给更多的朋友!

第天:外星人图形与圆形冲突、完美的子弹轨迹

今天我受够了“射击月亮”bug。有时候外星人即使在屏幕中出现,也可能射不中。我做了大量测试,在屏幕上布满外星人并且设置月亮半透明以定位这个bug的原因。我发现测试击中区域的坐标偏移了一个bit位,但即使解决了这个问题原先的bug依然存在。外星人图形不能简单用圆形覆盖,否则玩家要么射不到外星人,要么会射到隐蔽在月亮下的外星人。

所以我决定使用圆形检查。由于月亮比外星人大很多,能够很容易地检查外星人图形边缘的四个点是否都在圆形月亮内。为了测试,我使用libGDX内置的ShapeRender类,具体的实现代码如下:

shapeRenderer.setProjectionMatrix(camera.combined);shapeRenderer.begin(ShapeType.Circle);shapeRenderer.setColor(1,1,1,1);shapeRenderer.circle(sMoon.getX() &#; , sMoon.getY() &#; ,);shapeRenderer.end();

上面的代码加在SpriteBatch完成以后,沿着月亮表面画白色的圆圈。类&#;地,给外星人边界画上长方形。

测试一个点是否在圆内的高效方法不是计算平方根(速度较慢)而是比较距离的平方。libGDX的内置函数Circle.contains(x,y)恰好实现了这个功能,所以我使用了这个函数进行检查。事实证明这个方法非常有效。我为半径长度增加了一些像素&#;,因为所有外星人之间会有一些间隔。改动后的结果令我非常满意。

完美的子弹轨迹

在这个游戏中,子弹是从距离屏幕下方像素&#;的地方发射的。我使用了函数atan2让子弹旋转着击中目标,但我的代码中有一些错误,在没有射中目标时错误会经常出现。为了理解这部分内容,请注意在这个游戏所有的射击都采用了HitScan策略。

译注:HitScan与射击目标相对,指的是射击出的子弹不针对任何目标而是摧毁子弹运行轨迹上的任何物体。

在没有射中目标时,现在的代码将子弹轨迹延伸到屏幕尽头,而以前的代码把尽头设置得太远。由于子弹的飞行使用了中间位置,结果看上去有很大的跳跃并且在子弹射出屏幕之前只能看到2、3个点。通过把结束点设置到屏幕的边缘来解决了这个问题,现在你能清楚地看到子弹在飞行。

这时又暴露出另外一个问题:子弹有时候距离玩家接触的屏幕点只有到个像素点。导致这个问题有三个原因。第一个问题,我使用了子弹的X坐标和Y坐标。由于这个坐标位于屏幕底部的角落。通过把子弹的中心坐标加上一半的宽和高解决了这个问题。但仍有一些子弹没有射中。第二个问题,我忘记设置原点,所以子弹围绕着左下角进行旋转。这个问题也解决了,但仍有一些朝屏幕左边射射出的子弹没有射中。

第三个问题,我意识到当子弹旋转时宽度和高度是在变化的,所以子弹的中心点需要在旋转后需要重新计算。解决了这个问题,子弹就能正确地从玩家触摸的地方射击。修改后的代码如下:

// 子弹飞行LaserBullet lb = newLaserBullet(tUI, ,,,);lb.setPosition(0, -);lb.setOrigin(,);lb.setRotation( (float)(Math.atan2(-x, f&#;y) * f / Math.PI) );Rectangle r = 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);

第天:每日挑战和任务

我是如何从0开始,在23天里完成一款Android游戏开发的 – Part7– 第18至第20天(从零开始咋样)

每日挑战是收集5个字母,操作方式和道具一样。一旦收集了所有字母,就可以得到一些用于购买道具的游戏币。这是一个通过玩游戏获取硬币的简单方法,这个灵感是受到“地铁跑酷”(Subway Surfers)的启发。

任务由许多子任务组成,通过完成这些子任务可以赚取硬币。硬币可以用于购买升级道具和消费物质,如盔甲、炸弹等等。每天的任务由三部分组成,你必须完成所有三项子任务才能获得奖励。

我发现使用内置的文本换行来显示任务比较简单。然而行高会显得过大,而且直接修改代码没有办法减小行高。因此我选择编辑由BMFont生成的.fnt文件,进行如下调整:

1lineHeight=

变成

1lineHeight=

在开始生成位图时,我在字母的四周增加了5个像素的阴影,所以现在需要把高度减少了像素(上面减少5像素,下面减少5像素)。

在为此查找文档时,我发现了一些先前遗漏的问题:在为游戏选择字体时,可能数字看起来效果不是很好。数字1看起来很修长,而数字看起来很奇怪。要解决这个问题,可以为图中的字体设置固定宽度。

1font.setFixedWidthGlyphs("");

这样效果看起来会非常好。但由于已经决定使用修长字体,因而没有采用固定宽度。

第天:周挑战、用户数据持久化、Java日期灾难

周挑战是在一周内收集特定数目的星星,从而获得一些优异的奖励,如8个原子弹、5个盔甲等等。我用Gimp做了一个很棒的金色星星并在尝试了不同的闪烁和星光效果,但是这些看上去效果不是特别好。所以我想到了强化道具的粒子效果,对它进行改变直到满足星星的要求。星星有了自己的闪烁节奏,而且可以在屏幕上同时显示星星和强化道具。

我还添加了玩家数据的加载和保存。这个比我想象中要简单。我以为必须学习一些Android的数据存储API,但libGDX提供了简单键&#;存储类。只要调用以下代码进行初始化:

1Preferences prefs = Gdx.app.getPreferences("DroneInvaders");

然后使用get(“key”, defaultValute)和set(key,value)进行&#;的读写。

我唯一遇到的麻烦是时间问题。为了持续跟踪天挑战和周挑战,必须存储最后玩游戏的时间。当玩家开始游戏,系统比较这个时间并重新设置一些计数器。理论上我可以阻止玩家将系统日历修改到过去的时间,但是我不想这么做。当时间回滚时,我所做的是设置新的每日挑战和周挑战并且重置星星和搜集到的字母个数。

为了实现这个功能,必须获取上一次玩游戏的时间并计算与当前的时间差。是否是同一天、一天前或几天前都会影响计算结果。我在谷歌上搜索到很多讨论这个问题的网站以及StackOverflow问题。大多数答案很好笑。许多程序员简单地用相差的秒数来计算时间差,然后除以**得到天数,完全忽略了夏令时和闰秒。有人会争辩说,对一个游戏来说这个差别影响不大。但是我不喜欢每年收到2次大量的bug报告。另一些家伙简单地通过从开始到结束日期一天天累加天数。这些循环看起来是正确的,但是计算结果还是会丢失了部分时间。比如一个对象在1月1号上午5点存储了,然后你在1月2好晚上点计算时间差,在第一个时间点上加上1天仍然比第二个时间点少。但是按他们的计算方法,实际增加了2天。

在这种情况下,我使用的一个技巧是总是设置前一次游戏的日期为早上点,而设置最后一次游戏的日期为下午5点。尽管夏令时总是在晚上改变,但是这个设置是安全的。因为即使如果有一天有人决定夏令时的变化发生在中午,在这之间同样也有7个小时。

我是如何从0开始,在天里完成一款Android游戏开发的 – Part6– 第至第天 第天:Android后退按钮、主菜单、固定坐标bug还记得第天屏幕坐标和鼠标点击射击不到外星人的问题吗?是的,那都是我的错。幸运的是这让我及时发

我是如何从0开始,在天里完成一款Android游戏开发的 – Part8– 第至第天 第天:Android游戏的商业化我做这个游戏只是一个尝试,没指望它挣很多的钱。游戏可以免费下载,如果你愿意可以购买游戏里的金币。我喜欢这种类

Android游戏开发十日通(7)- 开发一个双人游戏 提要游戏需要分享才能获得快乐,想想你以前玩过的那些游戏,那些会是真正地存在你婶婶的脑海里?是独自一人躲在被窝里酣战PSP,还是和哥们在网

标签: 从零开始咋样

本文链接地址:https://www.jiuchutong.com/biancheng/371198.html 转载请保留说明!

上一篇:我是如何从0开始,在23天里完成一款Android游戏开发的 – Part5– 第12至第14天(怎样从零开始)

下一篇:我是如何从0开始,在23天里完成一款Android游戏开发的 – Part6– 第15至第17天(什么是从零开始)

  • 法律会计审计咨询合同需要缴纳印花税吗
  • 小规模纳税人固定资产可以一次扣除吗
  • 一般纳税人金税盘全额抵扣分录
  • 印花税按照开票金额缴纳可以吗
  • T3现金流量表怎么删除
  • 投资性房地产转换日公允价值大于账面价值
  • 年终奖社保怎么算
  • 购车 买车
  • 增值税期末留抵税额的账务处理
  • 境外所得抵免税额是什么意思
  • 收到的借款利息计入什么科目
  • 已开专票在哪里查询
  • 企业为一般纳税人税率多少
  • 企业为员工提供住宿会计科目
  • 个体不超过10万怎么交税
  • 500元以下不需要发票
  • 工程收入怎么算
  • 年度终了,会计部门都要将旧账编造清册
  • 一般纳税人是什么发票
  • 新成立的公司需要报残保金吗
  • 公司为员工交的社保比例
  • 交易性金融资产属于流动资产
  • 拆迁以后
  • 分配股利会稀释股权吗
  • uniapp动态设置标题
  • 房贷计算器搜房网
  • php正则匹配中文
  • vue router怎么传值
  • 土增税清算时怎么做会计分录
  • 留抵税额是认证过的发票吗
  • php 重写 重载
  • 扣发工资是发还是不发
  • 酒店押金的账务处理
  • 估价入库怎么记账
  • 带折扣的发票如何入账
  • 报税财务报表一定要填吗
  • 织梦模板首页logo修改
  • python rem
  • 股东分红的会计分录怎么做
  • 新会计制度固定资产对应科目
  • sql优化的方法及思路
  • 预计净残值是怎么算出来的
  • 银行承兑到期后未兑付
  • 去年的亏损今年第一季度可以弥补吗
  • 收到建筑发票会计分录
  • 培训学校预收学费可退吗
  • 期末没有结账成本怎么办
  • 税务报表工会经费是按什么交了
  • 会计做假账的果报
  • 商业批发是什么意思
  • Microsoft SQLServer的版本区别及选择
  • sqlserver数据库和mysql区别
  • mac安装mysql的两种方法(含配置)
  • Ubuntu Kylin 14.10默认的屏幕分辨率怎么更改?
  • mac设置启动系统
  • vcdcontroltool
  • xp系统删除用户账户怎么没有删除键
  • SmartExplorer.exe - SmartExplorer进程是什么意思
  • linux系统添加用户的命令
  • windows8怎么打开开始菜单
  • win10快速隐藏窗口
  • 苹果电脑bim
  • win7 64位旗舰版下载后怎样禁用搜索记录?win7禁用搜索记录的设置方法
  • cocos2dx游戏案例
  • android opengles2.0教程
  • css优化提高性能的方法有哪些
  • shell脚本常用命令及操作
  • mac如何打开两个微信
  • unity控制相机旋转
  • jqurey+Jscex打造游戏力度条
  • 亲测源码论坛
  • 国家税务总局票据丢失罚款标准
  • 国家税务局服务宗旨是什么
  • 最新设立税务师事务条件
  • 税务核查是什么意思
  • 江苏国税,地税怎么交
  • 国家税务总局2018年61号公告
  • 德阳契税2021年新规
  • 免税开普票还是专票
  • 中山火炬开发区建设发展有限公司
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设