読者です 読者をやめる 読者になる 読者になる

<!--親の顔より見た光景-->

日々の発見を残していきます。

【宣伝】マインスイーパのAndroidアプリが完成

android

このブログは自分のメモ用だけど、ユーザーが欲しいので宣伝…

表題の通りマインスイーパアプリが完成しました。
特殊なルールは無く、本当にシンプルなマインスイーパになっています。
是非プレイしてみてください。
↓ダウンロードはこちらから↓
play.google.com

スクリーンショット
f:id:akagi13213:20170324165807p:plain

【C】constのメモ

C
1. const int *p;

「値を変更できないint」を指すポインタ。アドレス書き換えられるけど、アドレスが指す中身変更できない
【例】

const int *p;
int *temp;

p = temp;    // OK
*p = 5;      // エラー
2. int * const p;

int型への「const修飾された」ポインタ(int *p; は int型へのポインタ)。アドレスが指す中身書き換えられるけど、アドレスそのものは変更できない
【例】

int * const p;
int *temp;

p = temp;    // エラー
*p = 5;      // OK
3. const int * const p;

「値を変更できないint」への「値が変更できないポインタ」。アドレスの中身変更できないアドレス変更できない
【例】

const int * const p;
int *temp;

p = temp;    // エラー
*p = 5;      // エラー

【Android】onLongPressを使わないで長押し判定

Java android

背景

View上で長押しを判定したい時、通常はGestureDetectorクラスのOnGestureListenerをimplementsしてonLongPressを実装する。
GestureDetector | Android Developers

参考サイト
Androidプログラミングの館
Android タッチパネルのダブルタップや長押しを検出する方法 | TechBooster

しかしonLongPressは長押し判定の時間を指定できない。

今作ってるマインスイーパアプリでは長押しでフラグを立てる処理にしている。
onLongPressで長押し判定を実装すると、0.8秒程度押し続けないとならない。
0.8秒という時間は長く、ユーザーはスピーディーにフラグを立てることができなくてイライラしてしまう。

解決策

onTouchEventで取得できるMotionEvent.ACTION_DOWNとHandlerクラスを使う。

onTouchEventはViewクラスで画面がタッチされたときに呼び出されるメソッド。
詳しくはこちら
Androidでアプリ画面のタッチイベントを取得する方法 | TechBooster

Handlerクラスは「指定した時間後に処理を行いたい」という時に使い、処理の中身はRunnableクラスのrun()メソッドで実装する。
詳しくはこちら
[Android]指定した時間後にちょっとした処理を行う方法 | Developers.IO

結局長押し判定はこんなコードになる。convertCoordinateToAddress()は現在の座標からマス番号を求めるメソッド。
とりあえずACTION_DOWNが検出されたらhandlerを起動して、0.4秒後にrunメソッドを実行する。
0.4秒を測ってる間に指上げなどの邪魔が入ったらhandlerを中止する。

参考サイト
java - Detecting a long press with Android - Stack Overflow

【MainActivity.java

/*略*/
long LONG_PRESS_TIME = 400;    // 長押し時間(ミリ秒)
Handler long_press_handler = new Handler();
Runnable long_press_receiver = new Runnable() {
    @Override
    public void run()
    {
        // 長押しする
        longClickSquare();
    }
};

/*略*/
@Override
public boolean onTouchEvent( MotionEvent e )
{
    switch ( e.getAction() )
    {
        case MotionEvent.ACTION_DOWN:    // 指が触れたとき
            action_down_square_address = game_view.convertCoordinateToAddress(e.getX(), e.getY());       // 触れたマス番号を記憶
            long_press_handler.postDelayed( long_press_receiver, LONG_PRESS_TIME);       // 長押し判定
            break;

        case MotionEvent.ACTION_UP:     // 指を上げたとき
            long_press_handler.removeCallbacks( long_press_receiver );    // 長押し中に指を上げたらhandlerの処理を中止
            break;

        case MotionEvent.ACTION_MOVE :    // 指でなぞったとき
            // 触れたマスが最初に触れていたマスと違う番号なら
            if ( game_view.convertCoordinateToAddress(e.getX(), e.getY()) != action_down_square_address ) {
                long_press_handler.removeCallbacks( long_press_receiver );    // 最初に触れたマスから離れたらhandlerの処理を中止
            }
            break;

        default:
            break;
        }
        return false;
    }
}

/*略*/

命名で参考になるサイト

コーディング

関数名によく使われる英単語(動詞)の意味とニュアンス | PHP Archive

Y.A.M の 雑記帳: 「よりよいコードを求めて命名について頭をひねる会」のログ

プログラミングでよく使う英単語のまとめ【随時更新】 - Qiita

【戒め】コピペ厳禁

コーディング

f:id:akagi13213:20170228194734p:plain

コピペしたせいで275行目以降のif文がおかしい。

バグを生む要因になるので、めんどくさくても手打ちで書くこと。

【Android】マインスイーパのメイン画面を作る

android Java

f:id:akagi13213:20170226214406p:plain
こんな画面を作った。

最初は
・GridLayoutとImageButton……マス
・Chronometer……経過時間
・TextView……残り爆弾数
でこの画面を実現する予定だったが、GridLayoutでボタン同士を密接させる事ができなかった。

一般的にゲーム画面を作る際はViewクラスを使うらしいので、そのクラスに画像を乗っけてった。
Viewで画像を表示する - @ANDROID開発

今のところはViewに画像を置いただけで、クリックリスナーは作ってない。
でもゲームの素材を作るのは楽しかった。

タッチした座標を受け取ってマスの画像を変更させる…というのが次の課題。
自分のスマホ解像度(1440 * 2560 xxxhdpi)にしか対応していないが、そこは開き直る。


以下、ソースコードのメモ。
【MainActivity.java

MainActivityはGameViewクラスを呼び出すだけ。

【GameView.java

・12行目…描画に必要なクラス。Paintクラスの中身はBitmapを描画する際は空でいいが、矩形や直線、円などを描画したいときは以下のようにPaintクラスに情報を格納する。

// 円
paint.setColor(Color.YELLOW);    // 線の色
paint.setStrokeWidth(50);    // 線の太さ
paint.setAntiAlias(true);    // アンチエイリアスするかどうか
paint.setStyle(Paint.Style.STROKE);    // 線のみ表示
// (x,y,r,paint) x座標, y座標, r半径
canvas.drawCircle(650, 440, 80, paint);

・13~18行目…描画で使う画像をリソースから指定する。

・20~30行目…描画の際の座標指定。

・42~46…マスの描画。マスを一個置いたらマスのX座標分(144Pixel)横に移動してまたマスを置く。これを縦でも同じように繰り返す。

【AndroidManifest.xml

7行目でステータスバーを消してる。

このアプリの開発から、Eclipseは捨ててAndroidStudioを導入した。
見た目最高、使いやすい
f:id:akagi13213:20170226225001p:plain

【Chrome】知恵袋右下に表示されるランキングを非表示にする

くだらない情報ばかり並べてるYahoo知恵袋の総合Q&Aランキングを消す。(ワイドショー並みにイライラする)

知恵袋右側のランキング等を非表示にする方法 - Yahoo!知恵袋

こちらのリンクはIEでの消し方しか載っていなかったのでChromeでやってみた。

f:id:akagi13213:20170220224054p:plain

 

 

1.Chrome拡張機能Stylish」をインストール。ユーザースタイルシートをいじれるようになる。

chrome.google.com

 

2.インストールしたアイコンをクリック、スタイルを管理するをクリック。新しいスタイルを作成。

f:id:akagi13213:20170220224745p:plain     f:id:akagi13213:20170220224859p:plain

 

3.以下の文をテキストエリアにコピペ。

/* ランキングの非表示 */
.mdCmmn {display: none !important;}

/* PRの非表示 */
.mdAdImg {display: none !important;}

/* バナーの非表示 */
.mdLnkBnnr {display: none !important;}

/*動画付Q&Aの非表示*/
.sideTextList {display: none !important;}
/* 最新の回答の非表示 */
#respondentInfo {display: none !important;}

/*ふわふわモジュールの非表示*/
.mdFwa {display: none !important;}
.overlayWrite {display: none !important;}

/*総合ランキングの非表示*/
#nwrnk {display: none !important;}

/*このカテゴリの回答受付中の質問の非表示*/
.md_listCmmn {display: none !important;}

/*年末年始は動画で楽しもう!の非表示*/
.newYearsHoliday {display: none !important;}
.recommendMovie {display: none !important;}
/*HELP! お願い教えてー!の非表示*/
#rcmd_que {display: none !important;}

/*トップページ質問、動画の非表示*/
#rcqa4ut {display: none !important;}
#qa {display: none !important;}
#nt {display: none !important;}
#rcqa4ut {display: none !important;}
#yvp {display: none !important;}

/*関連広告の非表示*/
#So1 {display: none !important;}
#So2 {display: none !important;}
#vo_main {display: none !important;}

/*ランキングの非表示*/
.at-hd-stat {display: none !important;}

/*回答後のページに表示される質問の非表示*/
#aurge {display: none !important;}

f:id:akagi13213:20170220225411p:plain

 

4.適用先を「次で始まるURL」にして、

  ・http://detail.chiebukuro.yahoo.co.jp

  ・http://chiebukuro.yahoo.co.jp

 この二つを追加。最後にスタイルシートの名前を入力して保存で終了。

 

結構綺麗になりました。

f:id:akagi13213:20170220225759p:plain