位置: 编程技术 - 正文

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

  • 政府农民合作社架构
  • 资源税的计税方法自产
  • 无偿使用厂房用交税吗
  • 企业理财收入如何确定
  • 为什么租赁只能20年
  • 劳务公司开票税收分类
  • 公转私可以实时到账吗
  • 小型微利企业认定标准2023年
  • 账务处理和税前扣除如何处理
  • 企业如何实现合理利润
  • 土地使用税延期还延续吗
  • 一般纳税人的含税收入怎么算
  • 什么样的企业用交税
  • 工程发票没写经办人没写可以吗
  • 未达起征点销售额和其他免税销售额
  • 旅游合同签订
  • 如何返还股东的出资款
  • 税控服务系统
  • 银行承兑第一手怎么盖章
  • 什么发票可以抵成本
  • 受赠房屋涉及哪些税?
  • 废品回收企业回收的废品都是怎么处理
  • ps4运行windows
  • 电脑进不了系统怎么用u盘重装
  • elccest.exe是间谍广告程序吗 elccest进程有什么作用
  • 奖金发放的原则
  • 公司的利润交税之前不可能叫做什么
  • 无偿赠送是否需要交个人所得税分哪些情况
  • 母公司收取子公司利润交增值税吗
  • 金店个体户报什么税
  • CNN+LSTM+Attention实现时间序列预测(PyTorch版)
  • php file_get_contents smb
  • php生成图片验证怎么弄
  • 维多利亚国家艺术馆
  • 感知机算法python
  • convwthn如何定义
  • php静态方法可以被继承吗
  • 长期借款的主要缺点
  • c语言fread函数的用法示例
  • 织梦如何使用
  • Shading-JDBC、ShadingSphere、ShardingProxy 使用详解
  • 企业借款利息计入什么科目
  • sql2005数据库
  • 非营利组织也被称为?
  • 应交税费明细科目设置最新
  • 应收账款损失率计算公式
  • 非广告性质的赞助支出调增还是调减
  • 发行股票时支付的手续费
  • 一般纳税人登记 核算地址
  • 购入研发设备可以全额抵扣吗
  • 管理费用抵扣企业所得税的比例
  • 仓库管理办法有哪些
  • 填制费用报销单怎么填写
  • 应收账款记账凭证怎么写
  • 库存商品用于研发分录
  • 企业所得税税率多少
  • 企业收到劳务费会计分录怎么做账
  • 小规模一直零申报有什么影响
  • 跨年做进项税额转出
  • sql server数据库文件的扩展名是
  • 阿里云ecs centos sysctl
  • sql中函数 判断是否是null
  • win10怎么设置为win7模式
  • linux系统中用户密码保存在什么文件中
  • 如何用virtualbox安装linux
  • regsvc32.exe - regsvc32是什么进程 有什么用
  • cocos2d游戏源码
  • opengl 模型
  • jquery获取复选框是否被选中
  • tensorflow for
  • perl 教程
  • css颜色值正确的表达形式
  • js parseint parsefloat
  • jquery将文本框设置为只读
  • javascript的for循环
  • 领导班子和领导干部的区别
  • 江西企业社保缴费基数查询
  • 卷票是什么票
  • 顺丰快递的开票历史如何删除
  • 城镇土地使用税减免税政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设