位置: 编程技术 - 正文

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

  • 税务师厉害吗
  • 合伙企业当年盈亏怎么算
  • 软件维护费属于费用还是资产
  • 电子发票怎么开具
  • 其他应收款增加银行存款减少的原因
  • 所得税汇算清缴表在哪里打印
  • 银行按揭方式销售开发产品
  • 跨年度销售费用如何调账
  • 待摊费用按照入账金额还是合同金额摊销?
  • 采购合同可以包含安装吗
  • 职工死去还有工资吗
  • 研发费用加计扣除政策执行指引
  • 现金折扣发票如何开具
  • 企业技术中心认定专精特新
  • 促销费属于现代服务类吗
  • 策划公司费用怎么算
  • win11本地用户和组
  • 房租发票需要缴房产税吗
  • 哪些情形需要办理外债审核登记
  • 备注栏需要写内容嘛
  • wordpress如何使用
  • 无形资产的摊销计入什么科目
  • PHP:ereg_replace()的用法_Regex正则函数
  • 企业的党员活动是什么
  • 应税货物销售额怎么填
  • 同步和异步的关系
  • uni-app打包h5
  • 库存股属于什么会计科目
  • vue split函数
  • FPN细节剖析以及pytorch代码实现
  • tr命令详解
  • 外聘人员怎么申报个税
  • 购买图书可以开增值税专票么?
  • 股东出资方式包括
  • 公司过年买的红包封壳怎么做账
  • python中dataframe的布尔过滤
  • MongoDB aggregate 运用篇个人总结
  • SQL Server FileStream详解
  • 财务费用有发票吗
  • 企业销售商品满足收入确认条件时,应当
  • SqlServer 2005 T-SQL Query 学习笔记(1)
  • 品种法的特点有( )
  • 存货是指企业在生产经营过程中为销售或耗用
  • 财务报表没申报怎么操作呢
  • 收到的进项发票在哪里认证
  • 双定户经营所得税税率
  • 固定资产工作汇报
  • 税费不足50
  • 事业单位基建账套会计科目
  • 车辆按揭利息财务怎么算
  • 个人所得税计算方法2023计算器
  • 无发票材料可以入材料账吗
  • 确认收入后销售怎么算
  • 收到税务局退增值税怎么入账
  • 远期支票最长期限
  • 现金支票作用
  • 计提附加税减半征收会计分录
  • 电脑属于固定资产哪类
  • sqlserver索引类型区别
  • ubuntu20.04设置共享文件夹
  • 电脑xp桌面
  • centos安装视频播放器
  • win8系统盘清理
  • js判断浏览器是否为ie
  • cocos2dx4.0教程
  • 在win7上加装一个硬盘不显示
  • [置顶]bilinovel
  • echarts怎么用
  • android 音频焦点丢失 媒体按键
  • 批处理程序
  • 很不错的词语
  • python gui视频教程
  • linux程序打包和安装
  • jquery ajax后台返回list,前台用jquery遍历list的实现
  • Unity3D的MonoBehaviour可重写函数
  • 探寻Javascript执行效率问题
  • javascript常用语句
  • 税务筹划收费标准最新
  • 税务稽查机构
  • 山东省税务局地税苑宿舍是谁开发的?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设