2015年11月10日火曜日

間取りー図をアップデートしました グリッドとパーツの追加

間取りー図をアップデートしました

主な変更点は以下の通り

・グリッドの追加(5cm,45cm,2inch,1.5feet)
・廊下,玄関フロアの追加
・簡易なSVGファイルへの出力の追加(Pro版のみ)
・編集操作の改良
  
以上です
以前からユーザーからの要望で上がっていた5cm、45cm単位のグリッド設定を追加しました
あとパーツ(廊下、玄関フロア)の追加、ほかにもまだ追加したいものはあるのですがとりあえずこれ
それとPro版だけですがSVGファイルへの簡易出力(床と壁とドアと窓)の追加 あとは点編集時の操作感を少し改良しました

2015年9月16日水曜日

お客様のアプリはポリシー違反の可能性があると判断されました

すでに解決済みではありますが、先日デベコンに

 

という表示が・・・
どうやらこの3つのアプリが引っかかってるようです

2年以上も放置されていたゾンビアプリなもんで、どうやら広告表示に使っていた古いライブラリが引っかかっていたようです
もうゾンビアプリだし消してもいいかと思うが、一応ユーザーが残っているということなんでライブラリを外して更新を行ったところ、警告はすぐ消えました

2015年8月27日木曜日

EasyPuttingがアンドロイダー公認になりましたー

拙作EasyPuttingがアンドロイダー公認アプリになりました。
そしてその勢いのまま、デイリーランキングで7位に!

やった!

2015年7月27日月曜日

新作アプリEasyPuttingをリリースしましたー

ついに新作アプリEasyPuttingをリリースしました
EasyPuttingはその名の通りシンプルで手軽に遊べるカジュアルスポーツゲームです
またプレイデータの統計分析機能がやたらと無駄に充実しております
是非とも、たくさんプレイしてみてください


2015年7月1日水曜日

パッティングゲームの製作(1万件超データの格納方法)

さて、前回は傾斜面を転がるボールが曲がるアルゴリズムを作成しましたが、その中でボール位置の傾斜角度を利用して計算してます
そのためグリーンの傾斜角データを用意してやらねばなりません
とりあえずグリーンの大きさは横10m×縦6mとして、まずは高度を濃度で表現した画像を作成しました

これを縦横共に100分割した各点の高度を求めて、隣接点の高度からXY方向の傾斜角を取得します

こうして取得したXY方向の各点の傾斜角が100×60×2で12000個になりました
この12000個のデータをリアルタイムで利用しなければならんのですが、とりあえずCSVファイルにしてアプリ起動時に読込んでみましたが、読込みが遅い・・・4~5秒ほどかかってしまいます
データベースに入れるのもなんだし、どうしたもんかなぁ悩んでみて、もういっそのこともうベタで書いてみるかとスタティック変数にぶち込んでみました
ひどいですね、良い子はマネしてはいけません
しかしこれは劇的に早くなり、かなりよさそうなんで、もうこれでいっちゃいます

2015年6月16日火曜日

パッティングゲームの製作(斜面でボールが曲がるアルゴリズム)

前回グリーンを転がるボールが止まるアルゴリズムのやったんで、今度は地面の傾斜でボールが曲がるアルゴリズムを作ってみたいと思います
なぜボールが曲がるかっていうと、重力が働いているからですね
図にするとこんな感じ

傾斜角θの時、x方向にg・sinθの力が加わり、ボールが曲がります
これをソースに起こしてみましょう

public class Ball {
    final public static int G = 9800;    //重力加速度(mm/ss)
    final public static float u = 0.075f; //摩擦係数
    public Plot position = new Plot();   //位置
    public int speed; //並進速度(mm/s)
    public double angle; //進行方向(Radian)

    //移動処理(interval:経過時間(ms))
    public void move(long interval) {
        //摩擦による減速処理
        speed -= (u * G * interval) / 1000;
        //速度をXY成分に分割
        int xSpeed = (int)(speed * Math.cos(angle));
        int ySpeed = (int)(speed * Math.sin(angle));
        double xa = getXTilt(prev.x, prev.y); //X方向の傾斜角取得
        double ya = getYTilt(prev.x, prev.y); //Y方向の傾斜角取得
        xSpeed -= (G * Math.sin(xa) * interval) / 1000; //X方向に働く重力による加速
        ySpeed -= (G * Math.sin(ya) * interval) / 1000; //Y方向に働く重力による加速
        angle = getAngle(0f, 0f, xSpeed, ySpeed); //重力により曲がった進行方向を取得
        //XYの速度から位置を更新
        position.x += (xSpeed * interval) / 1000;
        position.y += (ySpeed * interval) / 1000;
    }
}
こんな感じでボールが転がる処理は完成

2015年6月10日水曜日

新作アプリ、パッティングゲームの製作(転がるボールのアルゴリズム)

以前の新作アプリのことを記事で書きましたが、もうだいぶ出来てきました
ベース部分はほぼEasy Basketballなのでかなり楽が出来ましたが、グリーン上を転がるボールのアルゴリズムを一から作る必要がありました
せっかくなので製作過程を書いていきます

まずは任意の初速で放たれたボールがグリーン上を転がり止まるという基本的な動きを考えます
なぜボールが止まるかというと当然地面から受ける摩擦で止まるので、摩擦係数がわかれば転がるボールのアルゴリズムが組み立てられると考えられます

調べてみるとグリーンの速さを測る道具にスティンプメータという滑り台のような道具があるようで、これでボールを射出すると初速1.83m/sで放たれどのくらい転がるかでグリーンの早さを測ることが出来ます
これで測った時の典型的な速さのグリーンの転がる距離が2.286mということなので、これを水平面上を摩擦を受けて並進する物体ということで、運動量保存の法則に入れてみます



m:ボールの重さ
v:初速(m/s)
μ:摩擦係数
g:重力加速度(m/s2)
d:移動距離(m)

ここから摩擦係数μ= 0.075が求められますね

ところが、よく調べてみるとこの計算は大間違いのようで
参考:蜂の子:グリーンの転がり摩擦係数μ
正しくは回転エネルギーを用いて計算せねばならず正しい摩擦係数(転がり摩擦係数)はμ= 0.02989715571ということです
しかしこれを使うとなると移動の計算に角速度を用いねばならず、ちょっとめんどくさいゲーム上では並進速度と摩擦係数μ= 0.075を用いた計算で特に支障はないのでこちらを使うことにします

public class Ball {
    final public static int G = 9800;    //重力加速度(mm/ss)
    final public static float u = 0.075f; //摩擦係数
    public Plot position = new Plot();   //位置
    public int speed; //並進速度(mm/s)
    public double angle; //進行方向(Radian)

    //移動処理(interval:経過時間(ms)
    public void move(long interval) {
        //摩擦による減速処理
        speed -= (u * G * interval) / 1000;
        //速度をXY成分に分割
        int xSpeed = (int)(speed * Math.cos(angle));
        int ySpeed = (int)(speed * Math.sin(angle));
        //XYの速度から位置を更新
        position.x += (xSpeed * interval) / 1000;
        position.y += (ySpeed * interval) / 1000;
    }
}

細かいことを言うとパットにはロフトがついていて打出し時にはボールは少し浮いているので、摩擦を受けない時間があったりするのですが、まあ細かいことはいいそれほどゲーム性に影響はないのでこれでよしとします