2014年11月30日日曜日

mBluetoothAdapter.isEnabled()がうまく動かない

はまった。

Androidアプリに、Bluetoothの機能を持たせたいとき。
公式のサンプルであるBluetoothChatでは、
今Bluetoothの機能がOFFになっていたら、ONにするため、
onStartの中で、mBluetoothAdapter.isEnabled()を呼び出して確認しています。
で、OFFになってたら、startActivityForResultを使って端末の設定画面に飛んで、ユーザに手動で
BluetoothをONにしてもらってます。

    @Override
    public void onStart() {
        super.onStart();
        if(D) Log.e(TAG, "++ ON START ++");

        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        } else {
            if (mChatService == null) setupChat();
        }
    }

こう。

その次のonResumeで、接続の初期化をしてます。

    @Override
    public synchronized void onResume() {
        super.onResume();
        if(D) Log.e(TAG, "+ ON RESUME +");

        if (mChatService != null) {
            if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
              mChatService.start();
            }
        }
    }

こう。

で、このプログラムだと、最初にBluetoothの機能がOFFのときのプログラムの流れは、

プログラム開始

onCreate()

onStart()

onResume()

onPause()

設定画面へジャンプ

onResume()

というかんじで、onResume()を二回通っているのです。
だから、一回目のonResume()では、まだBluetooth機能がONになってないから、通信の初期化処理を防ぐ機構が必要なのです。
サンプルプログラムでは、mChatServiceがnullかどうか、というのがBluetooth機能のON/OFF状態を示すフラグの代わりになってます。


であるので、mChatServiceをなくしちゃおうと画策する俺のような人は、Bluetooth機能のON/OFFフラグをちゃんと作らないといけないのです。



たぶん。






2014年7月17日木曜日

Bluetooth TextViewに書き込めない件 thread exiting with uncaught exception

Bluetooth通信のテストをしてるときに、現在の状態をTextViewに出したくなった。
(LogCatは慣れなくて嫌い・・・なんて言ってられないんだろうけど。)

で、ClientThreadとかServerThreadとかAcceptThreadとかなんかそういう感じの名前のThreadが
皆さんのコードの中にもあると思うけど、そこからtextviewを編集しようとすると
thread exiting with uncaught exception

とかいってエラーになってる。


なんだよクソッ!とおもって色々調べてみると、ThreadからUIの編集が出来ないんだって。
詳しくは知らない。

だから、新しいHandlerを作ってその中でtextviewを書き換えればいいらしい。

ということをきっかけにして各位ググるといいんじゃないでしょうか。

2014年5月28日水曜日

Bluetoothで通信を行う

Bluetoothで通信を行うって記事を参考にbluetooth通信を行うアプリを作ろうと思ってるんだけど、
さっきからぜんぜんエラーが消えなくて何かと思ってた

元記事Bluetoothで通信を行う(2)

ACTION_DISCOVERY_STARTED
ACTION_DISCOVERY_FINISHED

の2つは、頭にBluetoothAdapter.  ってつける必要があって、

ACTION_FOUND
ACTION_NAME_CHANGED

の2つは、頭にBluetoothDevice.   ってつける必要があった。


だから、その部分のコードは、
private final BroadcastReceiver DevieFoundReceiver = new BroadcastReceiver(){
   //検出されたデバイスからのブロードキャストを受ける
   @Override
   public void onReceive(Context context, Intent intent){
       String action = intent.getAction();
       String dName = null;
       BluetoothDevice foundDevice;
       ListView nonpairedList = (ListView)findViewById(R.id.listview);
       if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
        Log.d("ACTION_DISCOVERY_STARTED","スキャン開始");
       }
       if(BluetoothDevice.ACTION_FOUND.equals(action)){
           //デバイスが検出された
           foundDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
           if((dName = foundDevice.getName()) != null){
               if(foundDevice.getBondState() != BluetoothDevice.BOND_BONDED){
                   //接続したことのないデバイスのみアダプタに詰める
                connectableDeviceAdapter.add(dName + "\n" + foundDevice.getAddress());
                   Log.d("ACTION_FOUND", dName);
               }
           }
           nonpairedList.setAdapter(connectableDeviceAdapter);
       }
       if(BluetoothDevice.ACTION_NAME_CHANGED.equals(action)){
           //名前が検出された
           Log.d("ACTION_NAME_CHANGED", dName);
           foundDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
           if(foundDevice.getBondState() != BluetoothDevice.BOND_BONDED){
               //接続したことのないデバイスのみアダプタに詰める
               connectableDeviceAdapter.add(dName + "\n" + foundDevice.getAddress());
           }
           nonpairedList.setAdapter(connectableDeviceAdapter);
       }

       if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
           Log.d("ACTION_DISCOVERY?FINISHED","スキャン終了");
       }
   }

};

ってなる。

本来はならないのかな?
よくわかりません。

分かる人教えてください。
おわり

2014年2月1日土曜日

くりっくしたらでっかくなる

カメラのprojectionをperspectiveにしていると、ゲームオブジェクトの描画に奥行きが出来る。
その状態で、オブジェクトの位置を変更することで、クリック中にオブジェクトを大きく表示させたかった。


純粋にz座標の位置を変化させると、マウスと位置がずれる。
this.transform.Translate(Vector3.back * 0.5f);

カメラとオブジェクトを結ぶ直線上でキャラクターを動かすと、描画がちゃんとする
this.transform.Translate((game_camera.transform.position - this.transform.position).normalized * 0.5f);

2014年1月5日日曜日

unityをまたいじっている

試作追いかけシステム

馬車を剣士が追いかける。

ドラッグドロップで場所移動



このなんか良く分からんスクリプト間の値のやり取りのやり方をうまい事理解できると結構簡単。

using UnityEngine;
using System.Collections;

public class follow : MonoBehaviour {
private GameObject leader;
private float follow_speed;

// Use this for initialization
void Start () {
this.leader = GameObject.FindGameObjectWithTag("leader");
follow_speed = (float)this.GetComponent<parsonal_parameter>().walk_speed;
}

// Update is called once per frame
void Update () {

Vector3 velo = this.leader.transform.position - this.transform.position;

if(Vector3.Distance(this.leader.transform.position,this.transform.position) > 1.0f){
this.rigidbody.velocity = velo.normalized * follow_speed;
}else{
this.rigidbody.velocity = Vector3.zero;
}
//this.rigidbody.velocity = velo.normalized * 2.0f;

}
}

追いかけるところ。
this.leader = GameObject.FindGameObjectWithTag("leader");
ここと
follow_speed = (float)this.GetComponent<parsonal_parameter>().walk_speed;
ここがめんどっちい。
なんか特殊な関数使ってゲーム内のオブジェクトを区別して値を呼び出してるっていうイメージ。



using UnityEngine;
using System.Collections;

public class parsonal_parameter : MonoBehaviour {

public double walk_speed;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
}

キャラの持ってる数値。
まだ速度だけ。

2013年12月7日土曜日

MMO風ゲーム内ウィンドウについてのお話

頑張ろう頑張ろうと思いつついたけどついに続行を諦めつつあるゲーム(今を生きる(仮))ですが、このままHDDの肥やしにするのも、またPCがクラッシュしてデータが飛んでしまって二度と回収できなくなるのももったいないので、個人的に頑張ったと思う点について書こうと思います。

あと、就活に使えたらいいなあとも思います。


さて、今を生きる。ですが、元々はあの最古参MMORPGであるultimaonlineをベースにして作っておりました。


これが最新版のゲーム画面になるわけですが、

どのへんをまねしていたのか、と言うと、上の画像のあたりだと思います(ほかにもあるかも)
ゲームコンテストに出しちゃったけど、ひょっとしたらこれ、パクリだからどうにもならなかったのかもしれませんね・・・
個人的にはultimaonlineとは違う点もある!と思ってるんですけども。


という紹介を済ませて、

じゃあ、一回目ですが。
タイトルにあります通り、ウィンドウシステムについてのお話をすることにします。



2012年8月9日のウィンドウを消せるようになった!!

にて確認できますが、ウィンドウを作るのが一番最初に作った難しい部分でした。


このゲームは、高専で培った技術の集大成を作ろうと思って作り出したゲームでして、
今までの俺の技術があれば出来る!とおもって、特になんかゲームの作り方とか読まなかったので、
熟練のMMORPG作成者の方とかが見たら、ちゃちい作りすぎて鼻で笑われてしまうかもしれませんが、まあ、頑張ったところ、書こうと思います。


ウィンドウですが、これは線形リストを用いて実装しました。

こんなかんじ。


基本的な機能は次の2つです。
 ・ 描画される。
 ・ ドラッグ→ドロップできる。


まず、ウィンドウの描画について。
リストの下から行うことで、上のウィンドウほど他のウィンドウに重ならないようになってます。

このゲーム画面をさっきのウィンドウフローに直すと、
こんなん。
生産ウィンドウ→装備ウィンドウ→アイテムウィンドウ
の順に描画されてます。


次に、ウィンドウのクリック処理について。
リストの上から行うことで、見た目と処理を合わせてます。
先ほどのゲーム画面中のウィンドウを大よその領域に分けると、このような四角形になるわけですが、

青い四角、緑の四角、赤い四角が重なっている部分をクリックすると、
ウィンドウリストとしては、

こうなってるので、上からクリック検知して、
アイテムウィンドウをドラッグすることになるわけです。



で、ドラッグするときにまたちょっと工夫したという訳なんですが、
ねむいので、またいつか。

























2013年11月10日日曜日

unityめも

sendmessageでそのgameObjectの関数を呼び出す。

magnitudeでベクトルの大きさを受け取る

2013年10月28日月曜日

飛行機じゃなくて雷撃機になった。

ちゃんと魚雷発射する。

でも、wiki参考にしていろいろ作ったら、ゲームとしてはつまらなくなったな・・・

敵雷撃隊ヨリ自艦ヲ防衛セヨ

ゲームとしては、こんぐらいのほうが楽しいように思う。

敵雷撃隊ヨリ自艦ヲ防衛セヨ(はちゃめちゃ)

敵国航空隊ヨリ自艦ヲ防衛セヨ

機銃ゲー

なんか敵飛行機が遅い。数値はあってるはずなのに。なぜだ。

これに爆弾とか魚雷とかも追加しようと思います。

敵国航空隊ヨリ自艦ヲ防衛セヨ

ていうか結局一日仕事になってしまった。風邪ひいてるのに。

2013年10月24日木曜日

ぱわーあっぷした

といっても、本の通りに作っただけだけど。

かたむきパワーアップ版






簡単に商品リンク貼れた。
これで億万長者になれるかもしれんな・・・

2013年10月22日火曜日

unity

できたぞー

かたむき

webゲームってすごいなあ ダウンロードしなくて良いのだもの

2013年9月5日木曜日

2013年8月1日木曜日

新しく

買い物する時に使おうと思っている天秤の試し図

くるくる回ってます。


2013年6月14日金曜日

唐突ですが

素晴らしいアイデアをご提供頂いたので、それにのっとってゲーム作ってみることにしました

月曜日最新版

2013年6月10日月曜日

乗っかった

こないだえありー君のジャズ音楽を聴いて、酒場を作ろうと思ってました。


酒場を作るために必要なもろもろを考えたのですが、料理や酒を配膳するために、自由に机の上にアイテムを置きたいと思いました。
故に、アイテムを床置きし、かつ、アイテムに高さを持たせなくてはならなくなりました。

ということで、持たせました。



じゃん!

自分のキャラクター(真ん中の金髪)が、半マス分上に描画されてることを
分かっていただけたら幸いです。


アイテムとしてのx座標、y座標が、
鞄ウィンドウの左上からどのくらい離れているか という事を表していて、

キャラクターとしてのx座標、y座標が、
マップ全体から見てどこの座標にいるか、という事を表していて、

二つをつなげるのが面倒くさかったのですが

つなげました!



つかれました!
おわり