注:如下資料在實際寫代碼過程當中都不如看quick源代碼來得直接有效!php
quick官網,主要用於下載,教程有必定參考價值: http://cn.cocos2d-x.org/?v=CNhtml
quick-cocos2d-x 文檔,很全面,配置環境時須要參考: http://quick.cocoachina.com/wiki/doku.php?id=zh_cn前端
quick-cocos2d-x API 文檔,有必定參考價值: http://quick.cocoachina.com/wiki/doku.php?id=zh_cn:apijava
Quick-Cocos2d-X 捋一捋框架流程,說了一些重點須要注意的框架方面的問題: http://www.cocos2dev.com/?p=535python
quick github: https://github.com/chukong/quick-cocos2d-xjquery
luaj是這個博主寫的: http://dualface.github.ioandroid
Quick-Cocos2d-x 加密: http://cn.cocos2d-x.org/tutorial/show?id=1447 http://cn.cocos2d-x.org/tutorial/show?id=1507c++
Quick在Cocos Code IDE中實現代碼提示: http://cn.cocos2d-x.org/tutorial/show?id=1715git
Android FATAL 11無堆棧信息調試方法:github
cd $ANDROID_NDK_ROOT adb logcat | ./ndk-stack -sym /Users/hellosure/Develop/pincollage/branches/wallet_1-1-6-BRANCH/frameworks/runtime-src/proj.android/obj/local/armeabi/
動態更新: http://my.oschina.net/SunLightJuly/blog/180639 https://groups.google.com/forum/#!topic/quick-x/ni6Nf50jzfo http://my.oschina.net/u/1785418/blog/283043 http://zengrong.net/post/2131.htm https://github.com/chukong/quick-cocos2d-x/tree/master/samples/2048
quick-cocos2d-x 多分辨率適配詳解: http://quick.cocoachina.com/?p=1436
animation的效果,很容易經過transition.lua實現
Lua Style Guide,編程風格: https://github.com/Olivine-Labs/lua-style-guide
Lua 5.1 參考手冊,用的很少,須要知道什麼寫法直接google再終端試一下便可: http://www.codingnow.com/2000/download/lua_manual.html
Lua的點號和冒號用lua進行面向對象的編程,聲明方法和調用方法統一用冒號,對於屬性的調用所有用點號。
Lua 中關於函數稍微難以理解的是函數也能夠沒有名字,匿名的。當咱們提到函數 名(好比 print),其實是說一個指向函數的變量,像持有其餘類型值的變量同樣:
a = {p = print} a.p("Hello World") --> Hello World print = math.sin -- `print' now refers to the sine function a.p(print(1)) sin = a.p sin(10,20) --> 0.841470 -- `sin' now refers to the print function -->10 20
cocos2dx文檔,沒怎麼看過: http://cn.cocos2d-x.org/doc/cocos2d-x-3.0/index.html
parse文檔,主要就是看這個: https://www.parse.com/docs
Fyber: http://developer.fyber.com/content/android/offer-wall/offer-api/
SponsorPay: https://github.com/SponsorPay/mobile-sdk
TapJoy: https://github.com/kalpeshhpatel/cordova-tapjoy-plugin
Aarki: https://portal.aarki.com/account/library https://portal.aarki.com/docs/webapi/
Adcolony: https://github.com/AdColony/AdColony-Android-SDK/wiki/API-Details
develop console https://play.google.com/apps/publish/?dev_acc=00903166301840771912#AppListPlace
"google_sdk".equals(Build.PRODUCT) || "sdk".equals(Build.PRODUCT) || "sdk_x86".equals(Build.PRODUCT) || "vbox86p".equals(Build.PRODUCT) Build.FINGERPRINT.contains("generic")
Installing ARM Translation and GApps http://forum.xda-developers.com/showthread.php?t=2528952
http://www.appannie.com/apps/google-play/app/gift.wallet/?account_id=222547
用來將多張圖打包成一張大圖plist
這種技術叫作CSS Sprite,本質是:
這種技術有好處也有壞處,好處是因爲圖片都放在一塊兒,請求時只需請求一張圖片,減小了與服務器的交互次數,提升了頁面性能是它最大的好處,還能夠解決hover延遲加載的問題。能減小圖片的字節,曾經比較過屢次3張圖片合併成1張圖片的字節老是小於這3張圖片的字節總和。還有就是更換風格方便,只須要在一張或少張圖片上修改圖片的顏色或樣式,整個網頁的風格就能夠改變。維護起來更加方便。
壞處就是很差控制,擴展性不太好,之後有改動,可謂是牽一髮而動全身,並且有時會由於屏幕分辨率不一樣出現背景斷裂現象。CSS Sprites在開發的時候比較麻煩,你要經過photoshop或其餘工具測量計算每個背景單元的精確位置,這是針線活,沒什麼難度,可是很繁瑣;幸虧騰訊的鬼哥用ADOBE AIR開發了一個CSS Sprites 樣式生成工具,雖然還有一些使用上的不靈活,可是已經比photoshop測量來的方便多了,並且樣式直接生成,複製,拷貝就OK!
最開始想參考的是FeaturePoint,它是用hybrid app的方式作的,所以調研了一些關於hybrid app的知識。
hybrid app 的技術選型包括兩個方面:
主流選用cordova,而titanium相對而言不夠成熟,學習曲線高。
在整個系統中,服務提供方爲backend,1位於middle,2位於frontend。
對於前端技術選型,可選的方案有:
(1) ionic
ionic提供了ui,mvx集成了angular。
雖然angular作spa有自然優點,不過上手沒有jquery快,並且更適合作更復雜的應用,另外angular對代碼侵入性較大若是將來想把它換掉那基本上只能從新開發。再就是感受ionic的document不是很是詳細,ui也沒有感覺到太多優點,ionic creator對html原型快速搭建有用不過沒有必要使用它,另外對於它宣稱的性能優點這方面估計並不能對我們應用帶來多少實際好處。
(2) sencha touch
定製化比較高,對於當前應用來講稍顯重。
(3) jquery mobile
jqm被詬病較多的在於兩個方面,一是webapp中不能忍它庫文件過重,二是ui模版味過重。對於第一點在hybridapp中能夠避免,對於第二點能夠藉助bootstrap等ui框架來優化。
另外,jquery mobile和ionic都提供builder工具快速drag-and-drop,export能夠快速獲得html,能夠減輕頁面初期開發工做量。
(1) jquery mobile
codiqa,另外可導入用themeroller自定義的theme http://themeroller.jquerymobile.com
(2) ionic
ionic-creator https://creator.ionic.io
hybrid app的選型結果:
cordova + jquery mobile + bootstrap
可是後來把hybrid app方案斃掉的緣由是: hybrid app有個最大的問題就是:安全性。hacker是能夠從apk中獲取並反編譯獲得源代碼的,這個太恐怖了。可能被很快的複製,也可能被釣魚。在產品角度又想跨平臺,所以採用lua來作,lua經過xxtea算法加密,再就是lua有動態更新這點很爽。
bybrid app用來本身作app快速上線,還有有點用處的,可是實際項目仍是謹慎。
http://rensanning.iteye.com/category/305123
mActivity.runOnUiThread(new Runnable() { @Override public void run() { new AlertDialog.Builder(mActivity) .setMessage("Google play services out of date.") .setPositiveButton("Update", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mActivity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); } }).show(); } });
java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare() android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 解決方式都是放到ui線程中:
mActivity.runOnUiThread(new Runnable() { @Override public void run() { myDialog = ProgressDialog.show(mActivity, "title", "body", true); } });
另外,handler是用來在UI線程中修改界面的。
class MyTask extends AsyncTask<Void, Void, Void> { ProgressDialog pd; @Override protected void onPreExecute() { super.onPreExecute(); pd = new ProgressDialog(MainActivity.this); pd.setMessage("loading"); pd.show(); } @Override protected Void doInBackground(Void... params) { // Do your request } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); if (pd != null) { pd.dismiss(); } } }
lua中cc.httprequest在模擬器中是會到CCHTTPRequest.cpp 可是在安卓真機上會到CCHTTPRequestAndroid.cpp 而後它裏面會調用框架的QuickHTTPInterface.java
從CCHTTPRequestAndroid.cpp的start方法中能夠看到,好比對於header的處理,必須用=分割: int pos = val.find(‘=‘); 而後去調用addRequestHeaderJava,這個也就是QuickHTTPInterface.java中的addRequestHeader方法
最終達到的效果就是CCHTTPRequestAndroid.cpp和QuickHTTPInterface.java都不改,在lua中迎合它代碼的邏輯。
注意,CCHTTPRequest.cpp和CCHTTPRequestAndroid.cpp對HTTP的處理邏輯是不一樣的,之後直接在真機中調試比較好。
發現對https的api發送接收有問題。解決方案應該是把ssl關掉:好比python中
httpClient = httplib2.Http(disable_ssl_certificate_validation=True) promoeUrl = "https://api.zhaowowa.com/api/v1/promote"
這個問題的最終解決方法是:官網上說明是 https://developer.android.com/training/articles/security-ssl.html 實際解決是信任全部Https: http://www.nakov.com/blog/2009/07/16/disable-certificate-validation-in-java-ssl-connections/
getfollow那裏實現方式是改了quick cocos2dx框架底層的c++配置,這種方式簡單,可是不可擴展。
在一個分辨率中擺放東西是很簡單的。可是放到多設備上就會有各類問題。
按比例放置在640*1136,而後放到安卓大設備就會和設計圖有點出入,而後圖片會模糊一點,這是這種方案的缺點。 getlikes當時是這種方案作的。
在1440*2560中按比例放置,或者按絕對座標放置。而後這是在一個layer中放sprite,由於這個分辨率是最大的了,放到其餘分辨率的時候,就把這個layer總體scale縮放,這樣就不會有1的那種和設計圖不一致的問題,可是有另外的一個問題就是:可能有黑邊、或者界面在一個方向上出去了。由於縮放是按照寬或者高來的,若是按照寬來,那麼在不一樣的設備上,高就有可能黑邊或者出去。反之若是按照高來,那麼在不一樣設備上,寬就可能黑邊或者出去。 getfollows是這種方案作的,貼邊的工做很是煩人,最好能避免。這裏還有一個技巧,就是底部的一排按鈕確定必須完美佔滿,因此這排按鈕是在縮放的layer之上的,就是layer無論怎麼縮放,在layer縮放完了以後再把底部一排按鈕加上去。
no border的方案,這種團隊裏尚未採用過,就是設計的時候,就在一個方向上給出餘量,好比在高上給出餘量,那麼在縮放以寬爲基準就是把寬完美填滿時,高能夠知足各類設備:都不會出現黑邊,且就算超過了也不會影響效果。這種須要設計師來考慮怎麼設計比較合適。遊戲中不少是這樣作的,由於遊戲的背景出去一點沒有什麼關係。
在代碼的組織上,先放一個layer,而後在上面放置各類sprite,這些sprite能夠把一些有關聯的封裝在一塊兒,這樣縮放時就是一個總體了。在addchild時能夠在第二個參數設置是哪一個層級。
座標原點確定是在左下角,可是錨點能夠放置在不一樣的位置,好比放置在最上方的中間位置。這樣就算縮放,兩邊的黑邊是同樣寬的。
一組組件封裝在一塊兒,其座標是組件內部的座標系來定位。而後再把組件羣一塊兒調價到layer中。
lua其實就是把c++代碼封裝了一下,在quick2.2的版本中,能夠看得很清楚,好比display.lua中的 function display.newLayer() 就是調用的c++代碼CCLayer,把它建立了一下而後返回一個CCLayer對象,而後在使用的時候就能夠根據這個建立出的對象來調用CCLayer.h中提供的方法,好比: local layer = display.newLayer() layer:setColor(xxx) 注意,要用冒號,另外setColor必須在CCLayer.h中提供。
而後在quick3.2版本中,framework自己的封裝更復雜了,好比: function display.newLayer() return cc.Layer:create() end 那麼這個cc.Layer是什麼呢?在quick/lib/lua_bindings/auto/lua_cocos2dx_auto.cpp中:
int lua_cocos2dx_Layer_create(lua_State* tolua_S) { int argc = 0; bool ok = true; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif #if COCOS2D_DEBUG >= 1 if (!tolua_isusertable(tolua_S,1,"cc.Layer",0,&tolua_err)) goto tolua_lerror; #endif argc = lua_gettop(tolua_S) - 1; if (argc == 0) { if(!ok) return 0; cocos2d::Layer* ret = cocos2d::Layer::create(); object_to_luaval<cocos2d::Layer>(tolua_S, "cc.Layer",(cocos2d::Layer*)ret); return 1; } CCLOG("%s has wrong number of arguments: %d, was expecting %d\n ", "create",argc, 0); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Layer_create'.",&tolua_err); #endif return 0; }
那麼能夠看到,建立的是cocos2d::Layer
在cocos2d.h中引入了cocos2d全部的c++代碼。
core中提供data存儲/config配置 push中提供消息推送 analytics中提供統計展現按照document中說的去作就能夠。
好比首頁中的操做按鈕等這些信息均可以做爲config在parse中配置:在lua中經過parse.lua中的getStringConfig(key)等三個get方法來獲取。
統計也能夠在parse中方便的統計,須要在代碼中進行打點:Parse.trackEvent(‘ClickOperate’, {target = name})
另外,對於config,lua中放默認值,以避免用戶網絡很差的狀況下取不到數據。而後最新的數據能夠從parse中getStringConfig(「OperateList」)獲取。
應用初始化的時候parse用戶登陸,若是登錄了說明是個原來有的用戶(多是匿名的也多是實名的,其實二者沒有本質區別,都有parseuserid)。若是登錄了parse,而後看是否在ifun中註冊過,若是註冊過就經過parseuserid去parse中獲取name/email再去ifun中login。若是沒有註冊過,就去ifun中signup,name/email經過parseuserid構造。
若是沒有登陸parse,就構造匿名用戶登陸parse,這樣在parse的user表中就有了一條記錄,而後就能夠獲取到parseuserid,而後一樣的用它來構造name/email去ifun中signup(signup以後都自動login了)。
chrome中的getpost工具
整個應用的入口是wallet.onCreate(java)—> SPHelper.init(java)—> 開始load lua代碼,入口是MyApp.run(lua)—> SPHelper.init(lua)—> SPHelper.initWithOptions(java)而且這裏會指出若是積分牆被點擊了須要回調的lua方法是誰(這個會在第3步被調用)
當界面中的list item被點擊時,會觸發SPHelper.showOfferwall(lua),而後它會調用SPHelper.showSponsorPay(java)起一個ui線程顯示出積分牆。
當積分牆中的項目被點擊實現後,觸發java中的listener,而後調用lua中第1步中提到的回調方法
在分析這個流程的時候,要注意一點是,積分牆界面是java sdk因此是java環境,其餘界面是lua環境,因此存在java和lua跳來跳去的狀況。
-EOF-