1. 搭建安卓空项目、集成cocos、穿山甲广告新建安卓项目start new android projectEmpty Activity包名这里要和穿山甲上面已创建的应用的包...
1. 搭建安卓空项目、集成cocos、穿山甲广告新建安卓项目
start new android project
Empty Activity
包名这里要和穿山甲上面已创建的应用的包名一致,否则无法唤起广告,(所以这里先用 dongdezhuan 的)
集成Cocos, 让安卓项目能够正常运行lua游戏集成Cocos2dx的framework
File -> New -> import module -> ( 假设这里要导入 Cocos 3.10 版本的framework , 那我们就要找到 3.10 下面的
cocos -> platform -> android -> java
) 【附: 先去官网下载3.10 ,如果没有这个得话】
1.1 添加到依赖
找到 app下面的 build.gradle 文件, ( 如果在Android Studio 里面,则是 build.gradle(Module: app ) ) 修改 dependencies 把刚才引入的 libcocos2dx 这个模块添加到依赖项里面dependencies {
...
implementation project(path: ":libcocos2dx") //添加这一行
...
}
1.2 添加 libcocos2dlua.solibcocos2dlua.so 哪里来的?
这个是当一个cocos项目打包安卓工程时生成的。libcocos2dlua.so 的位置 ?
以 TvGameProject_DB 为例, .so 文件的位置在
frameworks -> runtime-src -> proj.android-studio -> app -> build -> intermediates -> jniLibs -> debug -> armeabi -> libcocos2dlua.so
注意: 在 3.17下面是和 3.10项目下面的位置不一样
3.17 下面的位置是: frameworks -> runtime-src -> proj.android -> app -> build -> intermediates -> ndkBuild -> debug/release -> armeabi -> libcocos2dlua.so
在android studio 左上角,点击 Android↓ , 修改为 project 。 然后找到 app 目录下面的 libs , 如果没有libs , 则手动创建一个libs 文件夹。
之后将上面包含 .so 文件的文件夹复制到 libs 下面。
这里是 : armeabi -> libcocos2dlua.so
1.3 配置 .so 库的路径 以及 游戏资源路径
切换回 Android↓ 。 右击app , New -> Folder -> Assets Folder
打开build.gradle(:app) , 在 android 下 ( defaultConfig 同级) 添加下面代码sourceSets.main {
jniLibs.srcDir "libs"
assets.srcDir "src/main/assets"
}
修改 AndroidManefist.xml , 在 下面添加
android:value="cocos2dlua" />
新建 GameActivity , 作为游戏引擎的画面载体(入口)
在MainActivity同级下新建 java 文件。 继承 Cocos2dxActivity , 并且重写 onCreate 方法打开可重写方法列表的快捷键是 crtl + o , Mac上是 control + opackage com.dongdezhuan; // 自己项目的包名
import android.os.Bundle;
import org.cocos2dx.lib.Cocos2dxActivity;
public class GameActivity extends Cocos2dxActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
然后要在 AndroidManefist 下面, 设置应用的默认activity为刚才创建的 GameActivity
''' 这4行代码的作用就是用来告诉 application , 默认启动activity是谁 (放在哪个 activity 标签对下面,就是哪个activity)
'''
这个时候运行应用的话,还是会报错, 因为3.10 打包生成的 .so 库是32位的。 所以需要再配置一下
build.gradle(Module : app), 让APP启动时默认去找指定的架构版本下的 .so 库
在 defaultConfig 下面添加以下代码ndk {
abiFilters "armeabi","armeabi-v7a","x86","x86_64"
}
这个时候运行APP, 手机黑屏,log里没有严重错误。则表示cocos环境集成成功。
接下来导入游戏资源即可运行。
这里以 cat 为例。找到 cat 游戏目录下的 src、res。 将这两文件夹拖到 assets 目录下。 下一步,用vscode 打开 src 文件夹。点击搜索, 搜索 java 关键词。 并将所有调用java的代码全部注释。接着运行游戏。
如果没有报错,则游戏的集成到这一步为止全部完成。之后,打包游戏的话可以直接用这个Android项目。
手动打包的过程如下: Build -> Generate Signed Bundle/APK -> App
下一步选择 打包秘钥,如果没有的话,则创建一个Create New
key store path : 选择生成的秘钥路径
certificate 填一项即可
生成完成后,秘钥路径和密码会自动填充好,点下一步就行。
接下来选择 debug( 测试版 ) 或者 release ( 正式版 ). 全部勾选 v1, v2。 然后就打包了。
打包完成后apk路径是在 : app -> build -> output -> apk -> release 下面。
集成穿山甲广告
lua调用Java方法文档见README_LUA_JAVA.md
调用网络接口获取数据
restful 接口获取数据有两个,一个是 get ,一个是 post
这两个方法都可以向服务器发送数据。 但是get方法向服务器发送的数据大小是有限制的。所以一般向服务器上传数据时用Post方法。
Android在高版本中如果要调用 http 开头的接口,需要额外配置一下。
一: 打开 AndroidManifest.xml ,在 application 中添加下面这行
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"// 添加这一行
android:theme="@style/AppTheme">
二: 在AndroidManifest.xml 中添加网络请求权限
接下来修改 main.lua , 分别调用 get 方法和 post 方法
请求网络用到的 lua 对象是 cc.XMLHttpRequest , 它是对web中的xmlhttprequest 的移植。
因为在cocos2dx的文档中并没有详细介绍,在3.17的文档中连api都没得。这里我们只能对照web中的XMLHttpRequest的用法来简单使用。
XMLHttpRequest的基本使用流程为新建 XMLHttpRequest 对象
设置响应类型
调用 open 方法 和服务器建立连接
设置响应回调方法,一般就是根据服务器返回的不同状态来进行后续处理
Lua中通过 registerScriptHandler 来绑定 响应回调方法
调用 send 方法,发送请求
GET-- GET 类型网络接口调用示例方法
-- 这个类型的方法,一般是从服务器里取数据
local function getTest()
local client = cc.XMLHttpRequest:new()
client.responseType = cc.XMLHTTPREQUEST_RESPONSE_STRING
local method = "GET"
local url = "http://111.231.105.133/login"
client:open(method,url) -- 到这一步,已经和服务器建立连接了
local function onReadyStateChange()
if client.readyState == 4 and (client.status>= 200 and client.status < 300) then
local s = client.response
print(TAG, s)
else
-- TODO: 接口请求失败
print(TAG,"request failed")
end
end
client:registerScriptHandler(onReadyStateChange)
client:send()
end
POST
因为post是向服务器上报数据,所以在send方法中,我们是要带上游戏数据-- POST 类型网络接口调用示例方法
-- 这个类型的方法,一般是在游戏里做数据上报时调用,即将游戏数据上传到服务器
local function postTest()
local json = require("json/json")
local client = cc.XMLHttpRequest:new()
client.responseType = cc.XMLHTTPREQUEST_RESPONSE_JSON
client:setRequestHeader("Content-Type","application/json")
local method = "POST"
local url = "http://111.231.105.133/upgrade"
client:open(method,url) -- 到这一步,已经和服务器建立连接了
local function onReadyStateChange()
if client.readyState == 4 and (client.status>= 200 and client.status < 300) then
local s = client.response
print(TAG, s)
else
-- TODO: 接口请求失败
print(TAG,"request failed")
end
end
client:registerScriptHandler(onReadyStateChange)
local game_data = {
name="小红",
game_gold=2300,
game_level=13
}
local data = json.encode(game_data)
client:send(data)
end
响应类型 responseType
typelua
jsoncc.XMLHTTPREQUEST_RESPONSE_JSON
textcc.XMLHTTPREQUEST_RESPONSE_STRING
arraybuffercc.XMLHTTPREQUEST_RESPONSE_ARRAYBUFFER
open方法
open(method,url)method: "GET", "POST","OPTION","DELETE" ...
onReadyStateChange回调
用到了三个重要属性, 都是上面 XMLHttpRequest 实例中的属性client.readyState
client.status
client.reponse