Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Develop::Client::Game

Smith
August 18, 2016

 Develop::Client::Game

Introduction of basic knowledge for mobile game development.

Smith

August 18, 2016
Tweet

More Decks by Smith

Other Decks in Programming

Transcript

  1. #include <time.h> #include <Drecom/Employee.h> using namespace Drecom; Employee* introduce() {

    Employee* me = new Employee<Hirashain>(); me->name = “Smith”; me->division = Division::ClientArchitect::GameArchitect; me->role = Occupation::Engineer::Client; { time_t rawtime; time(&rawtime); struct tm* timeinfo = localtime (&rawtime); timeinfo->tm_year = 2011 - 1900; // 正直、覚えてない timeinfo->tm_mon = 10 - 1; timeinfo->tm_mday = 1; me->hireDate = mktime(timeinfo); } return me; }
  2. #include <time.h> #include <Drecom/Employee.h> using namespace Drecom; Employee* introduce() {

    Employee* me = new Employee<Hirashain>(); me->name = “Smith”; me->division = Division::ClientArchitect::GameArchitect; me->role = Occupation::Engineer::Client; { time_t rawtime; time(&rawtime); struct tm* timeinfo = localtime (&rawtime); timeinfo->tm_year = 2011 - 1900; // 正直、覚えてない timeinfo->tm_mon = 10 - 1; timeinfo->tm_mday = 1; me->hireDate = mktime(timeinfo); } return me; }
  3. Touch through OpenGL 1. タップ操作する 2. Java/ObjC層で受け取る 3. OpenGLビューに渡される 4.

    タップ座標をOpenGL上の座標に     変換する 5. 変換された座標をアプリが受け取る 6. アプリ任意の処理 App UI OS OpenGL View X:342 Y:107 X:171 Y:515
  4. home unit gacha menu main unit news 1 B A

    LV xx coin xxxx stone xxx
  5. UI input/output 例 home unit gacha menu main unit news

    1 B A LV xx coin xxxx stone xxx ホーム画面を表示する (news ボタンが押される) ボタンを押し込んでいる間は ボタン画像が変わる (news ボタンが押し終わる) ボタンを離すとボタン画像が元に戻り ポップアップが前面に表示され始める news 1 News close
  6. UI input/output 例 ホーム画面を表示する (news ボタンが押される) ボタンを押し込んでいる間は ボタン画像が変わる (news ボタンが押し終わる)

    ボタンを離すとボタン画像が元に戻り ポップアップが前面に表示され始める プログラム側で実装 (部品は用意されている)
  7. まとめ - ほとんどのゲームエンジンはOpenGLで描画している - OpenGLはOSでサポートされ、 専用のビューコンポーネントに描画される - アニメーションやユーザインタラクションの制御は 全てプログラムから行う -

    ユーザ操作がOSからアプリに届くまでは ゲームエンジンが面倒見てくれる - 仕様について不明瞭な点は、キッチリコミュニケーションしておく
  8. server client transaction main loop memory space memory space transaction

    memory space transaction memory space transaction memory space main loop main loop main loop main loop main loop main loop
  9. main loop main loop main loop item = new Item();

    itemName = item->name; delete item; item = nullptr; itemName = item->name; // error!
  10. ネイティヴアプリ OS ネイティヴAPI プラットフォーム機能 ネイティヴ用ライブラリ アプリ/ゲーム実装 - ネイティヴ言語で記述 iOS :

    Objective-C Android : Java - OSが提供する諸々と OSに提供された諸々が使える - そのOSでしか動かない
  11. Java (Android API) Objective-C (Cocoa) Android iOS C/C++ C/C++ JNI

    Java SDK Objective-C SDK ネイティヴ連携って? * Swift のフローは割愛
  12. iOS 言語 : Objective-C (or Swift) プラットフォーム機能 : iOS SDK

    同梱 IAP や GameCenter、プッシュ通知などの ライブラリは全て含まれている
  13. Android 言語 : Java JNI を経由して C と Java の連携ができる

    プラットフォーム機能 : Android SDK 同梱 IAB や Game Play Service、プッシュ通知などの ライブラリは全て含まれているが低レイヤのみ 公式のサンプルコードをコピペして使うことが推奨されている
  14. Android C/C++ と Java の間のやりとりには JNI を介す C/C++ header (.h)

    Java implements (.java) C/C++ bridge (.cpp) JNI C Interface / implements (.c/.cpp)
  15. iOS // call ObjC method void CppClass::doSomeObjCThing() { [ObjCClass doSomeObjCThing];

    } // call cpp method + (void) doSomeCppThing { CppClass::doSomeCppThing(); } Ultra extremely Easy !
  16. Android // call Java method void CppClass::doSomeJavaThing() { const char*

    className = "jp/co/drecom/JavaClass”; const char* methodName = "doSomeJavaThing”; const char* signature = "()V”; PluginJniMethodInfo info; if (PluginJniHelper::getStaticMethodInfo(info, className, methodName, signature)) { info.env->CallStaticObjectMethod(info.classID, info.methodID); } }
  17. Android class JavaClass { // call cpp method public static

    native void doSomeCppThing(); } … JavaClass. doSomeCppThing();
  18. Android extern "C" { // receive JNI native call and

    do cpp thing JNIEXPORT void JNICALL Java_jp_co_drecom_JavaClass_doSomeCppThing(JNIEnv* env, jobject obj) { CppClass::doSomeCppThing(); } }; Ultra extremely bothering !
  19. 余談 サードパーティSDKでは iOS版とAndroid版でAPIが異なる場合がある e.g. ある値を取得するメソッド iOS : 返り値として返却 Android :

    Listener 経由で受け取る この場合、C/C++ のインターフェイスは Listener で受け取るように統一する (逆は不可)