Nanashi-soft

Nanashi-softの活動状況とか雑談です。 Unity3Dでゲーム作っています。

タグ:カップメンクイ

なぜか,ほとんど一発で審査が通ってしまったので(審査落ちしましたネタにするつもりだったw)
カップメンクイのiOS版が配布されました

Appストアで『カップメンクイ』や『かっぷめんくい』で検索すると出てきます

↓直リンクはココです。
iOS 9.0以降の iPhone,iPad,iPod Touchで動きます


ここは開発ブログなので,カメラアプリの審査時の注意点を書いておきます

○カメラ使用許諾のダイアログに,正しい理由が書かれていなければいけない
具体的に言うと,Unity設定の話です

Unityのメニュー→Edit→Project Settings→Playerを開いて
Camera Usage Descriptionのところにカメラを使う理由をきちんと書く
ちなみに,日本語のみでも通りました。何と書いたかは各自カップメンクイをダウンロードして確認して下さい('-'*)

○カメラで使用する画像が必要
読み込ませるバーコード画像を用意する必要がありました
アメリカに日本のカップ麺は無いだろうしw
審査提出時に,添付しておく欄があります(ログイン情報などを書く下にね)

このエントリーをはてなブックマークに追加

色々と使い勝手の悪い所を修正しました

バーコードやタイマーを入力する時に,数値モードにいちいち切り替えるのが面倒臭かったのですが
インプットボックスの Inspector→Input Field (Script)→Content Typeを Decimal Numberにすれば数値入力パッド表示になりました

バーコード読み込みを起動させると,キャンセル事ができない問題の対処をしました
全体にパネルをかぶせて,そこを2回タッチするとキャンセルされます
1回だけだと,ボタン押した時にうっかりもう1回触れていて,バーコードリーダー起動しねぇ! 状態に自分が鳴ったので,2回にしましたw

あと 50ぐらいのカップ麺データを追加しました


Playストアで『カップメンクイ』や『カップめん』とかで検索すると出てきます

↓直リンクはココです。PCでもページ自体は見れます(PC版は作っていないので)

このエントリーをはてなブックマークに追加

メモ取りながら作っていたけど,結局作らなかった部分もあるので,そのままではおかしい所もあるかも知れません(ぉ

●PHPを書く
データ入力フォームと,アプリからデータ取得機能
をシンプルに作ります(サーバーがショボいので検索とか重い処理は無し)

PHP部分も全部晒していくよ('-'*)

○データ入力フォーム
普通にフォームを作る
大体定型文が決まっているので(お湯を注ぐとか),文字部分はリストボックスで予め入れて置く(文字化け起こす端末や回線があるから)

<?php
//◆カップメンクイ:データ入力PHP

require_once dirname(__FILE__) . "/db.php";

//●送信値の取得
$mode=getSend("mode");
$barcode=getSend("barcode", "int");
$hinmei=getSend("hinmei");

//●データ定義
$data1=array(
0 => "フタを半分まであける",
1 => "外装をあけて、フタの両側のつめを上げる",
2 => "フタをあける"
);
$select1=makeSelect($data1);
$input1=$data1[getSend("send1", "int")];

$data2=array(
0 => "取り出すもの無し",
1 => "1つとりだす",
2 => "2つとりだす",
3 => "3つとりだす",
4 => "4つとりだす",
5 => "5つとりだす"
);
$select2=makeSelect($data2);
$data2[0]="";
$input2=$data2[getSend("send2", "int")];

$data3=array(
0 => "先に入れるもの無し",
1 => "かやく",
2 => "粉末スープ",
3 => "めん",
4 => "乾燥具材",
5 => "特製スープ",
6 => "焼豚"
);
$select3a=makeSelect($data3);
$data3[0]="";
$select3b=makeSelect($data3);
$select3c=makeSelect($data3);
$input3a=$data3[getSend("send3a", "int")];
$input3n=$data3[getSend("send3b", "int")];
$input3c=$data3[getSend("send3c", "int")];

$data4=array(
0 => "お湯を注ぐ",
1 => "かやくの上から熱湯を注ぐ",
2 => "お湯を注いでフタをし、液体スープをフタの上で温める",
3 => "お湯を注いでフタをし、特製スープとレトルトの具をフタの上で温める",
);
$select4=makeSelect($data4);
$input4=$data4[getSend("send4", "int")];

$data5=array(
0 => "すぐ食べる",
1 => "1分待つ",
2 => "2分待つ",
3 => "3分待つ",
4 => "4分待つ",
5 => "5分待つ",
);
$select5=makeSelect($data5);
$input5=$data5[getSend("send5", "int")];

$data6=array(
0 => "フタを完全にあける",
1 => "フタをあける",
2 => "湯切り口からお湯を捨てる"
);
$select6=makeSelect($data6);
$input6=$data6[getSend("send6", "int")];

$data7=array(
0 => "後入れ無し",
1 => "特製スープ",
2 => "液体スープ",
3 => "乾燥具材",
4 => "レトルトの具"
);
$select7a=makeSelect($data7);
$data7[0]="";
$select7b=makeSelect($data7);
$select7c=makeSelect($data7);
$input7a=$data7[getSend("send7a", "int")];
$input7b=$data7[getSend("send7b", "int")];
$input7c=$data7[getSend("send7c", "int")];

$data8=array(
0 => "",
1 => "かきまぜる",
2 => "よくかきまぜる"
);
$select8=makeSelect($data8);
$input8=$data8[getSend("send8", "int")];

$data9=array(
0 => "後乗せなし",
1 => "ふりかけ",
2 => "スパイス",
3 => "焼きのり",
4 => "紅しょうが"
);
$select9a=makeSelect($data9);
$data9[0]="";
$select9b=makeSelect($data9);
$input9a=$data9[getSend("send9a", "int")];
$input9b=$data9[getSend("send9b", "int")];

//・データからselect文を作る関数
function makeSelect($vars)
{
$ret="";

foreach($vars as $key => $val){
$ret .= "<option value='$key'>$val</option>";
}

return $ret;
}

//・入力されたデータを取得する関数
//引数に"int"を指定すると数値のみとみなす
function getSend($var, $flag=null)
{
//データ取得
if(isset($_POST[$var])){
$ret=$_POST[$var];
}else{
$ret=$_GET[$var];
}

$ret=trim($ret); //前後の空白はたぶんゴミなので消す

if($flag == "int"){
//数値以外は消す
$ret=preg_replace('/[^0-9]/', '', $ret);
}

//SQL文中で用いる文字列の特殊文字をエスケープする
$ret=mysql_real_escape_string($ret);

return $ret;
}

//●モード判別
if($mode == "input"){
//データをDBにインプットする
inputData();
}else{
//データ入力ページを表示
viewInputPage($barcode);
}
exit(); //PHP終了


//●データ入力ページ表示
function viewInputPage($barcode)
{
$myphp=basename(__FILE__);
echo "<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>カップメンクイ:データ入力</title>
</head>
<body>
<h3>カップメンクイ:データ入力</h3>
<span style='line-height:200%;'>
<form action='$myphp' method='post'>
バーコード:<br>
<input type='number' name='barcode' min='10000000' max='9999999999999'><br>
商品名:<br>
<input type='text' name='hinmei'><br>
作り方:<br>
<select name='send1'>{$GLOBALS['select1']}</select><br>
<select name='send2'>{$GLOBALS['select2']}</select><br>
<select name='send3a'>{$GLOBALS['select3a']}</select>
<select name='send3b'>{$GLOBALS['select3b']}</select>
<select name='send3c'>{$GLOBALS['select3c']}</select><br>
<select name='send4'>{$GLOBALS['select4']}</select><br>
<select name='send5'>{$GLOBALS['select5']}</select><br>
<select name='send6'>{$GLOBALS['select6']}</select><br>
<select name='send7a'>{$GLOBALS['select7a']}</select>
<select name='send7b'>{$GLOBALS['select7b']}</select>
<select name='send7c'>{$GLOBALS['select7c']}</select><br>
<select name='send8'>{$GLOBALS['select8']}</select><br>
<select name='send9a'>{$GLOBALS['select9a']}</select>
<select name='send9b'>{$GLOBALS['select9b']}</select><br>
<br>
<input type='hidden' name='mode' value='input'>
<input type='submit' value='送信'> <input type='reset' value='リセット'>
</form>
</span>
</body>
</html>";
}

//●データをDBにインプットする
function inputData()
{
//入力されたデータを取得してまとめる
$kugiri="|"; //これがデータの区切り文字

$data=$GLOBALS["hinmei"];

$data .= $kugiri . $GLOBALS["input1"];
$data .= $kugiri . $GLOBALS["input2"];
$data .= $kugiri . $GLOBALS["input3a"];
if($GLOBALS["input3b"] != ""){
$data .= "、" . $GLOBALS["input3b"];
}
if($GLOBALS["input3c"] != ""){
$data .= "、" . $GLOBALS["input3c"];
}
$data .= $kugiri . $GLOBALS["input4"];
$data .= $kugiri . $GLOBALS["input5"];
$data .= $kugiri . $GLOBALS["input6"];
$data .= $kugiri . $GLOBALS["input7a"];
if($GLOBALS["input7b"] != ""){
$data .= "、" . $GLOBALS["input7b"];
}
if($GLOBALS["input7c"] != ""){
$data .= "、" . $GLOBALS["input7c"];
}
$data .= $kugiri . $GLOBALS["input8"];
$data .= $kugiri . $GLOBALS["input9a"];
if($GLOBALS["input9b"] != ""){
$data .= "、" . $GLOBALS["input9b"];
}

// echo $data;
// echo $GLOBAL["barcode"];
dbUpdate($GLOBALS["barcode"], $data);

$myphp=basename(__FILE__);
echo "<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>カップメンクイ:データ入力</title>
</head>
<body>
<h3>カップメンクイ:データ入力</h3>
データ保存完了!
<br>
<a href='$myphp'>戻る~</a>
</body>
</html>";

}
?>

mysql_connectは PHP7から使えなくなっているらしいので,そういう環境の人は各自 PDOとかに置き換えること

どうせゴミプロなので,全部列挙して上から下に読めばいい実装にした。クソコードと言われるかも知れないけどw
ちゃんとしたヤツ作るなら,アプリ上でやった方がいいし

データ定義の種類は適当です
実際はもっとたくさんの種類があるので,凄い量になっています

このエントリーをはてなブックマークに追加

まだまだ記事は続きますが,アプリ自体は完成したので配布を開始しました

Playストアで『カップメンクイ』や『カップめん』とかで検索すると出てきます

↓直リンクはココです。PCでもページ自体は見れます(PC版は作っていないので)

Android4.1以降の端末全てが対応です
もしカメラが無くても,バーコードを手打ちすれば使えます

まだデータ入力機能とかは無いので,内蔵データに無いカップ麺の場合は,タイマーだけ使ってやってください('-'*)

playストア用スクショ画像

このエントリーをはてなブックマークに追加

この部分は不要だろう。と思うが,まぁ読み物として,こんな手順で作ってみましたみたいな('-'*)
せっかくなので,PHPとかもそのまま書いとこう(完全に自分メモ

●データ設計
カップ麺を作るのにどういう情報が必要か? というところから
本来はやるのですが,既にカップメンクイの iアプリ版データがあるので,これを流用します

バーコード,商品名,内容数,調理時間などの必要情報をデータ化してものです

たぶん,みんなが想像しているよりも膨大な数があります
こんなにカップ麺あるのかよ。みたいな('-'*)

●DBテーブルの設計
共用サーバー上に Wordpressで使っていた DBがあったので,そこにつっこみます
ちなみに MySQLです

DBはこんな感じでいいかな
create table cupmenkui_master(
  barcode bigint not null primary key,
  lastcnt int nou null,
  data text not null default '',
);

バーコードをキーにして,作り方データを全部くっつけて保存する(ぉ
サーバー上で検索とかしないからこれでいい。やるならスマフォ上で

lastcntっていうのは,更新カウンターで,insertやupdateをする度にカウントアップしてセットする項目
スマフォ上のデータの最終カウント値を保管して置いて,それよりも大きいデータを取得して更新する

……で,それをする為にはシーケンステーブルが必要なのだが,MySQLでいい方法は無いかと探したところ
last_insert_idとやらを使えば良さそう

テーブルを用意して,
create table cupmenkui_sequence(
  lastcnt int not null
);
最初のレコードをinsertして,
insert into cupmenkui_sequence values(0);
シーケンス値をカウントアップして,
update cupmenkui_sequence set lastcnt=last_insert_id(lastcnt + 1);
で,selectすると,カウントアップした後の値が返って来ると
select last_insert_id();
この値を使って,マスターテーブルを更新する


これで DB設計は終わり
単純に,サーバー上でデータを共有したいだけの超シンプル仕様('-'*)

このエントリーをはてなブックマークに追加

↑このページのトップヘ