位置: 编程技术 - 正文

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游戏源码汇总(全网最全的小说阅读器)

  • 企业所得税汇算清缴时间
  • 股东继续投资
  • 缴纳个人社保在哪里可以缴
  • 职工福利费专票账务处理
  • 飞机票退票费如何处理账务
  • 房产税的原值是如何确定的
  • 工业土地划拨性质有年限吗
  • 结转损益类费用科目的余额
  • 企业的哪些活动对企业有长期影响呢
  • 股权转让所得交所得税吗
  • 产品检验费怎样做账?
  • 材料采购发生的合理损耗计入
  • 认缴制下股权转让如何不交税
  • 应交税费计提是借方还是贷方
  • 物业签订的合同
  • 增值税普通发票有什么用
  • 发票校验码后六位图解
  • 广告公司可以开服务费吗
  • 企业或员工获得的相关荣誉
  • 利润分配以前年度损益调整
  • 递延所得税资产和负债怎么理解
  • 入住酒店报销
  • 小规模查账征收增值税怎么算
  • 公司发的物品叫什么
  • windows4月更新
  • 标书费没有发票
  • 驾校收入与成本的关系
  • 税控盘抵减
  • 苹果系统的声音
  • 人工单位怎么写
  • windows默认网关应该设置为的地址
  • Laravel 5.4向IoC容器中添加自定义类的方法示例
  • 购进运输服务取得的增值税专用发票准予抵扣进项税额吗
  • php中include_once
  • 股东分红税率是20%还是25%
  • php 遍历字符串
  • 专利年费缴纳详细流程
  • 购买样品入库的账务处理
  • 管家婆软件出库入库如何用
  • 长期挂账的应付款怎么处理
  • 什么是备抵类账户
  • 先息后本贷款利息计算器
  • 小额支出的两种形式
  • 实习生个人所得税需要申报吗?
  • 收到股东投资款需要交印花税吗
  • 土地增值税清算收入如何确定
  • 前几个月的印花税怎么算
  • 商品周转率公式
  • 退货回去需要把原包装保留吗
  • 销售单位收入和税收
  • 为什么设置辅警
  • bios设置bios密码
  • win7快速切换到桌面
  • 畅游盈利
  • win 10预览版
  • 安装win7系统需要注意什么
  • windows10预览版安装
  • browsercore.exe是什么
  • win8 防火墙
  • win8老是自动安装软件
  • macbookpro安装双系统win7系统
  • perform.exe是什么进程
  • Win10年度升级版将正式提供暗黑主题 未自定义颜色都会变暗
  • w8虚拟内存怎么设置
  • cocos设计模式
  • 如何正确使用标准电池和检流计
  • vxlan配置实例详解
  • nodejs npm install全局安装和本地安装的区别
  • dos批处理实例800例
  • pycharm怎么学
  • js设计模式书
  • rgb与yuv哪个好
  • javascript内存管理
  • python os模块
  • SQLite3中文编码 Python的实现
  • jQuery获取checkbox选中的值
  • python deque
  • 省市区json
  • js获取鼠标点击位置
  • 上市公司的税务风险大吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设