月別アーカイブ: 2015年3月

数独データ構造

数独用データ構造の自分用メモ

単純には、char cell[81]; とし、各セルの値を 0~9 で保持すればよい。
が、このようなデータ構造では確定しているセルを探す処理が非効率になる。

一案としては、数値を 0b000000001, 0b000000010, … 0b100000000 で 1~9 を表すことにし、
short cell[81]; でセルの数字を、short candidates[81]; で候補数字をビットパターンで表す方法がある。
こうしておけばビット演算で、確定しているセルを探す処理が効率的になる。

もう一つの方法としては、1つの数字が候補として生きているかどうかを1つのビットボードで表す方法がある。
1つのビットボードを ushort * 9 で表すとすれば、全部の候補は ushort * 9 * 9 なので 182バイトとなる。

ファイヤーアルパカ>塗りつぶさない矩形描画

ファイヤーアルパカには、塗りつぶし矩形機能はあるのに、何故か塗りつぶさない矩形、つまり外枠だけの普通の四角を描く機能がありません。
外枠だけの普通の四角を描きたい時は、以下のようにするといいでしょう。

1. 描きたい矩形の色を予め選んでおく
2. 矩形選択モードを選び、描きたい矩形の部分を選択する。
temp
3. 選択範囲 → 選択境界の描画 メニューを実行
temp
4. 線幅を指定し、【OK】を押し、Ctrl + D で選択解除
temp

ファイヤーアルパカ>縁取りをする方法 その2

先の記事で、縁取りをする方法を紹介したが、より簡単な方法があった。

1. 「選択範囲」>「レイヤーを元に作成/不透明度」メニューを実行

ここまでは同じで、縁取りをしたい色を予め選んでおいてから

2. 「選択範囲」>「選択境界の描画」メニューを実行

temp

そうすると、上図のようなダイアログが表示されるので、ドロップダウンで「外側に描画」を選び、縁取りのサイズを入力し、【OK】を押すと、現在の色で縁取りをしてくれるぞ。
この方法の方がちょっとだけ操作手数が短いぞ。

ファイヤーアルパカ>縁取りをする方法

絵や文字の縁取りをする方法:

temp

1. メニューから、「選択範囲」>「レイヤーを元に作成/不透明度」を実行

この絵の場合は、背景が透明なので、「不透明度」の方を選びます。
背景が白であれば「輝度」の方を選びます。
そうすると、下図のように、背景部分が選択されます。

temp

2. メニューから、「選択範囲」>「拡張」を実行

そうすると、下図のようなダイアログが表示されるので、拡張するピクセル数を適当に入力します。

temp

ピクセル数を入力し【OK】を押すと、下図のように境界が大きくなった部分が選択されます。

temp

そこでバケツツールを使って、白に塗れば、白枠の完成です。

temp

ファイヤーアルパカ>自由変形

Ctrl + T を押すと、下図のように4隅と4辺に □ マーカが表示され、変形モードになります。
temp
この状態でマーカをドラッグすると、拡大縮小を行なうことができます。

自由変形させたい場合は、Ctrl を押しながら、4隅の □ マーカをドラッグします。
そうすると下図のように、パースを付けたような画像を簡単に生成できます。

temp

この機能を使えば、一度描いた絵をかなり自由に変形できるので、心ゆくまで修正できますね。;^p

ファイヤーアルパカ>白背景部分を透明にする

下図のような画像の白背景部分を透明にする方法:

temp

1. メニューから「選択範囲」>「レイヤーを元に作成/輝度」を実行

下図のように、白以外の部分が選択される。

temp

2. メニューから「選択範囲」>「反転」を実行

下図のように、白の背景部分が選択される。

temp

3. Delete を押す。メニューから「編集」>「切り取り」でも可

下図のように、背景部分が透明になる。
(最後に選択を解除するのは Ctrl + D)

temp

ビットフラグが9個あり、1個だけビットが立っている部分を検出 その2

2つの加算は

s1 = b0 ^ b1;
s0 = ~(b0 | b1);

でできる。論理演算の回数は3回だ。
したがって、8個分の加算は 8*3 = 24回
で、加算したものどうし(s01, s11, s02, s12)の加算は

s1 = (s01 & ~s12) | (~s11 & s02);
s0 = s01 & s02;

で可能だ。論理演算の回数は6回だ。
これを3回繰り返せば、8個分の加算が出来る。
合計は 24 + 6*3 = 32回
最後に s1 = (s1 & ~x2) | (s0 & x2) で残ったビットを足せばいいので、全部で論理演算回数は36回となる。

ビットフラグが9個あり、1個だけビットが立っている部分を検出

x0, x1, … x8 にビットフラグが入っていて、フラグが1箇所だけ立っているビットを検出するコード

各ビットの1の個数を数えればいいので、s0 は立っているビットの数が0,s1 は立っているビットの数が1 となるように計算する。

s1 = x0 ^ x1;
s0 = ~x0 & ~x1;

論理演算回数:4

x0 + x1 を計算する。あとは x2, x3, … x8 を足し込んでいけばよい。

s1 = (s1 & ~x2) | (s0 & x2)
s0 = s0 & ~x2;

論理演算回数:5

なので論理演算回数の合計は 4 + 5 * 7 = 39回となる。

ここ に載っているの方法だと32回なので、ちょっと冗長だぞ。

cocos2d-x > AdMob インターステンシャル広告

本稿では、cocos2d-x アプリに AdMob のインターステンシャル広告(以下、「全面広告」と記述する)を実装するための方法を記述します。
最初に書いておきますが、この方法は数々の素晴らしいアプリをリリースされている愛ふぉん太郎氏にご教授していただいた方法です。
ほんとうにありがとうございました。

手順は以下のとおりです。

1. AdMob 管理画面からインターステンシャル広告のIDを取得しておく
2. 全面広告を表示する Java の関数を実装する
3. 上記 Java 関数をコールする JNI インタフェース関数を実装する
4. 上記のインタフェース関数をコールする。

以下、詳細を説明する。ただし、1. の詳細は省略する。

2. 全面広告を表示する Java の関数を実装する
“AppActivity.java” を以下のように修正。

public class AppActivity extends Cocos2dxActivity {
    private static AppActivity thisptr = null;
    static InterstitialAd interstitialAd;
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState); 
        thisptr = this;
        .....
    }
    public static void launchInterstitial(){
      thisptr.runOnUiThread(new Runnable() {
      @Override
      public void run() {
        //ロード
        interstitialAd = new InterstitialAd(thisptr);
        interstitialAd.setAdUnitId("ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX");
        AdRequest adRequestI = new AdRequest.Builder().build();
        interstitialAd.loadAd(adRequestI);
        interstitialAd.setAdListener(new AdListener() {
          @Override
          public void onAdLoaded() {
            interstitialAd.show();
    	  }
    	});
      }
      });
    }
}

3. 上記 Java 関数をコールする JNI インタフェース関数を実装する

class InterfaceJNI
{
public:
  static void launchInterstitial();
};
void InterfaceJNI::launchInterstitial()
{
    JniMethodInfo jmInfo;
    if(JniHelper::getStaticMethodInfo(jmInfo,
        JNICLASSNAME,
        "launchInterstitial",
        "()V"))		//	void ()
    {
        jmInfo.env->CallStaticVoidMethod(jmInfo.classID, jmInfo.methodID);
        jmInfo.env->DeleteLocalRef(jmInfo.classID);
    }
}

4. 上記のインタフェース関数をコールする。

InterfaceJNI::launchInterstitial(); を記述するだけ。

 

cocos2d-x > 矩形スプライトを作る

矩形スプライトを作って配置する場合、その画像を予め作っておき、

auto sprite = Sprite::create("rect.png");

と書いてもいいのだが、以下のように create() でスプライトを
生成し、setTextureRect(const Rect&) で矩形を生成することも可能だぞ。

auto sprite = Sprite::create();
sprite->setTextureRect(Rect(0, 0, 100, 200));

矩形の色を指定する場合は setColor(const Color3B&) を、
透明度を指定する場合は setOpacity(GLubyte) をコールするといいぞ。

sprite->setColor(Color3B(0, 255, 128));
sprite->setOpacity(128);