C++

Cocos2d-xでStaticクラスのメソッドやフリー関数をコールバックに指定するマクロ

staticなメソッドとかフリー関数をバインドするには以下のマクロを使用します。 // 任意の位置に以下を定義する #define CC_CALLBACK_S_0(__selector__, ...) std::bind(__selector__, ##__VA_ARGS__) #define CC_CALLBACK_S_1(__selector__, ...) std::bind…

Cocos2d-xで画像を任意の色で点滅させる(3.x系)

Cocos2d-xで画像を点滅させるには、Blinkを使います。このBlinkの動作は、画像を「表示」⇔「非表示」動きをやってくれます。ただ、自分の好きな色で点滅などは出来ません。画像(Sprite)に弾がヒットした時に一瞬白く点滅する等の2Dゲームに割とよくある表…

Cocos2d-xで2点間の距離・角度を取得する(3.x系)

タイトルの通りですが、何故かCocos2d-xの2.x系で説明されている古めの記事しかなったので新しい(と言っても相当前ですが)3.x系での書き方の紹介です。 2.xと3.xではメソッド名や関数の位置が全然違うので少し書き方が違います。ただ、古いメソッドなどが…

Cocos2d-xでバーチャルパッド(スティック操作)を実装する

今回は、Cocos2d-x(ver. 3.17.1)でバーチャルパッド(スティックキー)を実装したいと思います。 PSやXboxなどでおなじみの360°方向の入力ができるスティックキーです。 実際に実装するとこんな感じになります。 よくコントローラが画面の下部に表示されてい…

Cocos2d-x 3.17.1で円と矩形(長方形・角度あり)の衝突判定

タイトルにCocos2d-x(2D用のゲームエンジン)でと書きましたが考え方自体は普遍的な円と矩形(長方形)の当たり判定の処理についてです。と、言っても条件式式が結構難しい(当方には説明が難しい)ため解説は以下のサイトが分かりやすくまとまっていますの…

Cocos2d-xでルール画像を使ってシーントランシジョンする(シェーダー使用)

Unityだと以下のように紹介されている、ルール画像を用いたシーンの遷移エフェクトをCocos2d-xで実装してみたいと思います。 tsubakit1.hateblo.jp まずこんな感じのグレースケールのマスク画像を使用します。 画面遷移はこんな感じになります。 「マスク画…

Cocos2d-x 3.17.1のcmakeでスタティックライブラリを作成してビルドを高速化する

はじめに FirebaseをAndroidに追加するときに思ったのですが、Cocos2d-xのAndroid環境は本当に地獄ですね… 少しGradleやCMakeist.txtを編集するとフルビルドになってCocos2d-x丸ごとリコンパイルになって時間がすごくかかります。 少し前に、3.17でcmakeが推…

Cocos2d-x 3.17.1でlib-genコマンドが削除されたけどWin32プロジェクトのビルドを高速化する

あらかじめCocos2d-xのコアの部分をコンパイルしてDLLを作成し、ビルド時間を高速化する話は以前、こちらで書いたのですが、なんと3.17.1からlib-genコマンドが削除されてしまいました。従って、最新版のCocos2d-xだとlib-genコマンドによる事前ビルドが不可…

Cocos2d-x 3.17.1でハッシュ計算を行う(MD5・SHA-256)

ゲームでデータが改ざんされていないかどうかを確かめるためにデータのハッシュ値を取って照合する手法があり、ハッシュ計算が必要になった時に使用するライブラリですが、最近のCocos2d-xにはすでにハッシュ計算用のライブラリが入っています。従って以前の…

Cocos2d-xのWin32プロジェクトでFirebaseの匿名認証してみる

タイトルの通りですが、Win32上でも匿名認証が普通にできるので方法を紹介したいと思います。 前回書いた以下の記事でWin32のプロジェクトが設定済みの状態を想定します。 takachan.hatenablog.com そして、以下のページにある「デスクトップ版の Firebase …

Cocos2d-xのWin32プロジェクトにFirebaseを設定する

Android向けにアプリ開発していますが、プログラムを書くときはWin32プロジェクトで作成しているのでモバイルプラットフォーム向けのライブラリとか機能は特別な分岐コードを書かないといけないのですが、FirebaseはAndroid, iOSは対応していますがWindowsと…

Cocos2d-xでLabelやTextの色を部分的に変更する

Cocos2d-xでラベルの色を途中で変更する場合以下のサイトが出てきます。 masahirosaito.hatenablog.com Cocos2d-xのバージョンが3.17.1の今でも大抵このサイトの通りで問題ないですが、文字列中の任意の単語の色を一括で変更したいといった場合、元の文字列…

C#とC++で任意の型をスターリンソートする

ネットで少しだけ話題になったネタ系ソートアルゴリズムのスターリンソート(というかフィルター?)をC#とC++で実装してみようと思います。 スターリンソートとは? C#の実装 オリジナルの実装 少し改造してみる C++で実装 オリジナルの実装 少し改造してみ…

Cocos2d-xのListViewでGridView風の表示を扱うためのライブラリ

Cocos2d-xの「ListView {cocos2d::ui}」でグリッド風の表示(GridView)を扱うためのライブラリを作成しました。 ある程度動作が確認できたので公開したいと思います。 動いているところ 実際に動作させると以下のようになります。 1行の中に複数のアイテム…

C++でstd::mapにキーが存在するか調べる(C++20含む

C++の連想配列クラスのstd::mapの、テーブル内にキーが存在するかどうか確認するための方法の紹介です。 ものすごーく古くからあるクラスなので若干クセがあります。 C++20ならcontainsメソッドを使う C++20であればmapにcontainsというメソッドが追加されて…

Cocos2d-xでテクスチャの簡易ヒットテスト(ver3.17.1対応版)

Cocos2d-xでテクスチャの簡易ヒットテスト(ver3.17.1で確認済み) 今回は、四角いSpriteのテクスチャー内において、色がついている場所がタッチされたかそうでないかを判断する方法を紹介したいと思います。 絵にすると以下のような感じになります。テクスチ…

C++で時間計測 & ストップウォッチを実装する

C++11から「std::chrono」という時間を表す型がいくつか追加になっています。 従来の時間取得方法からずいぶん使いやすい形で機能が提供されています。 ある区間の時間を図るには以下のように記述します。 #include <iostream> #include <chrono> void Foo() { // 開始・終了時</chrono></iostream>…

C++でUUID(GUID)風のデータを生成する

C++

C++でUUID(GUID)風のデータ列を取得するを紹介したいと思います。 あくまで「風」なので実際に使用した結果、何らかの障害が発生したとしても責任は負えません。それでも良ければ以下参照ください。 確認環境 紹介する実装は以下環境で作成・確認していま…

C++でif文の条件式中で変数に数値を代入するとどうなるのか?

以下ただの個人的なメモです。 言語仕様として falseは「0」 trueは「0以外」 int a = 1; if(a = 1) // ★条件式の中で代入してしまう { cout << "true" << endl; } else { cout << "false" << endl; } 結果は「true」が出力される。 aに1が代入されて if(1) …

Cocos2d-x 3.17.1からビルドがcmakeに変更された件に対応する、ほかトラブル対応

Cocos2d-x 3.17.1 の Androidのプロジェクトは、デフォルトのビルドシステムが「ndk-bild」から「cmake」に変更されています。それと、急に色々エラーが出たのでそれらの対応方法です。 // // ~\proj.android\gradle.properties // # android native code bu…

shared_ptrをOUTパラメータで使用する

C++

C++ の shared_ptr を引数の OUTパラメータに指定する方法の紹介です。 方法は非常に簡単です。引数を参照渡しすることで実現できます。 // 引数を参照にすることでOUTパラメータとして受け取れる void create(shared_ptr<Any>& out_value); これを呼び出し側で以</any>…

階層型状態マシン(HFSM)を実装する

GoFのデザインパターンでStateパターンを階層化した、階層型有限状態マシン(HFSM:Hierarchical Finite State Machines)を作成してゲーキャラクターの制御を行ったので実装例を紹介したいと思います。「階層型のステートマシン」なんて言ったりもします。 …

C++でC#ライクなプロパティを実現する

C#ではプロパティ構文というものがあります。これは、オブジェクトのメンバーへのアクセスを行うための、アクセッサー(setter/getter)をあたかも変数へのアクセスと同様に行える仕組みです。 // C#のプロパティ public class CSharpProp { // 一番簡単なプ…

メンバーに構造体配列(のポインタ)を持つ構造体のマーシャリング

C#の相互運用(C#からネイティブDLLの呼び出しの場合)で構造体の中に構造体配列のポインタを持つ関数のマーシャリングのやり方です。 ネイティブDLL側の宣言 ネイティブのDLL側の宣言は以下のようになっているとします。 // Sample.h // 外部に公開する関数…

dllexport と__stdcallを同時に宣言すると関数名が変わる

C++

VsiaulStudioのC++のプロジェクトで、DLLを作成し、関数を外部公開するため、 extern "C" と dllexport を指定したところ予期しない名前がついていて関数呼び出しが失敗してしまいました。 以下のように、外部公開される名前の先頭にアンダースコア、末尾に…

XとYのグリッド構造を全て列挙する foreach 操作を C++ で実装する

C++

画像処理や、ゲーム作成をしていると、結構な頻度でXとYで表される2次元のグリッドを扱う事があると思います。その時に、全グリッドを対象にした処理を書く際に以下のようなループ処理を結構な頻度で書く事になると思います。 // 頻繁に出てくるループ処理 f…

Cocos2d-x でsetScaleとsetContentSizeの挙動の違い

すぐ忘れるのでメモ代わりにまとています。 Cocos2d-xで、Spriteに対してサイズ変更するときに、setContentSize(), setScale()各々を実行した時の挙動の違いは以下の通りで。 まず、100x100pxの大きさの画像を読み込む。 Sprite* sp = Sprite::create("100x1…

CocosStudioで作ったLayerの子要素を自作のLayerに載せ替える

CocosStudioで作成で作成したLayerの子要素を自作したLayerに乗せ換える話です。 CocosStudioで「Layer」を作成し、csb形式でpublish後にCocos2d-x側から、そのレイヤーを呼び出します。そうすると、取得できる型がcocos2d::Node*型で取得できます。CocosStu…

Cocos2d-xでスプライトがタッチされたかどうかを判定する

Cocos2d-x でスプライトがタッチされたかどうかを判定する場合、タッチされた座標がスプライトの中か外かを判定して行います。便利なメソッドなどが存在しないため、定型的なコードを書く必要があります。 以下の環境で確認しています。 Cocos2d-x 3.16 Win3…

Cocos2d-x でレイヤーに対してリアルタイムにブラーをかける

ゲームでメニューを出す際に、背景がぼやけて少し暗くなった後に、前面にダイアログが表示される演出があります。そのような画面をぼやかす事をブラーを言います。 今回はこの「ブラー」をCocos2d-xのレイヤーに対してかけてみたいと思います。 成果物 作成…