合計 昨日 今日

アバター
パコネコ
 
記事: 139
登録日時: 2010年10月16日(土) 22:49
お住まい: 大阪
日記: 日記を見る (75)
日記
- 9月 2014
【AS3】tuioを使ってみた。【osc】 (0)
   2014年9月26日(金) 20:40

+ 11月 2011
+ 10月 2011
+ 9月 2011
+ 8月 2011
+ 7月 2011
+ 6月 2011
+ 5月 2011
+ 4月 2011
+ 3月 2011
+ 2月 2011
+ 1月 2011
+ 12月 2010
+ 11月 2010
+ 10月 2010
カテゴリー
カテゴリに指定された日記はありません
フィード
次へ

【AS3】tuioを使ってみた。【osc】

パーマリンクby パコネコ on 2014年9月26日(金) 20:40

お久しぶりです。


oscで通信を行うプログラムをAS3で行わないといけなくなり・・・調べてみました。

まずはここを見てほしい。
http://asus4.hatenablog.com/entry/20101029/1288334274

調べてみたところ上のサイトに行き着いたのですが・・・
そこによればTuioっというものを使えばAS3でもoscが使えるとのことでした。

まだ使ってみてるさいちゅうですが・・・あれ?なぜ動かん・・・何のerrorだ・・・というのをちょこちょこあったので、メモ代わりに書かせていただきやす。
(勘違いはすいません)
まず・・・リンクにある場所からDLしに行ったらバージョン0.5でした・・・
探し方が悪かったのですね。
こちらのサイト(http://bubblebird.at/tuioflash/)からDLしに行ったらバージョン0.8がありました。

DLは、(https://code.google.com/p/tuio-as3/downloads/list)の tuio_as3_v_0_8.zip というものをDLすることで出来ました。
出来ましたというのも0.5では、参考にしているサイトさんで使っているいくつかのソースが入っていなかったためです。


コード[ActionScript]: 全て選択
1
2
3
4
5
6
7
8
9
10
        // ポート3333で、OSCを受信
        var connectorIn:UDPConnector = new UDPConnector("127.0.0.1", 3333, true);
        // ポート3334から、OSC送信
        var connectorOut:UDPConnector = new UDPConnector("127.0.0.1", 3334, true);
        var autoStart:Boolean = true;
       
        // マネージャー作成
        _oscManager = new OSCManager(connectorIn, connectorOut, autoStart);
        // OSCのリスナーを設定
        _oscManager.addMsgListener(this);

取り敢えずこちらのソースで最初の準備をしているようです。
tuioのソースを見てみたところ、ですがまずこれ
コード[ActionScript]: 全て選択
1
 new UDPConnector("127.0.0.1", 3333, true);

まず「"127.0.0.1"」はIPアドレスだと思います、「3333」はポート番号のようです。
次の「true」がよくわからなかったので見てみました。
コード[ActionScript]: 全て選択
1
2
3
4
5
6
7
        public function UDPConnector(host:String = "127.0.0.1", port:int = 3333, bind:Boolean = true)
        {
            this.listeners = new Array();
           
            this.connection = new OSCDatagramSocket(host, port, bind);
            this.connection.addEventListener(OSCEvent.OSC_DATA,receiveOscData);
        }

あらら、そのまま「OSCDatagramSocket」というモノを作成しているようです。
コード[ActionScript]: 全て選択
1
2
3
4
5
6
7
        public function OSCDatagramSocket(host:String = "127.0.0.1", port:int = 3333, bind:Boolean = true)
        {
            configureListeners();
            if(bind) this.bind(port, host);
            else this.connect(host, port);
            receive();
        }


引数にもろ書いてましたが「bind」を行うかどうかのフラグだったようですね。
受信と送信両方でbindするのがどうしてなのかわかりませんが、「ServerSocket」と言うものを使用していた時にServerの方で「bind」を行って、Socketの方で「connect」を行っていました。
呼び出してる説明文ではその時のものと同じものだったようなので、送信側(Socket)は「false」とします。
受信側(Server)は「true」で、使用してみました。
このへんの解釈がびみょいので反対かもですがw

このままマネージャーの作成まで読んでみます。
コード[ActionScript]: 全て選択
1
2
        // マネージャー作成
        _oscManager = new OSCManager(connectorIn, connectorOut, autoStart);


この、マネージャーさんがこのosc通信する時に送信するために必要になるようです。

このマネージャーの宣言を確認してみると
コード[ActionScript]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
        public function OSCManager(connectorIn:IOSCConnector = null, connectorOut:IOSCConnector = null, autoStart:Boolean = true) {
           
            this.msgListener = new Array();
            this.oscMethods = new Array();
           
            this._connectorIn = connectorIn;
            if(this._connectorIn != null) this._connectorIn.addListener(this);
            this._connectorOut = connectorOut;
           
            this.running = autoStart;
           
        }

となっていました。
最初のArray達はMessageを残しておくためのものでしょうか?また必要な関数で出てきたら詳しく見てみますが・・・

何より気になるのは「autoStart」さんなのでちょっとだけ動きを追ってみます。
コード[ActionScript]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        
        /**
         * If called the OSCManager will start to process incoming OSCPackets.
         */
        public function start():void {
            this.running = true;
        }
 
        /**
         * If called the OSCManager will stop to process incoming OSCPackets.
         */
        public function stop():void {
            this.running = false;
        }
        public function acceptOSCPacket(oscPacket:OSCPacket):void {
            if (running) {
                this._currentPacket = oscPacket;
                this.distributeOSCPacket(this._currentPacket);
                oscPacket = null;
            }
        }

ほぅ、この「running」は「acceptOSCPacket」のためのフラグで行うかどうかで通信を止めたりできるようですね。(通信かはまだ調べてないけどパケットって書いてるし・・・)
なんか追っかけてみたら、OSC_DATAイベントで呼び出すものみたいです。
このイベント自体は調べるのちょっと疲れたので、あれですが多分受信系のイベントでしょうか?
受信を行うかどうか?ということでしょうか。
取り敢えず、「autoStart」はその名の通り初期設定で開始するかどうかのようでした。
あぁ日本語のコメントアウトつけていきたい・・・oh



_

コメント数: 0 閲覧数: 4017

今日はスクリプトもどき

パーマリンクby パコネコ on 2011年11月06日(日) 05:54

また前に日記を書いてから1ヶ月たってしまいました。
最近はスクリプトっぽいの創ってました。
(なんかゲームシナリオっぽいやつです)

会話シーンのやつです。
今ようやく指定したスクリプトファイルをロードしてねーっていう命令が描けた所...
ここまでは以外と順調だったのですが、問題が発生しました。
そろそろ2択創ろうかなって思ったまでは良かったのですが、2択選んだ後1つ目を選んだら2つ目の命令が文章として出てくるって言う...まぁ通常の文章ロードと命令ロードを別にしてたから読み込むときにミスったんですが...(設計ミス)
明日(今日?)当たりにはその辺直したいです...せめて2択を...
ちなみに他に創った機能が

*画像のロード(アドレス指定;画像に番号付加)
*画像の描画フラグのON,OFF(ONなら描画;番号ごとに行う)
*画像の座標セット(番号ごとに行う)
*画像の移動量セット(1ループごとに移動する移動量)(番号ごとに行う);(1ループは主に1文字もしくは1命令)
*改行命令(¥nで改行するようにしてるから実は使わない...創ってから気がついた)
*削除命令(画面上の文字を消す)
*名前変更(今しゃべってる人の名前的なあれ)
*一時停止(ボタン押すまで待つ)
*一定ループ待つ(記述したループ数だけからまわし);(移動させたいときとか...)
*指定したファイルからロードしてスクリプトをやり直す(最大文字数の関係で...)
*2択から命令を呼び出す。<ー今ここ

あれ?意外と少ない?
もう少し増えたらうpするんでみていただけるとうれしいです。(まだ出せないけど...)
皆さんもゲームシナリオ?のスクリプトのプログラムは自分専用のを創っておいてますか?
それとも毎回描いてますか?もしくは使わないですか?

ちなみにすーっと消えたり現れたりは実装してなかったり...画像の出現の見え方もちゃんとしないとですね。

*注意*
私の言っているスクリプトとはプログラム上でテキストファイルを読み取って会話イベントを進めたいだけで、if分とかの命令とか難しいのはスルーです。

コメント数: 0 閲覧数: 8995

今日はもう1年

パーマリンクby パコネコ on 2011年10月19日(水) 06:06

もう1ヶ月日記書いてないだと...


そう言えば、登録日時的には、ここって1年を少し過ぎた感じなんですね。
私は少し遅れて登録した気がしますが、まぁ1年経過はしたようで、おめでとうございます。
(実は9月の時点で過ぎてたという罠...があった気がするけど気にしないほうがいいですよね)

最近はここに覗きに来ることも少なくなり、ゲームプログラミングの館が更新されていたことに今更気が付きましたw
//////////////////////////////////////////ここから愚痴です//////////////////////////////////////////
ちなみに私は最近はお絵かきばかりしています。
絵がうまくなりたいからって言うのが大きいのですが、授業内容が物足りないのが原因だと自分では思っています。
(パコネコ <ー ゲームプログラム関係の大学1回生)
授業によりますが、ようやくif~elseを学びました。
モチベーションが上がらないです...

一応授業では、上級者用の課題と初心者ようの課題で点数に差があるようなので上級者用の課題を出すようにしていますが、
あまり(技術的に)差がない気がします。
授業中は周りの人の課題を見ることが多くなって来ました。どっちかといえばそれのほうが勉強になりますし...

完成させないといけないゲームもあるのですが、すでにそのゲームを面白いと思えなくなってしまっていてテンションが上がらなかったり...
(チーム作成だから非常にまずい)
どうしたことやら...

コメント数: 0 閲覧数: 9090

今日は使いまわし。

パーマリンクby パコネコ on 2011年9月17日(土) 19:25

今までは、プログラム作るときにすべてはじめから書いてましたが、多少なりともきれいに書けるようになってきたので、最近は使いまわししたいなーって思うようになってきました。
そこで、前回作っていたゲームにて土台作りに専念することにしました。

てなわけで、とりあえず、今まで大して変更もないくせに毎回同じものを書いていたKeyクラスを使いまわすことにしました。
ですが、自分ではこんなもんかなーって思っていてもほかの人から見たら、「ないわー」ってものだったら後々困ってきます。

そこで、ここはこう書いたほうがいいよ。って部分があったら教えてほしいです。
え?根本的にそりゃまずくない?って部分あったら特に...

では、以下プログラムになります。
[Key.h]
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#ifndef DEF_KEY_H
#define DEF_KEY_H
 
class c_Key{
 
public:
    enum Input_enum{
        INPUT_START,    //PAKO0813:START    ?
        INPUT_SELECT,   //PAKO0813:SELECT   ?
        INPUT_L1,       //PAKO0813:L1       ?
        INPUT_L2,       //PAKO0813:L2       ?
        INPUT_R1,       //PAKO0813:R1       ?
        INPUT_R2,       //PAKO0813:R2       ?
        INPUT_UP,       //上
        INPUT_RIGHT,    //右
        INPUT_DOWN,     //下
        INPUT_LEFT,     //左
        INPUT_A,        //○ Z ボタン
        INPUT_B,        //× X ボタン
        INPUT_X,        //△ S ボタン
        INPUT_Y,        //□ A ボタン
        INPUT_MAX,      //配列の大きさ(使用するボタンの数)
    };
public:
    c_Key();
    ~c_Key();
private:
    int key[INPUT_MAX];
    int KeyName[INPUT_MAX];
    int PadName[INPUT_MAX];
public:
    void KeyIni(void);      //入力状態の初期化
    void KeyNameIni(void);  //入力ボタンの設置
    int KeyGet(Input_enum); //入力状態のチェック
    int KeyTouch(void);     //入力があるかのチェック
    void KeyInput(void);    //入力状態を得る
 
};
#endif /* DEF_KEY_H */

[Key.cpp]
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "DxLib.h"
#include "KEY.h"
 
 
c_Key::c_Key(){
    KeyIni();
    KeyNameIni();
}
c_Key::~c_Key(){
}
/////////////////////////
int c_Key::KeyGet(Input_enum data){
    return key[data];
}
///////////////////////////////////////////////////////////////////////////
//入力状態を得る
void c_Key::KeyInput(void){
    int PadData=GetJoypadInputState( DX_INPUT_PAD1 );
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
   
 
    for(int i=0;i<INPUT_MAX;i++){
        if(GetHitKeyStateAll_Key[ KeyName[i] ]==1 || (PadData&PadName[i])!=0){
            key[i]++;
        }
        else key[i]=0;
    }
   
    return;
}
int c_Key::KeyTouch(void){
    for(int i=0;i<INPUT_MAX;i++){
        if(key[i]==1)return 1;
    }
    return 0;
}
/////////////////////////////////////////////////////////////////////////
/* 入力状態の初期化 */
void c_Key::KeyIni(void){
    for(int i=0;i<INPUT_MAX;i++){
        key[i]=0;
    }
    return;
}
//入力ボタンの設置
void c_Key::KeyNameIni(void){
        KeyName[    INPUT_L1    ]=KEY_INPUT_D;
        KeyName[    INPUT_L2    ]=KEY_INPUT_LCONTROL;
        KeyName[    INPUT_R1    ]=KEY_INPUT_F;
        KeyName[    INPUT_R2    ]=KEY_INPUT_C;
        KeyName[    INPUT_START ]=KEY_INPUT_SPACE;
        KeyName[    INPUT_SELECT]=KEY_INPUT_ESCAPE;
        KeyName[    INPUT_UP    ]=KEY_INPUT_UP;
        KeyName[    INPUT_RIGHT ]=KEY_INPUT_RIGHT;
        KeyName[    INPUT_DOWN  ]=KEY_INPUT_DOWN;
        KeyName[    INPUT_LEFT  ]=KEY_INPUT_LEFT;
        KeyName[    INPUT_A     ]=KEY_INPUT_Z;
        KeyName[    INPUT_B     ]=KEY_INPUT_X;
        KeyName[    INPUT_X     ]=KEY_INPUT_S;
        KeyName[    INPUT_Y     ]=KEY_INPUT_A;
 
        PadName[    INPUT_L1    ]=0x0400;
        PadName[    INPUT_L2    ]=0x0100;
        PadName[    INPUT_R1    ]=0x0800;
        PadName[    INPUT_R2    ]=0x0200;
        PadName[    INPUT_START ]=0x1000;
        PadName[    INPUT_SELECT]=0x2000;
        PadName[    INPUT_UP    ]=0x0008;
        PadName[    INPUT_RIGHT ]=0x0004;
        PadName[    INPUT_DOWN  ]=0x0001;
        PadName[    INPUT_LEFT  ]=0x0002;
        PadName[    INPUT_A     ]=0x0020;
        PadName[    INPUT_B     ]=0x0040;
        PadName[    INPUT_X     ]=0x0080;
        PadName[    INPUT_Y     ]=0x0010;
        return;
}


後は、ファイルからボタン設定できるようにしようかなーって思ってたり(思ってるだけでまだやってない...ってかやる気配がないw)
あとはコメントが少ないぐらいかな?って自分では思っているのですが、どうでしょうか?
皆さんは、どんな風にKeyの管理してますか?
*このプログラムは、キーボード入力とパッド入力を同時に受け付けます。
(書いてて気がついたけど、パッドがはまってない時は処理を行わせないほうがいいでしょうか?)
最後に編集したユーザー パコネコ [ 2011年9月17日(土) 19:26 ], 累計 1 回

コメント数: 0 閲覧数: 9108

今日はVCでIcon!

パーマリンクby パコネコ on 2011年9月07日(水) 13:48

少し前に作ったプログラムにアイコンをつけようとして、アイコンをつけれはしたものの、アイコンのパレットを変更できずに困ってしまいました。

今日は久しぶりに、その辺について調べてみたら、どうやらパレットを変更するには、「イメージ」を押して「色の設定」というところを押す必要があったようです。
といっても、もともと絵の下手な私のことです。
色を変更できてもろくにかけませんでしたw

最近は絵の練習のためにノートに落書きをして過ごしてましたが、もうすぐ夏休みも終わりです。(大学生なので長いのですw)
少しは上達すればいいのですが…
いつかへ、つづくですw

コメント数: 0 閲覧数: 9046

オンラインデータ

登録ユーザー: みけCAT