http://codezine.jp/article/detail/4842?p=2
前回の続き。
一覧表示アクティビティはとりあえず完成しましたが、現在は同期的に動作しています。
同期的というのはつまり、onCreate()→onResume()→画面描画と順番に動作しているということで、もし名刺が大量に増えてonResume()に時間がかかるようになった場合画面表示までの時間が遅くなってしまうということです。
そこで非同期的に動作させることができるようになっています。
onResume()内の具体的処理を非同期処理に任せることで、
onCreate()→onResume()→先に画面描画
↓
非同期処理の結果を出力
と並列な処理を行うことができます。
先に画面を出すことで、全体の処理時間は変わらなくても遅いという感覚を減らすことができます。
ListActivity.onResume()を修正。
/src/com.example.bizcard/ListActivity.java
//アクティビティが前面に来たときに実行
public void onResume() {
super.onResume();
//DBの中身取得は非同期処理する
DataLoadTask task = new DataLoadTask();
task.execute();
}
DataLoadTaskを実装することにします。非同期処理タスクはAsyncTaskを継承します。
//一覧データの取得と表示を行うタスク
public class DataLoadTask extends AsyncTask<Object, Integer, List<BizCard>> {
// 処理中ダイアログ
private ProgressDialog progressDialog = null;
//バックグラウンド処理実行前に実行される
@Override
protected void onPreExecute() {
// 「データ取得中」ダイアログ表示
progressDialog = new ProgressDialog(ListActivity.this);
progressDialog.setMessage(getResources().getText(
R.string.data_loading));
progressDialog.setIndeterminate(true);
progressDialog.show();
}
//バックグラウンドで実行するメイン処理
@Override
protected List<BizCard> doInBackground(Object... params) {
// 一覧データの取得をバックグラウンドで実行
BizCardDao dao = new BizCardDao(ListActivity.this);
return dao.list();
}
//バックグラウンド実行のあとで実行
@Override
protected void onPostExecute(List<BizCard> result) {
// ダイアログをクローズ
progressDialog.dismiss();
// 表示データのクリア
arrayAdapter.clear();
// 表示データの設定
for (BizCard bizCard : result) {
arrayAdapter.add(bizCard);
}
}
}
R.string.data_loadingをセット。/res/values/strings.xml
<string name="data_loading">データを取得しています</string>
実行すると、まず普通にListActivity.onResume()までが実行されます。
そこでDataLoadTask.execute()が呼ばれることで、まずDataLoadTask.onPreExecute()が実行されます。
onPreExecute()は、次のdoInBackground()が実行される前に画面描画を行ってくれます。
ここでは単にダイアログを表示しています。
ProgressDialog.setIndeterminate(true)はプログレスバーを表示しないだそうですが、falseにしても変わりませんでした。
使用する場合、setProgress()やsetProgressStyle()などでプログレスバーをセットできます。
後DataLoadTask.doInBackground()で具体的な重い処理を記述します。
引数および返り値は任意にセットすることができ、返り値はonPostExecute()の引数として引き渡されます。
DataLoadTask.onPostExecute()は最後に実行され、後始末などの処理を行います。
今回はdoInBackground()で取得した名刺情報を画面に反映させ、ダイアログの消去を行っています。
以上で簡単に非同期処理の実装が完成しました。
てか、AsyncTaskの解説って少ないよね。
publishProgress()とかどう使えばいいのかわからんのだが。
doInBackground()はUIじゃないはずなのにprogressDialog.dismiss()とか書くと動いたりするしよくわからん。
大往生パッチ→来週から検証、問題なければ早くて9月に配信
マイルストーンのマッシブ→Fable3と同日10/28
ぐわんげ→9月末~10月頭、機能追加いっぱい。キルカメラとか。でもお高いんでしょう?⇒800ゲイツ
怒首領蜂大復活→11/25
弾銃フィーバロン→開発決定、ハード未定(でも360実機でうごいてる)
むちむちポーク→2011年春発売!(ピンクスウィーツとむちむちポークのカップリング) 雌豚っていいたいよね
ケイブのタイトルはIKDと社長の性癖で決まる
ケイブ「うちはちょっと遠慮したい」 マイル「じゃあうちが・・・」 ガルチ「いやうちが・・・」 社長「いやいやうちが・・・」 ジャム「いやエンブレが・・・」 ケイブ「じゃあ俺が・・・」 ケイブ以外「どうぞどうぞ」
ケイブあと数本進行中
ASDは会議中にペグル→革新的!
革新的!
くすりのマジョラム 鈴城 芹
☆☆☆☆
魔法の薬剤師魔女っ子ラムちゃん(26)が魔法の薬を使ったり使わなかったりする話。
基本ギャグ漫画4コマだが、医学的に妙に細かいところを突いてたり、帽子やTシャツなどよくわからないところに毎回凝ってたりと、わりと読み返しに耐えるできばえです。
でもまあ、そんなところはどうでもよくて見た目と微エロだけでも十分なんだがな。
で、ゴルゴロスってどんなセンスだよ。
がんばれ!消えるな!!色素薄子さん 3 水月 とーこ
☆☆☆☆
「なもんか、作ったのは薫さ…」→「薫の作ったモノは毒だ」
あれ?
重大な矛盾を孕みつつもそんな細かいことは気にせず癒されよう。
優しい薄子が可愛くてしょうがない。
荒川アンダーザブリッジ3 中村 光
☆☆☆
ヒモが学校を始める話とついに会社にバレる話。
つうか社長がずっと橋の下で大丈夫なのかその会社。
話の展開がないので書くことがないな。
Mad Science ―炎と煙と轟音の科学実験54 Theodore Gray (著) 高橋 信夫 (翻訳)
☆☆☆
食塩を作るために金属ナトリウムと塩素ガスを混合、とまあそんな本。
大判のカラー写真がふんだんに使われていて見た目美しいんだけど、作り方とかの記述が非常にいい加減なので再現できません。
そこらへん含め、アリエナイ理科ノ教科書シリーズの方がずっと資料性が高いです。
本書最大の謎は、何故これがオライリーなのかというところでしょう。
六とん4 一枚のとんかつ (講談社ノベルス) 蘇部 健一
☆☆
一体どうしたんだ蘇部…
おお、と思った話が「聖職」「恋愛小説はお好き?」くらいだったんだが。
横山、おまえ輝いてるぜ。
「一枚のとんかつ」は18ページあたりでこんなトリックだな、と見当が付いたし、
「ひとりジェンカ」はオチが見え見えすぎだった。
「追われる男」は未だにオチの意味がわからない。
あとがきはちょっとだけ面白かった。
アクティビティとデータベース操作クラスというそれぞれの部品が完成したので、これらをくっつけていきます。
まず一覧画面。
現在「新規追加」しか表示されず、しかもクリックしても動きませんが、これを動作するようにしてみます。
/src/com.example.bizcard/ListActivity.java
public class ListActivity extends Activity {
//インスタンス変数
private ListView listView;
ArrayAdapter arrayAdapter = null;
//起動時に実行
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 配列を作成
arrayAdapter = new ArrayAdapter<bizcard>(this, android.R.layout.simple_list_item_1);
// main.xmlのListViewを取得
listView = (ListView) findViewById(R.id.list);
// 配列を突っ込む
listView.setAdapter(arrayAdapter);
}
//アクティビティが前面に来たときに実行
public void onResume() {
super.onResume();
//DBアクセスクラス
BizCardDao dao = new BizCardDao(ListActivity.this);
//DBの中身を取得
List<bizcard> result = dao.list();
//現在の値をクリア
arrayAdapter.clear();
//全データをarrayAdapterに突っ込む
for (BizCard bizCard : result) {
arrayAdapter.add(bizCard);
}
}
}
あれ?
新規登録とか書いてあったんで単なる動作選択メニューだと思ってたんだが名刺一覧だったのか。
arrayAdapter.add(bizCard)にはStringではなくBizCardを突っ込んでいるので、表示は前作ったBizCard.toString()が使用されることになります。
以上でデータベースに登録してある値を拾ってきて表示するようになりました。
初回起動時にはDatabaseOpenHelper.onCreate()が作動してデフォルトの4件のデータを登録してくれます。
めでたしめでたし。
エミュレータで動作中のデータベースの状態をEclipseから見ることはできないの?
外部閲覧方法なら前飛ばしたところに書いてあります。
コマンドプロンプトから
> adb shell
# cd /data/data/com.example.bizcard/databases/
# sqlite3 BIZ_CARD
> select * from biz_card;
で閲覧できますが、見事に文字化けしています。
AndroidはUTF-8ですが、コマンドプロンプトはSJISなうえに文字コード変更が面倒なんですよね。
右クリックから「プロパティ」→「フォント」→「MSゴシック」を選択、コマンドプロンプトから"chcp 65001"でUTF-8になり、↑も文字化け無く見ることができます。
ただコマンドプロンプトの使い勝手が悪いので常用したいとは思えません。
また、「ウィンドウ」→「ビューの表示」→「その他」→「Android」→「ファイル・エクスプローラー」→「data/data/com.example.bizcard/databases/BIZ_CARD」→右上の「Pull a file from the device」ボタンとすることでDBの状態をファイルとして出力することができます。
いやあちがうんだ、もっとこうDBツリービューを覗けばOK、みたいなかんじで現状を直接確認とかできないのか?
Androidの記事
スーパーファミコンウォーズ 攻略指南
WiiのVCにて好評販売中
部隊紹介
・歩兵
本シリーズの基本にして本質。
占領・戦線維持・人海戦術のエキスパート。
序盤は歩兵。中盤も歩兵。終盤もやっぱり歩兵。
ロケット砲や対空ミサイル等の反撃されない部隊以外にはこちらからは攻撃せず、占領と壁になることを最優先する。
例外は都市を占領中の敵歩兵、残り2、3両になった軽戦車など、ごく一部。
突っ込んできた敵戦闘機を囲い込むという知られざる用法もあるが出番は少ない。
都市占領はファミコンウォーズ同様、一部隊でやり遂げる必要がある形式なので、1ターンで全滅さえしなければ合流も有効な手段。
・重戦車
最強の地上部隊。
あらゆる地上部隊に壊滅的なダメージを与えることができる戦線の大黒柱。
飛行場がないマップであれば、金の続く限り本部隊を生産し続けるとよい。
逆に敵の重戦車は爆撃機に任せること。
燃料が意外と少ないが、それが切れるような状況に陥ることはまず無い。
・補給車
ヘリに燃料・弾薬補給できるのが特徴。
意外と墜落しやすい輸送ヘリを支えるのに一部隊あると便利。
逆に、輸送ヘリが不要なマップでは補給車も不要。
・対空戦車
歩兵相手に意外と強いので、戦闘ヘリ対策を兼ねて前線都市に配置しておくのも悪くない。
ただ前線に持って行く間に制空権維持が戦闘機で間に合うようになって不要になる。
・戦闘機
制空権の要。
中盤までに一部隊は欲しい。
全航空部隊に圧倒的攻撃力を誇る。
攻撃優先度は爆撃機>戦闘ヘリ>輸送ヘリ>戦闘機。
ただし味方爆撃機が増えてきたら敵戦闘機を先に始末すること。
・爆撃機
地上攻撃の要。
ほぼ全ての地上部隊を壊滅させる威力があり、またほとんどの地上部隊は反撃すらすることができない。
戦闘機、対空ミサイルの射程には入らないように注意。
対空戦車にも一応勝てるが、できれば対空戦車の相手は重戦車に任せたい。
中盤以降は毎ターン一部隊作成する勢いで。
終盤は敵工場・飛行場を占拠し相手の部隊生産を抑え、首都占領部隊の盾になる役割もある。
・攻撃機
対空・対地・対艦をこなすマルチロール機。
どちらも本職の戦闘機・爆撃機に比べると弱いが、両者を兼用する運用が可能。
また、足も速い。
ただし敵戦闘機にだけは圧倒的に弱いので、敵戦闘機の相手は味方戦闘機に任せること。
中盤以降金が余りだしたら爆撃機の代わりに作ると便利。
・輸送ヘリ
歩兵一部隊を搭載して移動可能。
島に占領部隊を送り込むのに必須。
道が通じている場合は特に必要ない。
・輸送船
地上部隊を2部隊輸送可能。
敵首都と地続きでない場合輸送船で地上部隊を運ぶ必要がある。
といっても歩兵と重戦車しか載せない。
・護衛艦
自ら作る必要はない。
敵が潜水艦を造った時、輸送船を守るために一部隊作成する。
上記以外の兵科は、一切不要です。
むしろ作ってはなりません。
対空ミサイルとか作るだけ金の無駄です。
キャンペーン紹介
全16面。
残念ながらゲームボーイウォーズのような裏面はありません。
最終面以外はほぼ同等戦力から開始なので負ける要素はありません。
戦略紹介
・序盤
工場のある限り歩兵を生産する。
歩兵はひたすら都市占領を狙う。
金が徐々に貯まるので、飛行場のある場合は戦闘機を、なければ重戦車を作る。
戦闘機は敵対空戦車の届かない場所まで飛ばし、輸送ヘリや戦闘ヘリを牽制する。
重戦車は最前線まで運び、敵の進軍や敵歩兵の占領を防ぐ。
歩兵は40部隊ほどあれば今後の心配はほとんどない。
マップ中央の都市まで占領したら中盤。
ちなみに部隊レベルアップとかは只の飾りなので全く気にする必要はありません。
・中盤
歩兵生産は毎ターン2、3部隊に減らしつつ、余ったリソースを重戦車、爆撃機に当てる。
島嶼の場合は輸送ヘリで離れ島の占領を目指す。
重戦車、爆撃機で敵戦車を排除し、歩兵は敵を攻撃せずに前進、都市占領を優先する。
敵は意味もなく対空自走砲や中戦車などを作ってくるので、反撃されないことを確認しつつ壊滅させよう。
・終盤
敵が戦闘工兵を作り出したら勝利確定。
毎ターン爆撃機もしくは重戦車を作成し、敵工場の占拠を目指す。
首都を囲んでしまえば、あとは一気に占領するだけ。
もう歩兵を生産する必要はないが、歩兵が全滅すると敵首都占領ができなくなるので注意しよう。
難マップ紹介
つうても最終面以外負ける要素がない。
最終面に関してもゲームボーイウォーズより遙かに緩いのでどうとでもなる。
ということで書くことがなくなったので終了。
「笑わない科学者と時詠みの魔法使い」のレビュー投稿が許可されないんだが何故だ。
「バカとテストと召喚獣」みたいな中身の無い感想でも許可されたというのにきちんと中身を書いたレビューが不許可とかこの差はなんだ。
まあバカテスは感想を書くことすら出来ないくらい寒かったから仕方ないかもしれないが。
荒川アンダーザブリッジ2 中村 光
☆☆☆☆
奇人変人続々登場の第2巻。
お姫様だっこくらいいくらなんでも知ってるだろ、と思わないでもない。
無駄にかっこいい巻末カラーページはなんなんだろうな。
がんばれ!消えるな!!色素薄子さん 2 水月 とーこ
☆☆☆☆
薄子さんに迫る謎の魔の手…!
その薄さを軍事転用できればかなりの成果が期待できるということで薄子さんに謎のマッドサイエンティストが迫ります。
ていうか、やることが蛙の巨大化だったり瞬間成長する植物だったりと既に科学の限界を突破してるんですが。
ほんわかした日常延長部分と異次元科学部分が喧嘩してるというかなんというか。
エスパー魔美3 (藤子・F・不二雄大全集) 藤子・F・不二雄
☆☆☆
魔美のモデルは幼少期の思い出の一つだよね。
今同じことやったら何処かの馬鹿がしゃしゃり出てくるんだろうなあ。
ということで2巻と比べて比較的おとなしくなり、いじめや成績や応援団や詐欺師や放火魔や強盗と対峙…おとなしく?
あと高畑さんが意外と頼りにならないのがびっくりだ。
カッパときのこ 魔神 ぐり子
☆☆☆
文字通りのカッパときのこという謎生命体が謎日常生活をする謎漫画。
だいたいきのこがボコられて終了。いや、おまえ菌類だから包帯とかいらねえだろ。
全体的にそこはかとなくシュール感というより投げやり感が漂う謎漫画でした。
ただ後半の訳わからない別の漫画はいらなかった。
降魔霊符伝イズナ ぐっどぷらいす
「リストラ忍者イズナ再登場!大安売りだよ、買って買って~!」
の煽りがあまりに不憫で気の毒だったのでどんな中身かも知らずうっかり保護してしまった。
ゲーム内容はシレン系列ですが、残念ながらレベル継続制だったので残念。
まだ全然プレイしてないのですが。
全然どうでもいいんだがDAOって響きなんだかマヌケなかんじがしません?だお。
/src/com.example.bizcart/db/BizCardDao.java
public class BizCardDao {
//インスタンス変数
private DatabaseOpenHelper helper = null;
//コンストラクタ
public BizCardDao(Context context) {
helper = new DatabaseOpenHelper(context);
}
//レコードを保存する
public BizCard save(BizCard bizCard){
SQLiteDatabase db = helper.getWritableDatabase();
BizCard result = null;
try {
//保存するContentValuesオブジェクトを作成
ContentValues values = new ContentValues();
values.put( BizCard.COLUMN_PERSON_NAME, bizCard.getPersonName());
values.put( BizCard.COLUMN_COMPANY_NAME, bizCard.getCompanyName());
values.put( BizCard.COLUMN_ORGANIZATION_NAME, bizCard.getOrganizationName());
values.put( BizCard.COLUMN_POSITION_NAME, bizCard.getPositionName());
values.put( BizCard.COLUMN_ZIP_CODE, bizCard.getZipCode());
values.put( BizCard.COLUMN_ADDRESS, bizCard.getAddress());
values.put( BizCard.COLUMN_TEL1, bizCard.getTel1());
values.put( BizCard.COLUMN_TEL2, bizCard.getTel2());
values.put( BizCard.COLUMN_MAIL, bizCard.getMail());
Long rowId = bizCard.getRowid();
//保存
if( rowId == null){
rowId = db.insert( BizCard.TABLE_NAME, null, values);
}
else{
db.update( BizCard.TABLE_NAME, values, BizCard.COLUMN_ID + "=?", new String[]{ String.valueOf( rowId)});
}
//保存した中身を取得
result = load( rowId);
} finally {
db.close();
}
return result;
}
// 該当IDのレコードを取得
public BizCard load(Long rowId) {
SQLiteDatabase db = helper.getReadableDatabase();
BizCard bizCard = null;
try {
Cursor cursor = db.query( BizCard.TABLE_NAME, null, BizCard.COLUMN_ID + "=?", new String[]{ String.valueOf( rowId)}, null, null, null);
cursor.moveToFirst();
bizCard = getBizCard( cursor);
} finally {
db.close();
}
return bizCard;
}
// 全レコードを取得
public List list() {
SQLiteDatabase db = helper.getReadableDatabase();
List bizCardList;
try {
Cursor cursor = db.query( BizCard.TABLE_NAME, null, null, null, null, null, BizCard.COLUMN_ID);
bizCardList = new ArrayList ();
cursor.moveToFirst();
while( !cursor.isAfterLast()){
bizCardList.add( getBizCard( cursor));
cursor.moveToNext();
}
} finally {
db.close();
}
return bizCardList;
}
// 該当のレコードを削除
public void delete(BizCard bizCard) {
SQLiteDatabase db = helper.getWritableDatabase();
try {
db.delete( BizCard.TABLE_NAME, BizCard.COLUMN_ID + "=?", new String[]{ String.valueOf( bizCard.getRowid())});
} finally {
db.close();
}
}
// カーソルからオブジェクトへの変換を行うサブルーチン
private BizCard getBizCard( Cursor cursor){
BizCard bizCard = new BizCard();
bizCard.setRowid( cursor.getLong(0));
bizCard.setPersonName( cursor.getString(1));
bizCard.setCompanyName( cursor.getString(2));
bizCard.setOrganizationName( cursor.getString(3));
bizCard.setPositionName( cursor.getString(4));
bizCard.setZipCode( cursor.getString(5));
bizCard.setAddress( cursor.getString(6));
bizCard.setTel1( cursor.getString(7));
bizCard.setTel2( cursor.getString(8));
bizCard.setMail( cursor.getString(9));
return bizCard;
}
}
見知らぬコードが一気に増えました。順に見てみます。
save()でレコードを保存します。
SQLiteOpenHelperからSQLiteDatabaseオブジェクトを得るメソッドはgetReadableDatabase()とgetWritableDatabase()ふたつがありますが、前者は読み取り専用、後者は読み書きどちらも可能ということらしいです。
万一のことを考えて保存するメソッド以外はgetReadableDatabase()を呼んどけばいいということですかね。
ContentValuesはDBに保存する値を突っ込んでおく連想配列みたいなクラスです。
ContentValues.put(key, value)でキーと値のペアを注ぎ込んで、最後にinsert()なりupdate()なりの引数として渡します。
保存するメソッドはこんな形。
SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values)
SQLiteDatabase.update(String table, ContentValues values, String whereClause, String whereArgs[])
nullColumnHackって何だ?
updateの第三引数はwhere句、第四引数はバインドする値の配列です。
PHP的に言うとupdate($table, $values, 'hoge = ? AND fuga = ?', array( 'foo', 'bar' ) )ですかね。
保存に成功した場合は、引数のBizCardは使用せず保存したデータをload()で読み込んでいます。
そのload()は引数のIDのレコードを取得します。
SQLiteDatabase.query(String table, String columns[], String selection, String selectionArgs[], String groupBy, String having, String orderBy)
第二引数は取得するカラム名を並べるようです。
nullにすると全カラム取ってきてくれるみたい。
返り値はContentValuesでいいのに何故かCursorとかいう形で返ってくるので、BizCard形式に戻して返します。
このgetBizCard()がCursor.getString(1)とか書いてあるんですが今時カラム名じゃなくて番号かよ。こええよ。
Cursor.getColumn(BizCard.COLUMN_PERSON_NAME)とか無いの?
list()は保存されている全エントリをBizCardのListに入れて返します。
中身はload()とほぼ同じです。
while文中にあるCursor.isAfterLast()は最終行よりさらに先にいるかという意味のようです。
whileが最終行までくるくると回り続け、結果として全ての行を取得して返します。
これ、limitが設定されていないのでデータが増えていくと危険なことになりそうです。
delete()はそのまま削除の意味です。
サンプルでは引数がBizCardですがint BizCard.COLUMN_IDで十分な気が。
こんなかんじでデータベースを操作するクラスが完成しました。
Androidの記事
360のギャルゲと2DSTGは制覇するよ計画発動中。
CHAOS;HEAD らぶChu☆Chu!
実績1000/1000
七海とChu☆Chuする権利をやろう
まず本作は、CHAOS;HEAD NOAHの完全なる続編にして完結編にしておまけディスクです。
なので本編をプレイしていないと本作をプレイする意義は全くありません。
シナリオは本編トゥルーエンドの続きとなりますが、作品のベクトルは本編とは180度真逆を向いているので本編がアレだった人でも安心。
最期のオチが………ということもなく、極めて真っ当に甘々デレデレな普通のラブコメギャルゲです。
本編のアレが良かったのに無くなって大丈夫なの?と正直最初は思っていたのですが、本編のネタを織り込みつつも十分に面白い作品に仕上がっていました。
ただトゥルーエンドとか無いんですよね。
個別ルートとバッドエンドしか有りません。
ボリュームが少々小さめなのが残念です。
早くするんだ!間に合わなくなっても知らんぞー!
本編でもっさり重かったシステム周りはシュタゲを経て本作で随分改善されました。
特にメッセージスキップは非常に快適になっています。
むしろ早くなりすぎて止めたいところで止められないくらい。
そのかわりメニューを開くのに0.5テンポくらい躓くような感覚がありますが、まあ十分許容範囲です。
妄想トリガーはポジティブ、ネガティブは名目だけとなり、どちらを選んでも基本エロ妄想です。
妄想トリガー発生時にオートセーブされフラグ管理が楽になっています。
また、狙って攻略を行うというようなゲームではないので、トリガー選択時に誰についての妄想なのかがすぐわかるようになっています。
システムについては不満は全く無いといっていいでしょう。
はいてない…だと?
シナリオは基本的に一本道で、個別ルートがそこから枝分かれする形となります。
前半に10回ほどある妄想トリガーで対象キャラを2回選択しておくと、シナリオ分岐のある妄想トリガーで実績が解除されるという非常にわかりやすいシナリオ分岐形式で、個別シナリオ分岐で迷うことは一切ありません。
なんといっても全員本物のハッピーエンドです。
本編のアレやコレやに色々と切り刻まれた精神を優しく癒してくれるでしょう。
本作をプレイしてこそカオヘが完結するのだ、と言ってもいい。
文章は例によってネットスラング満載です。
プレイ開始直後のっけからポルナレフですし、JOJOやDBネタは知ってて当然レベルで頻出し、果てはブロント語とか童貞は小学生とかまで出てくる始末。
ちなみに本作のテーマは、「オタクとリア充は相反する概念ではない、両立しうる」というものですが、このテーマの研究は残念ながら既に先達たる万世橋わたる氏によって完膚無きまでに完成されております。
すなわち、
「オタクだからオタクなのだ!モテないからモテないのだ!!」
身も蓋も夢も希望もない。
七海がかわいすぎて生きているのが辛い
七海>(越えられない壁)>梨深>セナ=あやせ>美愛>優愛>>梢
プレイ順はセナ→星来→あやせ→優愛→美愛→七海→梢→ビシィ
どのキャラを選択しても基本的にシナリオ展開はひとつしかありません。
すなわち、Chu☆Chu
家庭用かつCERO Cの15歳以上対象なので直接的な描写はありませんが、色々とマニアックなエロ描写があったりします。
実に素晴らしい。
梨深は本作でその内面が明かされ、かなり点数を上げた印象。
あやせは最後の一枚絵がヤバい。
あと他のキャラは基本的に本編から続く話なのでそれまでの積み立てがあるのですが、美愛だけは、いくら優愛を受け継いでいるとはいえかなり別人なので唐突感がありました。
キャラ的には好きなだけに惜しい。
七海は越えられない壁。
総評
システムはスキップ含めて問題なし。
シナリオは本編に比べてかなり短めだが、そのぶん濃いChu☆Chuが楽しめる。
前作カオスヘッドノアをプレイし、少しでも何か心に残るものがあったのであれば、迷わずプレイしましょう。
七海がかわいすぎて生きているのが辛くなります。
限定版はデカいですが、中身はビシィさんタオルなのでまあいらな………梨深ちゃんはかわいいよね、タオルは一生の記念品になるから限定版を買おうね、たはは……。
過去のゲームレビュー
データベースハンドラを作成します。
class DatabaseOpenHelper extends SQLiteOpenHelper{}
この一行を書いてエラー部分をクリックするだけで下のように最低限の形ができあがります。
Eclipse便利すぎだろ。
/src/com.example.bizcart/db/DatabaseOpenHelper.java
package com.example.bizcard.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
class DatabaseOpenHelper extends SQLiteOpenHelper{
public DatabaseOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqlitedatabase) {}
@Override
public void onUpgrade(SQLiteDatabase sqlitedatabase, int i, int j) {}
}
ということで各メソッドを実装。
//BizCardのデータベースハンドラ
class DatabaseOpenHelper extends SQLiteOpenHelper{
//データベース名
private static final String DB_NAME = "BIZ_CARD";
//サンプルデータ
private String[][] datas = new String[][]{
{"光度 人", "××商事", "開発部", "部長","141-0031", "品川区西五反田2-19-3", "090-1111-1111", "03-1111-1111", "code@shoji.co.jp"},
{"高度 仁", "○○コミュニケーションズ", "開発部", "課長","141-0032", "品川区大崎1-2-1", "090-2222-2222", "03-2222-2222", "code@comunications.co.jp"},
{"光度 陣", "×○システムズ", "開発部", null,"153-0043", "目黒区東山1-2-1", "090-3333-3333", "03-3333-3333", "code@systems.co.jp"},
{"荒土 尋", "○×工務店", "開発部", null,"160-0014", "新宿区内藤町11-4", "090-4444-4444", "03-4444-4444", "code@koumuten.co.jp"}
};
//コンストラクタ
public DatabaseOpenHelper(Context context) {
super(context, DB_NAME, null, 1);
}
//データベースが存在しなかった場合、データベース作成後に実行される
@Override
public void onCreate(SQLiteDatabase sqlitedatabase) {
//トランザクション
sqlitedatabase.beginTransaction();
try{
// テーブルの生成
StringBuilder createSql = new StringBuilder();
createSql.append("create table " + BizCard.TABLE_NAME + " (");
createSql.append(BizCard.COLUMN_ID + " integer primary key autoincrement not null,");
createSql.append(BizCard.COLUMN_PERSON_NAME + " text not null,");
createSql.append(BizCard.COLUMN_COMPANY_NAME + " text,");
createSql.append(BizCard.COLUMN_ORGANIZATION_NAME + " text,");
createSql.append(BizCard.COLUMN_POSITION_NAME + " text,");
createSql.append(BizCard.COLUMN_ZIP_CODE + " text,");
createSql.append(BizCard.COLUMN_ADDRESS + " text,");
createSql.append(BizCard.COLUMN_TEL1 + " text,");
createSql.append(BizCard.COLUMN_TEL2 + " text,");
createSql.append(BizCard.COLUMN_MAIL + " text");
createSql.append(")");
sqlitedatabase.execSQL( createSql.toString());
// サンプルデータの投入
for( String[] data: datas){
ContentValues values = new ContentValues();
values.put(BizCard.COLUMN_PERSON_NAME, data[ 0]);
values.put(BizCard.COLUMN_COMPANY_NAME, data[ 1]);
values.put(BizCard.COLUMN_ORGANIZATION_NAME, data[ 2]);
values.put(BizCard.COLUMN_POSITION_NAME, data[ 3]);
values.put(BizCard.COLUMN_ZIP_CODE, data[ 4]);
values.put(BizCard.COLUMN_ADDRESS, data[ 5]);
values.put(BizCard.COLUMN_TEL1, data[ 6]);
values.put(BizCard.COLUMN_TEL2, data[ 7]);
values.put(BizCard.COLUMN_MAIL, data[ 8]);
sqlitedatabase.insert(BizCard.TABLE_NAME, null, values);
}
//トランザクション終了
sqlitedatabase.setTransactionSuccessful();
} finally {
//失敗
sqlitedatabase.endTransaction();
}
}
/*
* SQLiteOpenHelperのコンストラクタ第四引数versionがバージョンアップした場合に実行される
*/
@Override
public void onUpgrade(SQLiteDatabase sqlitedatabase, int i, int j) {}
}
初回起動時など、データベースが見つからなかった場合はonCreate()が呼ばれます。
Webアプリと違ってテーブルを予め用意しておくという運用ができないので、onCreate()ではテーブル作成等を行う必要があります。
今回はテーブルひとつだからまあいいんだが100個テーブルがあったら全部書くのかこれ?
その後現在のデータベース状態確認方法が載っていますが、まだ実行していないのでデータベースがありません。
とりあえずスルー。
Androidの記事
※ジョークです。実際のゲームにこのような表現はありません。
なにー!騙された!
がんばれ!消えるな!!色素薄子さん 1 水月 とーこ
☆☆☆☆
色素どころか色とか影とか気配とか存在感とかあらゆるものが薄い薄子さんのほのぼの日常漫画。
職業によっては大活躍しそうな特技ですが(殺し屋とか)薄子さんはとってもいい娘なのでそんな未来はなさそうです。
ストーリーとかは全然たいしたことないというか心底どうでもいい話ばっかりなのですが、薄子さんが可愛くて癒されるので万事OK。
荒川アンダーザブリッジ1 中村 光
☆☆☆
勝ち組の超エリートがひょんなことから荒川河川敷での生活を余儀なくされる話。
登場人物がヒロイン含め何れも超級の電波ばっかりですが、あまり不快感が無く読めるのはなんででしょうかね。
しかし恋をさせれとか言いつつ全然恋が進展しないというのはどういうわけだ。
あと金持ちが免疫がないとかそういうわけがないだろうと思うのは偏見ですかね。
笑わない科学者と時詠みの魔法使い 内堀 優一
☆☆
科学と魔法の融合、一つ屋根の下という美味しい素材を用いて、
どうしてここまで糞不味い料理が作れるんだ?
読み終わった後に「もったいない」と感じる本は数あれど、30ページ目で「もったいない」と感じる本なんてそうそうあるものではないぞ。
この言い回しははっきり言って嫌いなんだが、今回だけは使わせてもらう。
人間が描けてない。
距離感が出鱈目にも程がある。
作者を変えて書き直してほしい素材です。
メモリーズオフ ゆびきりの記憶(初回限定版)
ストライクウィッチーズ白銀の翼(限定版)
どうしてこう購入するゲームが偏って発売されるんでしょうかね。
幸いこれでしばらくはパッケージを購入する予定がなくなったのが幸いですが。
まあパッケージが無くともXBLAやインディーズに隠れ作品が転がってたりするわけですが。
ちょっとだけプレイしてみたストパンの感想。
見た目は3Dになったオメガファイブ、ゲーム性はボムをメインで進めていく比較的大味なかんじです。
キャラゲーと言えばキャラゲーなのですが、想像していたよりはまともな出来で少々驚いた。
まあデスマスプガル大往生RFA虫ふたケツイオトメ社長と名作良作STG目白押しな360の中にあっては、それらと肩を並べられるほどの出来とは言い切れませんが、そこは原作愛でカバーですよ。
原作は一度も見たことありませんが。
しかし出撃シーンの足を見るたびになんか畸け(ryとか心に思い浮かべてしまうんだよな。
なんであんなデザインなんだ。