勉強会:第11回 大阪てら子「なぎまぐの Flash ライブコーディング featuring たけし(休)」に行ってきたよ

  • posted on 2008年1月30日 16:18 / update 2011年8月26日 13:42 / by hoehoe3

たまにはレポートも書かないとねー。関西屈指のキワモノツワモノ共が集うFlash/ActionScript道場。第11回 大阪てら子「なぎまぐの Flash ライブコーディング featuring たけし(休)」に行ってきたよ。

参加者は○名(わすれた)、発表は3名。

ライブラリを使わずに3D(Flash ライブコーディング)

発表者はなぎまぐさん
ライブコーディングで、マウスに追随してグルグル廻すデモを作る。

  • マウスの座標をキーにアフィン変換で座標変換する。
  • 動くと結構かっこいい。

気抜いてる間にいつの間にかできてました。。グルグル。

寒いし雪でも降らせよう(Flash ライブコーディング)

たけしCEOが体調不良でお休みなので、さくーしゃさんが急遽登板。
ライブコーディングで、雪のパーティクルを降らせるデモを作る。

  • 1ピクセルのビットマップでパーティクルを作って落とす。
  • Bitmapのカンバスを作って、その中を描き直すことでアニメーションさせる。
  • いっぱい→各点のX、速度をランダムで降ってくる感じに。
  • 文字の形に降らせる。文字のBitmapを置いてスキャン→白に当たったら雪を生成。
  • forcemapを使って積もらせる。積もらせる形を描いて背景に置く。→雪の位置の背景をスキャン→速度を変える。黒:速い、白:遅く→積もってるように見える。
  • キラキラ点滅はローテクで回避w。こーゆーのがいい。キラキラ用に1/4のサイズの新しいカンバスを作る→smoothingつけて4倍の大きさで配置→加算モードで合成→雪を動かすときにキラキラ用のカンバスにDraw→1/4にした時に点がたまに消える+拡大smoothingでグローぽく。キラキラ。
  • パーティクルするならBitmapのが速い。
  • 処理中は表示するまでStageをロックしとくと、なんとんく速くなる。
詳しくはソースを読めばいい↓
http://saqoosha.net/2008/01/28/634/

ASでの12色環へのアプローチ

WCAN@名古屋の山ゴンさんが飛び入りで発表してくれました。
バウハウスの12色環のアレをASで書いて見よう。という内容。

  • 画像から色を抽出→3色からイイ感じの合成色を生成する。
  • エロい展開を期待してたのはあたしだけじゃないはず。。
詳しい内容はこちらから↓
http://ra66it.net/blog/index.php?ID=739

その他:話題に出たこと

・Flash Develop vs Flex Builder
・delegate再び。
・ライブコーディングするなら事前に練習しよう。

えーと。あとは覚えてない。。

まーそんな感じ。宣伝効果があったのか、新しい人もたくさんいて新鮮でしたw。
いつも場所を提供して下さるCOLORSさん。スピーカーの皆さんありがとうございました。

次回は2/16(土)。1周年らしいですわよ。

NDS : NintendoDSをFlashで使う(その4) - Serverの準備

  • posted on 2008年1月24日 12:05 / update 2011年8月26日 13:42 / by hoehoe3

はいはーい。DSとFash間で通信するためのソケットサーバを作りますよ。

とりあえずソケット通信でデータを受け取ってFlashに投げてやったらいいのです。バイナリー形式の方が後で便利なんだろーけど、テキストだけでもいいんです。カンタンなチャットサーバみたいなのをでっちあげましょう。

が、わたくし通信周りはさっぱりわかりません。「ActionScript 3.0 ゲームプログラミングブック」を出しておられるnpakaさんのところに、ソケット通信のサンプルとJavaのサーバのソースがあったので、拝借させてもらいます。あ、Javaなんで、適当に環境整えてください。というか「あかねと〜く」の人だったのか。。

    //メイン
    public static void main(String[] args) {
        ChatServer server=new ChatServer();
        server.start(16000);
    }

server.start(16000) てところで使うポートを指定してます。任意で変えましょう。

080124_serverlog1.gif

Serverを起動させます。「チャットサーバ実行開始」とコンソールに出力され、クライアントの接続を待ちます。次に勝手アプリをマジコン上で起動させます。接続に成功すると「CONNECTED SUCCESS」とコンソールに表示されます。

080124_serverlog2.gif

タッチペンやボタンを操作すると、「{"p":1,"x":10,"y":50}」というデータがDSからPC側のServerに送られているのを確認できます。できるはず。。

関連エントリ:

参考資料:

Photoshop : 外部ファイルから画像生成

  • posted on 2008年1月15日 11:32 / update 2011年8月26日 13:42 / by hoehoe3

普段の作業を手抜き楽にするためにPhotoshopを自動化させてみる。CS3でやるよ。

単純な作業を自動化するのって「アクション」を使うことが多いけど、ほんとに決まったことしかできないです。条件に合わせたいくつかのアクションを考えるよりも「スクリプト」機能を使った方がいろいろできるようです。

Photoshopで使用できるスクリプトにはVBScript、AppleScript、JavaScriptがあります。VBScriptはWindows、AppleScriptはMacでしか動きません。JavaScriptだと両方使えるのでJSで組んでいくことにします。もちろんそれぞれにできることが少し違ったりするんですが、Photoshop上で動かすぶんにはJSで十分です。

テキストを外部ファイルから読み出してメニューを動的に生成してみる

080121_title_psd.gif

とにかく作ってみる。上のようなPSDを用意します。テキストレイヤーを作って位置を合わせます。レイヤー名を「default」とつけて、非表示にしておきます。この「default」レイヤーを複製→外部ファイルからテキスト1行づつ処理→読み込んだテキストを内容とファイルネームに分解、内容をレイヤーに反映→web用のGIFをファイルネームで保存。複製したレイヤーを非表示→次を処理。というのが一連の作業となります。

// web用に保存(GIF)の設定
webOpt = new ExportOptionsSaveForWeb(); // 保存Objectを作成
webOpt.format = SaveDocumentType.COMPUSERVEGIF; // GIF
webOpt.colorReduction = ColorReductionType.ADAPTIVE; // パレット
webOpt.colors = 128; // 色数
webOpt.dither = Dither.DIFFUSION; // ディザーの種類
webOpt.ditherAmount = 100; // ディザーの割合


// テキストファイルを読む
folderObj = Folder.selectDialog("フォルダを選択してください"); // フォルダを選択するダイヤログを出す
fileList = folderObj.getFiles("*.txt"); // フォルダ内をなめてtxtをフィルタリング
fileObj = new File(fileList[0]); // 外部ファイルを読む
flag = fileObj.open("r");

// メインここから
if (flag == true)
{
 while (!fileObj.eof) {
  text = fileObj.readln(); // テキストを1行読む
  values = text.toString().split(","); // カンマでsplit→配列
  newLayObj = activeDocument.artLayers["default"].duplicate(); // PSDの"default"という名前のレイヤーを複製
  newLayObj.textItem.contents = values[0]; // テキストレイヤーにテキストを反映
  newLayObj.name = values[0]; // レイヤー名を反映
  
  outputFile = new File(folderObj + "/" + values[1] + ".gif"); // ファイル名を生成
  app.activeDocument.exportDocument(outputFile, ExportType.SAVEFORWEB, webOpt); // web用に出力
  
  newLayObj.visible = false; // 複製したレイヤーを非表示
 }
}else{
 alert("ファイルが開けませんでした");
}

適当な場所に保存。拡張子は.jsx

読み込む外部ファイル(CSV)を用意します。

会社情報,menu_company
事業案内,menu_business
製品案内,menu_product
お問合せ,menu_contact
サイトマップ,menu_sitemap

適当な場所に保存。txtでいいです。
title.psdを開いたままにして
ファイル >> スクリプト >> 参照...
からスクリプトのファイルを選らんで実行。
読み込んだ外部ファイルと同じフォルダに、GIFファイルが生成されているはずです。

ソース一式も置いておきますね。
AdobeScript01.zip

リファレンスはローカルのアプリケーションフォルダの中にPDFがあります
・Adobe\Adobe Photoshop CS3\Photoshop CS3 Scripting Guide-J.pdf
・Adobe\Adobe Photoshop CS3\Photoshop CS3 JavaScript Ref.pdf

サンプルはOpenSpaceさんの「Adobe Photoshop CS3自動化作戦 」に大量にありますんで。この辺のを読めばさくっとできるはず。

参考資料:

NDS : NintendoDSをFlashで使う(その3) - DSの勝手アプリを作るお

  • posted on 2007年12月19日 17:10 / update 2011年8月26日 13:42 / by hoehoe3

入力側のDSの勝手アプリを作るお。よくわかってないので要所とソースだけさらっと書くだけ。あとはコード嫁。

とりあえず実装するもの
・ボタン入力
・タッチペン入力
・フレームバッッファ
・WiFi出力

ボタン入力
scanKeys() をV-Blank の割込みハンドラで呼び、keysHeld()、keysDown()の関数でその時の十字キー、A、B、X、Y、L、R、START、SELECTキーの状態を取ります。

KEYPAD_BITS keys;
{
    scanKeys();             // キー入力状態を NDS ライブラリ内変数に取り込む
    keys= keysDown();  // ボタン情報の取得
    if (keys& KEY_A) {   // Aボタンのダウンエッジ検査
        shoot();                // 何ぞ処理
    }
}

タッチペン入力
libndsのAPIでタッチペンの座標と状態を取ります。touchReadXY()をV-Blank の割込みハンドラで呼び、タッチパッドの情報を取ります。ダウンエッジの検出を忘れずに。

touchPosition touchXY;
int tx, ty;
{
    if (keyHeld() & KEY_TOUCH) {    // ペンのダウンエッジを検査
        touchXY = touchReadXY();     // タッチパッドの情報を取得
        tx = touchXY.px;                    // xの座標
        ty = touchXY.py;                    // yの座標
    }
}

フレームバッファ
メモリ領域にデータを書くと、そのデータはスクリーンに表示されるスクリーンモードです。タッチペンを置いたところに矩形を表示させてみます。

// VRAMを指定した座標、色で塗りつぶす
void draw(int x, int y, uint16* buf, uint16 c) {
    buf += y * SCREEN_WIDTH + x;
    int i;
    for(i = 0; i < shape_height; i++) {
        uint16* line = buf + SCREEN_WIDTH * i;
        int j;
        for(j = 0; j < shape_width; j++) { 
            *line++ = c;
        }
    }
}

// メイン
int main(void) {

    // 初期化
    videoSetMode(MODE_FB0);  //フレームバッファモード
    videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE);  //グラフィックエンジンのモードを指定。アクティブにして使用するBGも設定
    vramSetMainBanks(VRAM_A_LCD, VRAM_B_LCD, VRAM_C_SUB_BG, VRAM_D_LCD);  //VRAMの使用領域設定

    SUB_BG0_CR = BG_MAP_BASE(31);

    BG_PALETTE_SUB[255] = RGB15(31,31,31);
    consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);

    while(1) {

        // このへんにタッチパッドの入力とか

        // 前の■のあった場所を塗りつぶす
        draw(old_x, old_y, VRAM_A, RGB15(5, 5, 5));
        // 新しい四角を塗りつぶす
         draw(shape_x, shape_y, VRAM_A, RGB15(0,31,0)); 
        swiWaitForVBlank();  // VBLANKを待つ
    }
}

WiFi出力
チュートリアルがほとんど無いので、サンプルコードを読んだ方が早いです。Stephen Stair氏のサンプル(dswifi_lib_v0.3a_full)の中のwifi_exampleの方か、DSMIのサンプルアプリのソース。日本語ではNDSD Wikiにあった初期化のサンプル(消えたっぽい)がありますんで、ぐぐぐっと眺めてるとなんとなくわかるハズ。

WiFiはARM7からしかアクセスできないんで、FIFOを使ってARM9>>>ARM7のCPU間通信させるあたりではまった。

Stephen Stair氏のwifi_lib_testの方ではいろいろできる感じなので触ってみるといいかも。なおdswifiの最新版はSourceForgeの方で開発、公開されています。仕様も変わるかもしれんのであしからず。

出力形式
容量が小さく、扱いやすいように今回はJSON形式で送ることにします。

{"vx":"1","vy":"10","vs":"1"}

できたもの

上の例と違ってるとこもあるけどこんな感じになる。

・ARM7のソース

#include "nds.h"
#include "stdlib.h"
#include "dswifi7.h"

int vcount;
touchPosition first,tempPos;


void startSound(int sampleRate, const void* data, u32 bytes, 
    u8 channel, u8 vol,  u8 pan, u8 format) {
  SCHANNEL_TIMER(channel)  = SOUND_FREQ(sampleRate);
  SCHANNEL_SOURCE(channel) = (u32)data;
  SCHANNEL_LENGTH(channel) = bytes >> 2 ;
  SCHANNEL_CR(channel)     = SCHANNEL_ENABLE | SOUND_ONE_SHOT 
    | SOUND_VOL(vol) | SOUND_PAN(pan) | (format==1?SOUND_8BIT:SOUND_16BIT);
}


s32 getFreeSoundChannel() {
  int i;
  for (i=0; i<16; i++) {
    if ( (SCHANNEL_CR(i) & SCHANNEL_ENABLE) == 0 ) return i;
  }
  return -1;
}


void VcountHandler() {
  static int lastbut = -1;

  uint16 but=0, x=0, y=0, xpx=0, ypx=0, z1=0, z2=0;

  but = REG_KEYXY;

  if (!( (but ^ lastbut) & (1<<6))) {

    tempPos = touchReadXY();

    if ( tempPos.x == 0 || tempPos.y == 0 ) {
      but |= (1 <<6);
      lastbut = but;
    } else {
      x = tempPos.x;
      y = tempPos.y;
      xpx = tempPos.px;
      ypx = tempPos.py;
      z1 = tempPos.z1;
      z2 = tempPos.z2;
    }
  } else {
    lastbut = but;
    but |= (1 <<6);
  }

  if ( vcount == 80 ) {
    first = tempPos;
  } else {
    if (  abs( xpx - first.px) > 10 || abs( ypx - first.py) > 10 
        || (but & ( 1<<6)) ) {
      but |= (1 <<6);
      lastbut = but;
    } else {
      IPC->mailBusy = 1;
      IPC->touchX      = x;
      IPC->touchY      = y;
      IPC->touchXpx    = xpx;
      IPC->touchYpx    = ypx;
      IPC->touchZ1    = z1;
      IPC->touchZ2    = z2;
      IPC->mailBusy = 0;
    }
  }
  IPC->buttons    = but;
  vcount ^= (80 ^ 130);
  SetYtrigger(vcount);
}


void VblankHandler(void) {
  u32 i;

  //sound code
  TransferSound *snd = IPC->soundData;
  IPC->soundData = 0;

  if (0 != snd) {
    for (i=0; i<snd->count; i++) {
      s32 chan = getFreeSoundChannel();

      if (chan >= 0) {
        startSound(snd->data[i].rate, snd->data[i].data, snd->data[i].len, 
          chan, snd->data[i].vol, snd->data[i].pan, snd->data[i].format);
      }
    }
  }
  
  Wifi_Update(); // VBlank時にWifi情報をアップデートする
}

// コールバック関数
// ARM9へWiFiライブラリのメッセージを通知する
void arm7_synctoarm9() { // FIFOメッセージの送信
  REG_IPC_FIFO_TX = 0x87654321;
}
// 割り込みハンドラ
// ARM9からの入力を通知する
void arm7_fifo() { // FIFOメッセージの入力チェック
   u32 msg = REG_IPC_FIFO_RX;
   if(msg==0x87654321) Wifi_Sync();
}


int main(int argc, char ** argv) {

  // enable & prepare fifo asap
  REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR;
  // Reset the clock if needed
  rtcReset();

  // read User Settings from firmware
  //readUserSettings();

  //enable sound
  powerON(POWER_SOUND);
  writePowerManagement(PM_CONTROL_REG, ( 
    readPowerManagement(PM_CONTROL_REG) & ~PM_SOUND_MUTE ) 
    | PM_SOUND_AMP );
  SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7F);

  // Set up the interrupt handler
  irqInit();
  irqEnable(IRQ_VBLANK | IRQ_VCOUNT);
  SetYtrigger(80);
  irqSet(IRQ_VCOUNT, VcountHandler);
  vcount = 80;
  
  irqSet(IRQ_WIFI, Wifi_Interrupt); // WiFi 割り込みのセット
  irqEnable(IRQ_WIFI);
  
  { // WiFi の初期化と ARM9 との同期
    u32 fifo_temp;   

    while(1) { // マジックナンバーがセットされるまで待つ
      while(REG_IPC_FIFO_CR&IPC_FIFO_RECV_EMPTY) swiWaitForVBlank();
      fifo_temp=REG_IPC_FIFO_RX;
      if(fifo_temp==0x12345678) break;
    }
    while(REG_IPC_FIFO_CR&IPC_FIFO_RECV_EMPTY) swiWaitForVBlank();
    fifo_temp=REG_IPC_FIFO_RX; // Wifi_Init 用の値を取得
    Wifi_Init(fifo_temp);

    irqSet(IRQ_FIFO_NOT_EMPTY,arm7_fifo); //FIFO IRQ のセット
    irqEnable(IRQ_FIFO_NOT_EMPTY);
    REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ;

    // WiFi LIB が初期化されたことをARM9に通知
    Wifi_SetSyncHandler(arm7_synctoarm9);
  } // arm7 wifi init complete

  // 割り込みだけ有効にして後は待つ
  while (1) {
    VblankHandler();
    swiWaitForVBlank();
  }
  
  return 0;
}

・ARM9のソース

#include <nds.h>
#include <stdio.h>
#include <string.h>

#include <dswifi9.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
//---------------------------------------------------------------------------------

#define VCOUNT (*((u16 volatile *) 0x04000006))
#define PEN_DOWN (~IPC->buttons & (1 << 6))

touchPosition touchXY;
int touch_was_down = 0;

int my_socket;

static int old_x = 0;
static int old_y = 0;
static int shape_x = 0;
static int shape_y = 0;
static int shape_width = 4;
static int shape_height = 4;
static char * sendStr = "o";

//---------------------------------------------------------------------------------
// Dswifi helper functions

// WiFi タイマー関数
// sgIPのアップデート
void Timer_50ms(void) {
  Wifi_Timer(50);
}

// ARM7へFIFOメッセージを通知する関数
void arm9_synctoarm7() { // FIFOメッセージを送る
  REG_IPC_FIFO_TX=0x87654321;
}

// 割り込みハンドラ
// ARM7からのFIFOメッセージを取得する
void arm9_fifo() { // FIFOメッセージの入力をチェック
  u32 value = REG_IPC_FIFO_RX;
  if(value == 0x87654321) Wifi_Sync();
}

// フレームバッファで短型を動かす
//---------------------------------------------------------------------------------
void draw(int x, int y, uint16* buf, uint16 c) {
//---------------------------------------------------------------------------------

  buf += y * SCREEN_WIDTH + x;
  int i;
  for(i = 0; i < shape_height; i++) {
    uint16* line = buf + SCREEN_WIDTH * i;
    int j;
    for(j = 0; j < shape_width; j++) {  
      *line++ = c;
    }
  }
}

// Vblank割り込み時の処理。
//---------------------------------------------------------------------------------
void VblankHandler() {
//---------------------------------------------------------------------------------

  sendStr = "";
  int keys[16] = {0};
  
  scanKeys();
  touchXY = touchReadXY();
  int held = keysHeld();
  
  if(held & KEY_UP) {
    keys[0] = 1;
  }
  if(held & KEY_DOWN) {
    keys[1] = 1;
  }
  if(held & KEY_RIGHT) {
    keys[2] = 1;
  }
  if(held & KEY_LEFT) {
    keys[3] = 1;
  }
  if(held & KEY_A) {
    keys[4] = 1;
  }
  if(held & KEY_B) {
    keys[5] = 1;
  }
  if(held & KEY_X) {
    keys[6] = 1;
  }
  if(held & KEY_Y) {
    keys[7] = 1;
  }
  if(held & KEY_R) {
    keys[8] = 1;
  }
  if(held & KEY_L) {
    keys[9] = 1;
  }
  if(held & KEY_START) {
    keys[10] = 1;
  }
  if(held & KEY_SELECT) {
    keys[11] = 1;
  }
  
  if(!touch_was_down && PEN_DOWN) {
    touch_was_down = 1;
    keys[12] = 1;
    keys[13] = touchXY.px;
    keys[14] = touchXY.py;
    iprintf("\x1b[5;0H");
    iprintf("Touch x / y = %03d / %03d\n", touchXY.px, touchXY.py);
  }
  else if(touch_was_down && !PEN_DOWN) {
    touch_was_down = 0;
  }
  else if(touch_was_down && PEN_DOWN) {
    keys[12] = 2;
    keys[13] = touchXY.px;
    keys[14] = touchXY.py;
    iprintf("\x1b[5;0H");
    iprintf("Touch x / y = %03d / %03d\n", touchXY.px, touchXY.py);
  }
  
  old_x = shape_x;
  old_y = shape_y;
  shape_x = touchXY.px;
  shape_y = touchXY.py;

  draw(old_x, old_y, VRAM_A, RGB15(5, 5, 5));
  draw(shape_x, shape_y, VRAM_A, RGB15(0,31,0));
  
  if(held) {
    sprintf(sendStr,"{\"au\":%d,\"ad\":%d,\"al\":%d,\"ar\":%d,\"ba\":%d,\"bb\":%d,\"bx\":%d,\"by\":%d,\"bl\":%d,\"br\":%d,\"bs\":%d,\"be\":%d,\"pp\":%d,\"px\":%d,\"py\":%d}\n", 
      keys[0], keys[1], keys[2], keys[3], keys[4], keys[5], keys[6], keys[7], keys[8], keys[9], keys[10], keys[11], keys[12], keys[13], keys[14] );
    send( my_socket, sendStr, strlen(sendStr), 0 );
  }
  
  VBLANK_INTR_WAIT_FLAGS |= IRQ_VBLANK;
}

//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------

  powerON(POWER_ALL);
  
  videoSetMode(MODE_FB0);  //フレームバッファモード
  videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE);  //グラフィックエンジンのモードを指定。アクティブにして使用するBGも設定
  vramSetMainBanks(VRAM_A_LCD, VRAM_B_LCD, VRAM_C_SUB_BG, VRAM_D_LCD); //VRAMの使用領域設定
  
  SUB_BG0_CR = BG_MAP_BASE(31);
  
  BG_PALETTE_SUB[255] = RGB15(31,31,31);
  consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);

  // ARM7 の WiFi 機能を初期化するためのFIFOメッセージを送る
  {
    REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR; // FIFOの有効&クリア
    
    u32 Wifi_pass= Wifi_Init(WIFIINIT_OPTION_USELED);
    REG_IPC_FIFO_TX=0x12345678;
    REG_IPC_FIFO_TX=Wifi_pass;
       
    *((volatile u16 *)0x0400010E) = 0; // Timer3 無効
    
    irqInit();
    irqSet(IRQ_TIMER3, Timer_50ms); // Timer IRQ のセット
    irqEnable(IRQ_TIMER3);
    irqSet(IRQ_FIFO_NOT_EMPTY, arm9_fifo); // FIFO IRQ のセット
    irqEnable(IRQ_FIFO_NOT_EMPTY);
    irqEnable(IRQ_VBLANK); // Vblank IRQ のセット
     
    REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ; // FIFO IRQ 有効
     
    Wifi_SetSyncHandler(arm9_synctoarm7); // WiFi ライブラリに ARM7への通知用関数をセットする

    // Timer3 のセット
    *((volatile u16 *)0x0400010C) = -6553; // 6553.1 * 256 cycles = ~50ms;
    *((volatile u16 *)0x0400010E) = 0x00C2; // enable, irq, 1/256 clock
    
    while(Wifi_CheckInit()==0) { // ARM7 の初期化終了待ち
      while(VCOUNT>192); // VBlank 待ち
      while(VCOUNT<192);
    }
    
  }
  // WiFi 初期化終了 ここからWiFi ライブラリが使えるようになります
  
  // 単純な接続
  {
    int i;
    // Wifi_AutoConnect では、AOSS 機能は使えないらしいです。
    // WEPの設定をDS本体から読んできます。
    Wifi_AutoConnect(); // 接続要求
    while(1) {
      i=Wifi_AssocStatus(); // ステータスチェック
      if(i==ASSOCSTATUS_ASSOCIATED) {
        iprintf("Connected successfully!\n");
        break;
      }
      if(i==ASSOCSTATUS_CANNOTCONNECT) {
        iprintf("Could not connect!\n");
                while(1);
        break;
      }
    }
  }
  
  // 接続成功したら、ここからソケットインターフェイスを使ってインターネットに接続することができます。

  // gethostbynameでIPアドレスに返す。直接IPでも。
  struct hostent * myhost = gethostbyname( "10.0.2.1" );
  iprintf("Found IP Address!\n");

  // SOCK_STREAM 型のソケットを作る。TCPってこと。
  my_socket = socket( AF_INET, SOCK_STREAM, 0 );
  iprintf("Created Socket!\n");

  // 指定したポートにソケットが繋がるか尋ねてみる。
  struct sockaddr_in sain;
  sain.sin_family = AF_INET;
  sain.sin_port = htons(16000); // ポートを指定。なんとなく16000にしてみた。
  sain.sin_addr.s_addr= *( (unsigned long *)(myhost->h_addr_list[0]) );
  connect( my_socket,(struct sockaddr *)&sain, sizeof(sain) );
  iprintf("Connected to server!\n");

  // 接続確認のメッセージを送る。
  char * sendStr = "CONNECTED SUCCESS";
  send( my_socket, sendStr, strlen(sendStr), 0 );


  /*
  必要ならこの辺で返ってきたメッセージを受信させるといいんじゃないかな。
  */


  while(1) {
  
    VblankHandler();
    swiWaitForVBlank();
  
  }
  
  //return 0;
}

コンパイル

WiFiのライブラリが無いよ。ってコンパイルに失敗する場合はMakefile内の、静的リンクライブラリを指定するLIBSの行で、-lnds9より前に-sdwifi9を持ってくると通る感じです。lnds7も同じです。

LIBS := -ldswifi9 -lnds9

さくっとビルドしてあげましょう。動作確認は。。次に進んでから。。

関連エントリ:

参考:

NDS : NintendoDSをFlashで使う(その2) - DSとFlashをMIDIで繋げる

  • posted on 2007年12月18日 14:54 / update 2011年8月26日 13:42 / by hoehoe3

ちょっと脱線。MIDI経由でDSとFlashを繋げます。DSをMIDI機器にするDSMIと、入力にMIDIが使えるAdobe AIRアプリVispで動いているのを見てみます。こんな方法もあるよ程度に。

DSMI (DSMIDIWiFi)

http://dsmidiwifi.tobw.net/

DSをMIDI機器として扱えるライブラリとアプリ。

サンプルアプリ
・DS MIDI Keyboard (MIDIキーボード)
・Kaos DS (Kaos Padみたいにタッチパッドでコントロール)
・Pulse DS (DSのPSG音源をMIDI経由で鳴らす)

Visp

http://visp-vj.com/
071219_visp.jpg AIRアプリなVJツール。入力にMIDIが使える。→動作デモ

インストールと実行

DSMIのインストール
・サンプルアプリ(とりあえずKaos DS)をダウンロード→MicroSDにコピー
・使用OS用のDSMIDIWiFi Serverをダウンロード→コピー(どこに入れても可)

Vispのインストール
・Adobe AIRの実行環境をダウンロード→インストール
・Vispをダウンロード→ダブルクリックでインストール
・visp MIDI Proxyをダウンロード

アプリケーションの実行
・先にWiFiの設定をすましておく。
・マジコンをDSに挿してKaosDSを実行。
・DSMIDIWiFi Serverを実行。(OS XでMIDI機器として認識しない場合はmmjMandolane MIDI SPIなどJavaのライブラリをインストールしてください。)
・VispにMIDI入力の登録 (チュートリアル参照
・visp MIDI Proxyを実行→MIDI機器を選択→Start MIDI Connectionをクリック
・vispを実行

後は適当にタッチパッドを動かせば、アプリ側のスライダーやパッドが反応するのが確認できるハズ。

だいぶ回りくどい。。

DS → → (socket) → → DSMIDIWiFi Server → → (MIDI Message) → →
→ → visp MIDI Proxy → → (socket) → → visp

てな感じでだいぶ無駄が多いです。。

とにかく簡単にやりたいんでDSMIを使うのを前提に調べてみたけど、意外にもFlashでMIDIを扱う方法があまり無い感じ。「Flash MIDI」というFlashプラグイン(?)があるけどAS2だったんで断念。というか中身読んでない。オープンソースなRTMPサーバの「Red5」でもMIDIを使えるようなんだけど、サンプルがよくわからないんで断念。一括して揃ってたVispにしてみました。機能があれこれ実装されると面白そうなんだけど、開発が進んでないような。まー動いたのは確認できたんで。コレはここまで。

次はちゃんとDSの勝手アプリを作るよ。

関連エントリ:

参考資料:

前の5件 1  2  3  4  5  6  7  8  9  10
Auther
hoehoe: おおさか方面でWebとかやってますよ。
Search
Feeds