位置: 编程技术 - 正文

Android游戏开发十日通(7)- 开发一个双人游戏(Android游戏开发教程)

编辑:rootadmin
提要

推荐整理分享Android游戏开发十日通(7)- 开发一个双人游戏(Android游戏开发教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:Android游戏开发实训总结,Android游戏开发书籍,android游戏开发框架,Android游戏开发入门,Android游戏开发读后感,android游戏开发框架,android游戏开发框架,Android游戏开发教程,内容如对您有帮助,希望把文章链接给更多的朋友!

游戏需要分享才能获得快乐,想想你以前玩过的那些游戏,那些会是真正地存在你婶婶的脑海里?是独自一人躲在被窝里酣战PSP,还是和哥们在网吧一起开黑?是一个人单刷迅龙三连,还是和朋友联机怒刷黄黑龙?

从来没有孤独的快乐,也从来没有孤独的游戏。

今天要做的就是一个非常简单但有有点复杂的双人游戏-Air Hockey。

通过这篇教程,你可以学到

1.cocos2d-x的生命周期;

2.如何让游戏兼容各种屏幕;

3.如何处理多点触控;

4.如何模拟斜碰...

创建游戏

还是老套路

终端进入 cocos2d-x-2.2/tools/project-creator/ ,执行./create_project.py -project AirHockey -package com.maclab.airhockey -language cpp在 /cocos2d-x-2.2/projects/AirHockey 中就有创建好的各平台的工程模板。修改proj.android 下build_native.sh,添加一行指定NDK_ROOT在eclipse中导入proj.android 工程,记得不要勾Copy to Project into workspace.如果之前未将 /cocos2d-x-2.2/cocos2dx/platform/android/java 导入,在这里要导入。创建软链接,终端进入 pro.android,执行命令:ln -s ../Resources ./Resources在Eclipse中刷新工程,Resources文件夹就出现了。换一个狂拽酷炫点的图标

将android工程中res文件夹下的icon.png换成这个就可以了。在项目上右击,run as->android application一切顺利的话工程就创建好了,如果没法运行,检查cocos2dx是否配置好。

cocos2d-x的生命周期

这个问题上一篇教程直接略过了,这里来仔细分析下。

AirHockey文件夹下有一个Classes文件夹和几个pro.*文件夹,Classes文件夹有两个类,一个AppDelegate,似私有继承自cocos2d::CCApplication,一个HelloWorldScence类,共有继承自cocos2d::CCLayer。

大部分框架,基本上都可以分为两部分: 1. 一个入口主类,它定义了整个应用程序的生命周期,并提供一些全局的资源 2. 一些绘制到屏幕上的“页面”控件。

在cocos2d中,CCApplication主要做三件事情: 1. 控制应用程序的生命周期 2. 提供和管理一些全局的资源 3. 处理Touch 4. 循环绘制界面应用程序的生命周期有一下几个虚方法:applicationDidFinishLaunching();资源加载完成之后发生applicationDidEnterBackground();程序进入后台被挂起applicationWillEnterForeground();程序从后台被唤醒

下面是AppDelegate.cpp的内容

HelloWorldScence这个类就不多说了,所有游戏的逻辑,显示...都在这里调用,如果你还不熟悉,参考:Android游戏开发十日通(6)- 太空大战

下面是看linux和Android中怎样启动游戏的。

首先看pro.linux下的代码,只有一个main.cpp

CCEGLView封装了使用openGL作为显示底层API的一个基本的窗体的创建和控制,在linux中,窗口用的是GLFW库。

main中第一行生命了一个AppDelegate对象,第二行初始化一个CCEGLView指针,sharedOpenGLView中的内容如下:

就是new一个对象。第三行设置窗口的大小,

我们再看看CCApplication::sharedApplication()->run()执行的又是什么东西。

总结一下,做了下面几件事:

(1)首先先获取当前系统的频率和计数。这是一个很大的值,所以用了一个LARGE_INTEGER型变量来存储。(2)调用子类的applicationDidFinishLaunching(),执行进入程序后的一些初始化工作。(3)获取CCEGLView单例,显示窗口。(4)进入循环While(1),重绘每一帧的场景。

感兴趣的继续研究源码...

可以总结出linux下的启动流程:

再看Android平台。

Android使用的是java,cocos2d-x使用的C++,这里其实是用C++开发android程序,需要的用到技术是JNI。(不知道JNI为何物的猛击我)

看一下pro.android/jni/hellocpp/main.cpp

这里主要有两个函数:

(1)JNI_OnLoad,这个函数主要是用来告诉Android VM当前使用的是什么版本是Jni,如果不提供此函数,则默认使用Jni1.1版本。这个函数在加载交叉编译的库的时候,就会执行。(2)Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit,这个函数很明显就是运行一个cocos2d-x的应用实例了,这和Win是一样的,当然它多了一个openGlView的检测。一旦调用了它那么cocos2d-x游戏启动。接下来再看看它们是在哪里被调用的。

看一下Android工程中的主类:

cocos2dcpp是由C++交叉变异出来的库,在这里将它加载进来。这个activity是继承自Cocos3dxActivity,我们知道android应用的生命周期都是从onCreate开始的,在Cocos3dxActivity的onCreate方法中。调用了一个init函数,内容如下:在这里Cocos2dxActivity做的就是创建Cocos2dxGLSurfaceView,并设置了Cocos2dxRenderer和Cocos2dxEditText,然后添加到FramLayout。

而NativeIint方法在则在Cocos2dxRenderer中被调用:

最后总结层次调用关系如下:

是不是有点头晕~_~,没关系,别忘了我们最初的目标 - 做狂拽炫酷的游戏!

为游戏支持不同分辨率的屏幕

要让游戏在不同分辨率下都获得良好的用户体验,应该满足这几个要求:背景图填满整个画面,不出现黑边;背景图的主要内容都显示在屏幕上,尽可能少的裁剪图片(减少超出屏幕可视区域的部分);如果背景图需要放大,尽可能减小放大的比例,避免放大后出现明显的模糊;用户界面的文字标签、按钮在任何分辨率下都应该完整显示,并且容易交互。

相信很多游戏开发者开发者选择ios作为首选开发平台的一个主要原因就是IOS没有坑爹的碎片化,系统没有碎片化,屏幕没有碎片化, 机器性能没有碎片化....但到了Android,一切就成了噩梦。

一个解决屏幕碎片化的方法就是为不同的屏幕分辨率准备不同的资源文件。另一种方法是按比例缩放。

缩放比例的做法比较方便,在AppDelegate::applicationDidFinishLaunching()中添加代码:

在这里,设定 超过这个或者小于这个分辨率,cocos2d-x会做自适应处理。第三个参数是自适应分辨率的规则,有3种kResolutionExactFit 在指定的应用的现实区域会尝试去保持原始比例,但是有可能会发生变形,这时候你的应用将会被拉伸或者压缩kResolutionNoBorder 在指定的应用文件区域内不会出现变形,但是可以能有一些裁剪kResolutionShowAll 在指定的应用文件区域内不会出现变形,将保持原样。但是两边会出现黑边。

在*窗口下,正常现实的效果如下:

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(, ,kResolutionExactFit);

Android游戏开发十日通(7)- 开发一个双人游戏(Android游戏开发教程)

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(, ,kResolutionShowAll);

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(, ,kResolutionNoBorder);

如果是采用准备多套资源文件的方法,则在Resources文件夹中创建img/xhdip和img/hdip文件夹。

将下载好的图片放到对应的文件夹中,

还是修改AppDelegate.cpp的代码。

首先是添加一个结构体,在定义几个static变量:

我这里只定义了small和medium,默认的屏幕是*,因为这是我的平板的屏幕。然后修改AppDelegate::applicationDidFinishLaunching,在应用启动之后马上初始化资源。

这样,资源的搜索路径就被设置好了 -大屏幕设备加载资源时,首先查找Resources/img/xhdip,然后搜Resources;小屏幕设备加载资源时,首先查找Resources/img/hdip,然后搜Resources。

预加载音效

将资源中的*.wav文件都放到工程的Resources文件夹中。

首先修改pro.linux 下的MakeFile,

在AppDelegate.cpp中添加头文件和命名空间,在ApplicationDidFinishLanuching中添加加载的语句,创建自己的CCSprite

首先看一下何为Sprite.

Spirite是渲染框架中最小的一个单元了,游戏精灵是游戏制作中非常重要的一个概念。它是游戏内容最好的呈现。游戏开发者主要的控制对象也会是精灵。精灵对象可以是游戏画面中的任何一对象,可以是游戏中的主角,也可以是汽车,或者是一个树,一个高富帅,一个穷屌丝,哪怕是一片树叶也可以是一个精灵对象。从技术角度来看,精灵对象就是一个可以不断变化的图片,而其本身也具备了一些特殊的属性和方法,比如纹理、尺寸、翻转、透明以及角度的改变。精灵作为游戏的重要元素,最后也会被开发者新赋予一些新的逻辑或者物理属性。

下面是我们继承CCSprite的GameSprite类。

gamesprite.h

gamesprite.cpp

gameSpriteWithFIle用于从文件创建一个自动释放内存的Sprite;setPosition用于改变Sprite位置,同时更新_nextPosition; radius这个inline函数用于返回物体的半径,也就是sprite宽度的一半。

修改proj.linux/MakeFile,将新添加的 cpp 索引进来。

android版本的编译需要修改proj.android/jni/Android.mk

搭建场景

场景的搭建都在HelloWorld::init()中处理。

非常简单,无非是初始化一些变量,在场景中添加背景,添加Sprite,记分牌。激活触控,设置更新的回调函数。

运行之后的效果:

Android:、

Linux:

在析构函数中释放之前开辟的内存:

动起来

一步步来,首先是处理多点触控。

在HelloWorld.h中添加三个关于主控的函数:

网文生意,这三个函数分别在触控开始,触控移动,触控结束时调用。

这里主要要处理的问题就是手指和GamePlayer对应问题,用下面的代码就可以解决。

前四行声名了4个局部变量,i是CCSet的迭代器,touch是指向CCTouch的指针,CCPoint用于记录触碰的位置,player是一个GameSpirit的指针。

第五行遍历所有的触控点,接下来对每个触控点进行处理。第六行将迭代器转换为CCTouch指针,接下来对于当前的触控点,再遍历所有_players中的player,然后进行处理。

三个关于触控的函数的处理流程相同,不同的是做的工作不一样。

ccTouchesBegan中要做的是将触控点与对应的player连接起来,ccTouchesMoved要做的是更新player的位置,ccTouchesEnded要做的是清空触控信息。具体的实现如下:

编译,运行,我点~为什么不能动!这是为~什么!

因为根本就没有在游戏中更新player的位置啊。在HelloWorld::update中添加下面的代码:

运行效果:

碰撞检测

这里的碰撞检测要处理两个方面,一个是player和小球的碰撞,一个是墙壁和小球的碰撞。player和小球的碰撞会改变小球的运动路线,墙壁和小球碰撞,要么反弹,要么得分。

player和小球碰撞要注意一个“陷入”的问题,就是在检测的时候要预测一下小球的走位,不然小球和player就会发生重叠。

还有就是小球和player发生碰撞的情况属于斜碰,在计算的时候,首先通过player和小球的速度计算出一个附加在小球上的力,然后再计算出一个角度,最后设置小球的速度。

和墙壁的碰撞就简单一些了,也要注意陷入的问题。然后就是得分的话要更新记分牌。

最后别忘了在碰撞的时候添加音效。完整的update函数如下:

最后还要实现一个得分处理的函数,主要是更新记分牌,归位,换发球。最终效果

参考

【玩转cocos2d-x之三】cocos2d-x游戏是怎么跑起来的 - - 2.0 自适应多种分辨率 - by Example Beginner's Guide

全网最全的Android游戏源码汇总 全网最全的Android游戏源码汇总,无需任何分、币、豆免费下载,不断持续更新中,献给那些在奋斗路上的兄弟们。。。。。Android雷电游戏源码

剑指XX游戏(一) - 寻找自己的节奏 从一次面试说起昨天下午接到的国内一家比较大的游戏公司面试通知,晚上打印好新的简历,今天早上7点半起床从B城赶到C城,海上雾很大。提前十分

[Android游戏开发经验分享]游戏开发中内存溢出的OOM解决方案——内存图片回收机制 题记:最近有点忙,同时自己也有点懒,没有更新博客。今天刚好发现并解决了一个困扰已久的蛋疼问题,跟大家分享一下。(本人也是菜鸟入门级,所

标签: Android游戏开发教程

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

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

下一篇:全网最全的Android游戏源码汇总(全网最全的小说阅读器)

  • 税控盘这个月没有反写会怎么样
  • 物业公司增值税加计扣除
  • 非营利组织免税收入
  • 主营业务收入科目按其所反映的经济内容不同
  • 售后维护费账务处理
  • 增值税进项发票网上勾选平台
  • 技术服务税率是多少 现金
  • 公司工会的主要职能是
  • 行政事业单位盘亏或毁损的固定资产
  • 亏损可以不用缴增值税吗
  • 企业辅助生产车间
  • 跨月的普票怎么作废从系统里作废
  • 集团内部拨付的研发经费如何核算?
  • 平行登记要求总账
  • 企业开出增值税专用发票后注销
  • 主体资格的法律规定
  • 异地作业人员的个税必须在收入地交吗?
  • 公司账户转个人账户用途怎么写
  • 残疾人保障金中的工资总额包括福利费用吗
  • 现金采购合理吗
  • 建筑行业没有库存要做暂估成本怎么做?
  • 会计计提和冲回
  • 企业所得税赞助费是否可税前扣除
  • 增值税逾期申报流程
  • 销售利润率是什么能力指标
  • 项目投资净现值计算公式
  • sadge什么意思
  • 个人所得税专项扣除夫妻双方都填吗?
  • linux不能联网怎么解决
  • macbookair邮件
  • 公司员工的社保怎么查询
  • 企业租地建厂流程
  • php文件上传用什么请求方法
  • 待处理财产损益会计分录
  • php如何上传1个g以上的文件
  • php抽奖程序源码
  • pca降维的原理
  • es6新增了什么
  • 权益法的比例是多少
  • 利润表上期数指的是什么
  • phpcms默认密码
  • 没有开具发票的收入如何入账?
  • 公司的融资租赁有哪些
  • 企业申请进出口权经营范围
  • sql server2005一个表中可以设置
  • 财务报表审计的基础是独立性和专业性
  • 企业收到的
  • 固定资产登记在三栏明细账可以吗
  • 全年一次性奖金税率表2023最新
  • 设备维修三种形式
  • 应收账款贷方余额年末怎么处理
  • 应收账款属于会计科目吗
  • 发票金额比实际付款多怎么做账
  • 小规模纳税人所得税计算
  • 生产企业出口退税政策
  • 暂估入库成本结转
  • 公司劳务过账的法律依据
  • 经营所得与劳务所得的直别
  • 商品储存的基本要求是什么?
  • 冲销以前年度多计提的折旧
  • 建账的要点
  • mysql快照读的实现
  • linux下mysql 5.7.16 免安装版本图文教程
  • popblock.exe
  • 删除kernel
  • win10系统关闭安全中心
  • javascript的核心
  • 通过手机号怎么查对方的位置
  • perl的chomp
  • cmd.parameters.addrange
  • ie不支持p标签
  • python中字典怎么用
  • android混淆后怎么破解
  • 县税务局可以去市里吗
  • 北京大兴区地税局电话
  • 国家税务网上办税服务厅官网
  • 济南市地税局纳税服务中心孙凯简历
  • 公司租商铺
  • 个体户不用开发票只纳税和记账的话还会罚款吗?
  • 专用发票收款人可以盖私章吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设