スマホアプリならアンドロック
スマホアプリ(アンドロイド)レビューやスマホ情報はアンドロックアプリの言語 | 日本語 |
---|---|
金額 | 無料 |
開発者 | 株式会社アンドロック |
AndRockの評価 |
AndRockで開発したアプリ「パズルDE★ぴょん」のソースを解説します!
AndRockで開発したアプリ「パズルDE★ぴょん」のソースを解説しながらアンドロイドアプリの開発情報を紹介します。
今回は主にボタン動作を中心にソース解説を行います。
ちなみに、私の開発経験は丸4年程です。
Webシステム開発やFlashを用いたオープンソーシャルゲーム開発に携わってきました。
Androidの環境もタダで構築・開発できるのでどんなものかなーと思い作ってみたアプリがこのスライドパズルゲームアプリです。
Javaは未経験でしたが、初挑戦のアンドロイドアプリ開発でここまで作成できました。
◎ボタンの知識だけあれば大丈夫
おそらく多くの人がAndroidでHelloWorldを体験したあとは
ボタンの動作を確かめるのではないでしょうか。
今回のアプリは、ボタンの動作さえ知っておけば基本的にはOKです。
Buttonクラスを継承したClickButtonクラスを作成しそれに番号等をもたせることで、
今何の番号を表示しているか・どこの位置にいるかの情報をもたせています。
public class clickButton extends Button { private int number_x; //現在の位置 private int number_y; //現在の位置 private int disp_number; //表示されている数値 private int inc_number = 0; //通し番号 private Boolean nullButton = false;//現在の番号がNULL(はっぱ)であるかどうか clickButton(Context context) { super(context); playingGameLevel = gameLevel; setBackgroundResource(image_01); }
あとは全体を管理する変数がひとつ用意してあるので
クリックした際に移動可能な方向へ数値の入れ替えを行います。
カエルの画像もsetBackgroundResource(リソースID)で画像を乗せているだけです。
クリックした際に移動可能な方向へ数値の入れ替えを行います。
カエルひとつの動きはこれだけです。
Button kaeru_img = new Button(this); kaeru_img.setBackgroundResource(R.drawable.kaeru); kaeru_img.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { clickButton btn = (clickButton)v; moveManage.moveButton(btn); } });
▼MoveManage(数値移動管理)クラス
//かえるボタンとはっぱボタンを上下左右入れ替える処理 public void moveButton(clickButton move_btn) { //タッチ回数カウント touchStep++; int num = move_btn.getIncNum(); //左の番号 int left = num - 1; //右の番号 int right = num + 1; //上の番号 int top = num - playingGameLevel; //下の番号 int bottom = num + playingGameLevel; if( left >= 0 && clickButtons.get(left).isNullButton() && num % playingGameLevel != 0) { changeButtonList(move_btn,clickButtons.get(left)); } else if(top >= 0 && clickButtons.get(top).isNullButton()) { changeButtonList(move_btn,clickButtons.get(top)); } else if(right < playingGameLevel*playingGameLevel && num % playingGameLevel != playingGameLevel-1 && clickButtons.get(right).isNullButton()) { changeButtonList(move_btn,clickButtons.get(right)); } else if(bottom < playingGameLevel*playingGameLevel && clickButtons.get(bottom).isNullButton()) { changeButtonList(move_btn,clickButtons.get(bottom)); } } //数値を入れ替える処理 public void changeButtonList(clickButton bef_button,clickButton aft_button) { int tempNum = bef_button.getDispNumber(); bef_button.setDispNumber(aft_button.getDispNumber()); aft_button.setDispNumber(tempNum); //番号が揃ったか(完成したか)チェック checkComplate(); } //完成したか確認 public void checkComplate() { for(int i=0;i< (playingGameLevel * playingGameLevel)-1;i++) { if(i+1 != clickButtons.get(i).getDispNumber()) { //完成していない return; } } //完成したらダイアログを表示 showComplateDialog(); }
あとはダイアログとかSQLLiteの処理など細かいものも完成品には入っていますが
正直なくても見た目を整えればカタチになるものはなるので、
まずは数字がうごいて何となく形になった!というだけでも達成感を味わえます。
ちなみにタイマー処理が大変だった印象があります。
もう少し簡単に出来るといいなと思います。(きっともっと良い方法があるのではと・・)
//パズルでぴょんのタイマー処理 public class gameTimer extends TimerTask { static int count = 0; : @Override public void run() { handler.post(new Runnable() { public void run() { count++; } }); } (省略) :
◎ゲームの手詰まり
出来たと喜んで上司に確認をしてもらったのですが
ランダムに番号を配置するだけではゲームがクリアできない(手詰まりになる)ケースがあることを指摘されました。
15パズルの系統のパズルは、単にランダムに数字を配置しただけでは、
ゴールに到達しない場合があります。よく知られているように、
上の 15 パズルのゴールの盤面から 14 と 15 を入れ換えた盤面は、
ゴールに到達できない不可能な盤面です。
ランダムに数字を配置して問題を出題する方法では、1/2 の確率で正解のない問題になってしまいます」
★詳細はこちら★
ということで、まずは完成状態から数字をシャッフルしていくことで対応しました。
この他ちゃんと計算する方法もあるようなのですが
メモリリークも怖いし、ということでシャッフルにしたのです。
◎メモリリーク?
アンドロイドアプリを開発しているとメモリリークの話題が出てきますよね。
「パズルDE★ぴょん」でもリソースを使ってなるべく解放・再利用・・を意識して作りました。
これくらいのアプリだとあまり気にする必要もないのですが、気にしておくにこしたことはありません。
突然エラーで落ちてアンインストールの対象になってしまうのは悲しいですよね。
◎どうでもよくないタイトルと素材
タイトルを決めるのはアプリの印象や方向性を決める大切な作業です。
なんでカエルにしたか・・・上司がカエル好きだから・・・というのもあるのですが
簡単なパズルゲームなので子供っぽいイメージでいいのかなということです。
一発でパズルだなと分かる名前とか。
他の案
・ぴょこっとパズル
・パズルだケロ
などなど・・・
あとは素材をいかに「それらしく」作るかもポイントになるのかなと思います。
同じ内容でも無地背景にボタンを並べるだけとでは当然印象が違います。
(クールな感じを演出するなら有りかと思います)
◎開発環境について
開発中、エミュレーターが動かなかったり、ソースが読み込めないなど意味不明な挙動をしていました。
私はEclipseを使用していたのですが、頻繁に「クリーン」を繰り返しながら作業を進めていました。
原因追求よりもPC再起動であっというまに解決したりします。
◎最大の反省点
パズルDEぴょんには画面遷移がいくつかありますが
Androidの画面遷移の基本であるIntentを使用していません。
試しにゲームを起動している最中に戻るボタンをクリックしてみてください。
アプリが終了したと思います。
これがIntentを使用して画面遷移を行うとちゃんとアプリ内の前の画面に戻ります。
(※作りにもよります)
じつはTableLayoutに乗せている部品を外したり乗せたりを繰り返して
画面遷移しているようにみせかけているだけなのです。
//注意:あまり参考にしないように。 //レコード画面からスタート画面へ戻る public void removeRecord() { main_layout.removeView(record); main_layout.addView(start); } //アバウトミー画面からスタート画面へ戻る public void removeAboutme() { main_layout.removeView(about); main_layout.addView(start); } //レベルセレクト画面からスタート画面へ戻る public void removeSelect() { main_layout.removeView(select); main_layout.addView(start); }
なぜこのような作りにしたかはそもそも着手時にボタンの知識だけだったということにもあるのですが
もし改修するとしたらまずそこを直したいと思っています。
今ではIntentを使用してアプリ作成が出来ていますが
やはり開発しやすいしソースもシンプルきれいになります。
アンドロイド携帯向けアプリの人気ランキングページです。ビジネスに、遊びに、とてもお役立ちのアンドロイドアプリが勢ぞろい。どのアプリも人気のある「10個」です。厳選されたラインナップ。もしかしたらあなたの携帯ライフを劇的に変えるアプリも現れるかもしれません!日々変わるこのアプリのランキング動向を、ぜひチェックしてください。
2024年シリーズ1 セレクション第2弾の評価ランキングを紹介します! 第・・・
プロスピA(プロ野球スピリッツA)の攻略情報をまとめたページです。 基本・・・
2024年シリーズ1 セレクション第1弾の評価ランキングを紹介します! 最・・・
2024年シリーズ1 TS第3弾の評価ランキングを紹介します! 前回はイチロ・・・
現役の選手・監督・コーチが全盛期の能力になって登場するTS(タイムスリッ・・・
2024年シリーズ1 エキサイティングプレイヤー第2弾の評価ランキングを紹介・・・
この記事では、エキサイティングプレイヤーに続くシリーズ1の目玉スカウト「プ・・・