「独創アプリ開発日記」カテゴリーアーカイブ

独創アプリ開発日記 280〜281日目 次回作のアプリ企画確定

次回作のアプリ企画が確定しました。いや、会社じゃなくて個人開発なので別に会議とかで確定したわけではないのですが、私の頭の中で確定しました。10年くらい悩みました・・・がやっと決まりました。

以下、確定したアプリの仕様を大まかに箇条書きします。

・アプリを起動したユーザはマイクラのような3Dマップのフィールドに全員降り立つ。1億人いても全員同じフィールドに降り立つ。フィールドは世界地図を基にしたもので、とても広い。

・どこでもいつでも誰にでも攻撃できる。全員相手の超巨大PVPである。

・レベルはなく、防具や武器などのアイテムを装備することで強くなる。

・他のプレーヤーを倒すと、所持品を全て奪うことが出来る。

・ラグを無くすために、ターン制バトルとする。ターン制と言っても全員相手なので、特定時間が経つと全員のターンが同時に来る特殊ターン制である。

・ゲームをプレイしていなくても、プレーヤーのキャラはサーバに24時間居続ける。ターン制なので特定時間毎に操作すれば一方的に他のプレーヤーにやられることはない。また、この”特定時間”が結構長いので問題にならない。

・この世界には”壁”や”扉”や”罠”のアイテムがあり、フィールド上のどの場所にも置くことができる。自分を”壁”や”扉”や”罠”で囲うことで他のプレーヤーから身を守ることができる。

基本は以上で、以下は様子を見ながら、調整しつつ追加実装出来れば良いと考えています。

・アイテムは、自分の”陣地”で製作することができる。陣地内では、他のプレーヤーによる”破壊活動”を受けない。製作に必要なお金は自分の陣地の広さが大きければ大きいほど多くもらえる。陣地を広げるための壁や扉も陣地の中で生産できる。

・プレーヤーは、”ボット”と呼ばれる自動で動く機械を所有し、自分の陣地を警備させることができる。

・”ボット”は、プレーヤーがアプリを立ち上げていなくても、サーバ上で24時間勝手に動く。

・”ボット”は、他のプレーヤーやボットとの攻防を繰り広げているうちに、その動作ロジックが進化していく。

・”ボット”は、他のプレーヤーと売り買い出来る。

全員同時参加型のPVPということで、技術的には、サーバをスケールアウトして、ボトルネックなしに処理能力をサーバ台数に比例して線形で増加させていける仕組みにしたいと思います。

プラットフォームは、アプリの性質と、慣れているという理由でiOSで作りますが、大部分をC++で実装してゆくゆくはSteamでマルチプラットフォーム対応したいと考えています。

明日の予定:

自分の頭をスケールアウトする。

   _┓_ 
  ‹‹ ( ´ ω ` ) ›› 
  =〔∪ ̄ ̄〕

独創アプリ開発日記 279日目 ねこマタバージョンアップ完了

昨日申請したねこマタですが、もうバージョンアップ完了して、アプリストアに反映されました。最近は審査早いな・・・。私が開発始めた2009年頃は2週間程度、ちょっと前までは1週間くらいかかったのにな・・・。

今日はバージョンアップ内容に合わせてアプリストアの説明文やWebサイトのアプリ紹介ページをちまちま直していました。

独創アプリ開発日記 275〜278日目 ねこマタバージョンアップ

今日はねこマタの新バージョンをアップルに申請しました。

変更は以下の2点です。

・対人戦の1日3回の制限が無くなりました。
・対人ステージ”P”を追加しました。

なんか難しそうなアプリだな・・・と思った方は、

しつこいくらい詳しく解説 — ねこマタ入門(JAPANESE ONLY)

をご覧ください。只今日本語限定で詳しく解説しています。日本人でよかったですね。

立った立った!
  クララが立った!
      \|/
⊂⌒⊃   ― ● ―
  ⊂⊃  /|\
     ⊂⊃  ⊂⊃
/~\へ/~\へヘ/~\
ハ`ハハハハ`ハハ`ハハハハハ`ハハハハ
” “””” “”” “””” “”””
∥=∥=∥=∥=∥=∥=∥
” “∧_∧” “”” “””” ”
” (´∀`) “e@@e”””
“⊂  ⊃” (・∀・)_ノ
○(  ノ””とと__つ
“” )_)) “” ” “” “”ミ
“” “” ∧∧” “”” __
” “” (∀・;) “” | ∥
“””⊂⊂⌒ヽ “” |_∥
“” プル )) )○∠_/)
“” (( (_(_ノ ))プル ◎
||” “”||” “”||” “”||
||二二||二二||二二||

c++でマルチプラットフォーム対応(GUI込)のOpenGLコード253〜274日目

先日作成したC#(OpenTK)のコードをC++に変換し、共通のソースコードでMac,Ubuntu(Linux),Windowsの各種環境において3D図形を描画することに成功しました!Write once, run anywhere!

そして・・・

祝!脱MS環境依存!!

(੭ु ›ω‹ )੭ु⁾⁾♡

OSはもちろん、開発言語等もMSに依存しなくなったよ。

以下が完成したC++のコードです。

https://github.com/ukaapple/cubeTest-cpp/blob/master/CubeInsWindow.cpp

立方体を100x100x100で、合計100万描画します。

TriangleStripで、かつ Instancing使っているので高効率です。メモリ12MB程度しか使わずに済んでいます。

TriangleStripに関しては、過去の日記で記述しています。こんな感じでテクスチャを貼るやり方のことです。

InstancingとはOpenGLの用語で、同じ形状を、位置情報だけいっぱい与えていろんな場所に描画することです。描画速度向上や使用メモリ量削減が期待できます。

ちなみにInstancingを使わないとメモリ使用量が340MBに跳ね上がります。以下が使わない場合のソースです。

https://github.com/ukaapple/cubeTest-cpp/blob/master/CubeWindow.cpp

以下のコードで CubeInsWindow を CubeWindow に変更すると、Instancingを使わない描画に切り替えることが出来ます。

https://github.com/ukaapple/cubeTest-cpp/blob/master/Program.cpp

タイトルバーにfpsを表示するようにしてるので、OpenGLのベンチマーク目的でいろんな環境で実行するのも良いかもしれません。

ちなみに、ハードウェアが同じならば、OSが同じでもベンチマーク結果はほぼ同じでした。

ただし、Windowsを除いて。なぜかWindowsだけ、明らかにFPSが5〜8%低かったです。

これでSteamでの開発準備ができました。次のアプリ、iOSで出そうかな?それともSteamで出そうかな。

(੭ु ›ω‹ )੭ु⁾⁾♡

独創アプリ開発日記 252日目 C++によるマルチプラットフォーム対応のOpenGLコード第一歩 Windows編

先日作成したマルチプラットフォーム対応のOpenGLコードを、macLinux(Ubuntu 18.04 LTS)に続いて、Windowsで動作させます。

Windows7で試しました。

さすが、過去にLinuxを癌だと言っていた会社です。邪悪な独自仕様を進化させたそのOSは、マルチプラットフォーム対応コードの動作を阻む高い壁の名残があるようです。動作させるために面倒な準備が必要になりました。

まずMinGWCMakeMakeをインストールします。インストール後、PATHを適切に設定してください。

次に、glfwのソースを持ってきてビルドします。(バイナリ持ってきても動きませんでした)

CMakeでMinGW用のビルドファイルを生成し、makeコマンドを実行して、最終的に生成されるlibglfw3.aをMinGW\libフォルダの中にコピーします。また、ヘッダーファイルをMinGW\include\GLFWの中にコピーします。

さらに、glewのソースを持ってきてビルドします。(こちらもバイナリを持ってきても動きませんでした)

glfwと同様に、CMakeでMinGW用のビルドファイルを生成後、makeコマンドを実行して、最終的に生成されるlibglew32.aとlibglew32.dll.aをMinGW\libフォルダの中にコピーします。また、ヘッダーファイルをMinGW\include\GLの中にコピーします。更に、glew32.dllをパスの通っている場所にコピーしておきます。

尚、CMakeやMakeコマンドの実行時は、セキュリティソフトのリアルタイム保護を無効にしてください。

何故かウィルスと判断されて作業が失敗してしまいます。

うーん・・・

以上で準備完了です。目的のコードをコンパイルして実行しましょう。

g++ Program.cpp -lglfw3 -lglew32 -lgdi32 -lopengl32

やっと動きました。

え?Visual Studio?何それ?

独創アプリ開発日記 251日目 C++によるマルチプラットフォーム対応のOpenGLコード第一歩 Ubuntu編

Ubuntu 18.04 LTS で昨日のコードを動作させます。

まずは下準備です。

sudo apt-get install libglfw3-dev
sudo apt-get install libglew-dev

コンパイルしましょう。ソースコードは昨日と全く同じです。
IDE?CMake?なにそれ美味しいの?

g++ Program.cpp -lglfw -lGLEW -lGL

明日はセキュリティパッチと機能追加パッチとテレメトリパッチをごっちゃにして提供してくる邪悪なWindowsでも動作確認を行なっていきます。

独創アプリ開発日記 250日目 C++によるマルチプラットフォーム対応のOpenGLコード第一歩

マルチプラットフォーム対応のOpenGLコードの第一歩です。

とりあえずmacでC++を使ってウィンドウを表示します。

各種OSで動作させるためにGLFWを利用します。GLFWはオープンソースのマルチプラットフォーム対応ライブラリで、Window表示やコンテキスト、入力イベントなどを扱えます。GLEWはOpenGL拡張を手軽に用いることができる便利ツールで、こちらも利用します。インストールしましょう。

brew install glfw
brew install glew

コードは以下の通りです。徹夜で書き上げました。解説?初めて利用するライブラリなので解説できるほどの知識は持っていません・・・

#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>

using namespace std;

int main() {
    // GLFW init
    if (glfwInit() == GL_FALSE) {
        cout << "failed to glfwInit" << endl;
        return 1;
    }
    atexit(glfwTerminate);
    
    // create window
    GLFWwindow *const window(glfwCreateWindow(1200, 720, "GameInsWindow", NULL, NULL));
    if (NULL == window) {
        cout << "failed to create window" << endl;
        return 1;
    }
    
    // OpenGL 4.1
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);

    // make context
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);
    
    // GLEW init
    if (GLEW_OK != glewInit()) {
        cout << "failed to glewInit" << endl;
        return -1;
    }

    // clear
    glClearColor(0.0f, 0.5f, 0.0f, 1.0f);
    
    while (glfwWindowShouldClose(window) == GL_FALSE) {
        glClear(GL_COLOR_BUFFER_BIT);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    
    return 0;
}

コンパイルしましょう。IDE?CMake?なにそれ美味しいの?

g++ Program.cpp -lglfw -lglew -framework OpenGL

とりあえずmacで動作することを確認しました。

明日はLinux(Ubuntu)や、EdgeやCortanaの利用を強制してくる邪悪なWindowsでも動作確認を行なっていきます。

独創アプリ開発日記 247〜249日目 Steamにおける開発環境

私の今の目標は、Steamでマルチプラットフォーム対応のゲームを公開することです。

出来れば共通のソースコードで各種環境に対応させたいと考え、先日、.NET CoreとOpenTKを使って、Mac/Linux(Ubuntu)/Windowsの各種環境で動作するOpenGLの共通ソースを書きましたが、この方法ではダメなようです。書き上げてから判明しました。

Steamでゲームを公開する際、Linux(Ubuntu)やMacに関しては利用できるライブラリが決まっており、.NET Coreなどは使えません。多分。

結論としては、C++でOpenGLを利用する形で行けば大部分は大丈夫な気がしています。

DirectXは論外です。Windowsでしか動きません。スマホ/Mac/Linuxが対象外になってしまいます。

と言うわけで、直近での次の作業はC#で書き上げたソースをC++に変更することとしました。その際、C++からOpenGLを利用するためfreeglutを使います。GUIに関してOpenTK(GameWindowクラス)は使えないので、GLFWなども利用予定です。

独創アプリ開発日記 224〜246日目 環境に依存しない3D描画

遂に成し遂げました。

海外に武者修行へ1年間行った結果、Unityなどのツールを使わずに、共通のソースコードでMac,Ubuntu(Linux),Windowsの各種環境において3D図形を描画することに成功しました!Write once, run anywhere!

・・・いや、違いました。.NET Core上でOpenTKを使っただけでした。

以下が環境に依存せず動く3D描画PGです。

https://github.com/ukaapple/cubeTest-OpenTK/blob/master/CubeInsWindow.cs

立方体を100x100x100で、合計100万描画します。

TriangleStripで、かつ Instancing使っているので高効率です。メモリ12MB程度しか使わずに済んでいます。

TriangleStripに関しては、過去の日記で記述しています。こんな感じでテクスチャを貼るやり方のことです。

InstancingとはOpenGLの用語で、同じ形状を、位置情報だけいっぱい与えていろんな場所に描画することです。描画速度向上や使用メモリ量削減が期待できます。

一個

千個

百万個は実際にソースコードを動かして確認して下さい。UbuntuやMacではライブラリのインストールが必要です。README.mdを参照して下さい。

目が痛くなることを保証します。

ちなみにInstancingを使わないとメモリ使用量が340MBに跳ね上がります。以下が使わない場合のソースです。

https://github.com/ukaapple/cubeTest-OpenTK/blob/master/CubeWindow.cs

以下のコードで CubeInsWindow を CubeWindow に変更すると、Instancingを使わない描画に切り替えることが出来ます。

https://github.com/ukaapple/cubeTest-OpenTK/blob/master/Program.cs

また、コンストラクタ引数の100の部分を変更することで描画する立方体の数を変更することが出来ます。あまりに描画数を多くしすぎてマシンのメモリを使い果たさないように気を付けて下さい。

タイトルバーにfpsを表示するようにしてるので、OpenGLのベンチマーク目的でいろんな環境で実行するのも良いかもしれません。