Home > Flash Archive
Flash Archive
Flash : Ustream Flash Client APIを使ってみる - SWFなカスタムパネルで中継を再生
- Posted at: 2009年12月10日 00:12
- Update: 2010年6月 2日 15:59

Ustream Flash Client APIて公式のAPIがこっそり公開されてるみたいなんで、Photoshop、FireworksやFlashのカスタムパネル上で中継を再生させてみたよ。
Flash : MIDI機器とFlashを連携(その2) - キーボードも使ってみる
- Posted at: 2009年2月 5日 15:28
- Update: 2009年6月19日 18:19

MIDIらしくMIDIキーボードとFlashの連携も実装してみたよ。入力にはnanoKEY(そろった。。)を、音源にはzk33さんのFlashで音生成などオーディオ操作ができるライブラリsazamekiを使ってみました。
Flash : MIDI機器とFlashを連携(その1)
- Posted at: 2009年1月22日 16:19
- Update: 2009年2月13日 04:52

KORGのnanoPADとnanoKONTROLが安価でかわいかったので衝動買い。でも音モノは全然やらないんで、MIDI音源やMIDI機器をFlashを連携させて、インスタレーション用の入力機器にして遊んでみました。というか、前もやったネタなんだけど詳しく解説しときます。
Flash : 画像認識でアナログ時計をデジタル時計に変換する
- Posted at: 2008年9月29日 01:40
- Update: 2009年2月13日 04:52

大阪てら子17 「Flashで時計大会」で発表したやつね。webカメラと画像認識を使ってアナログ時計をデジタル時計に変換してみました。
テーマは時計だったんだけど、画像認識を勉強したかったんで、空気読まずに絡めてみたw。ARだし入力は画像かな。アナログ時計の針って直線だよね→直線が検出できて、角度がわかれば、時間の情報って抽出できるんじゃね?→WEBカメラ使えばスペック次第でリアルタイムでもいけるんじゃあ?→あーなんか使えそうなソースあるじゃん。パクろ参考に。って感じ。ちなみに今回の妄想ストーリーは「アンドロイドはアナログ時計を読めるのか?」です。
Flash : バーチャルアイドルになる!(その1) - FreeTrack + GlovePIE + Papervision3D + TTS
- Posted at: 2008年7月16日 03:13
- Update: 2009年2月13日 04:52

Flashの勉強会。大阪てら子16「アイドル!アイドル!」で発表した、「IRヘッドトラッキング+Papervision3D+TTSでバーチャルアイドルの中の人になってみよう。」の内容をまとめてみたよ。(いまごろ?とかいうな)。えーだいぶ長い。。
今回のテーマはアイドル。ってことだったんで、ストレートにPV3Dでバーチャルアイドルでも作ってみる→でもPV3Dでアニメーションとか面倒そう。。→あーヘッドトラッキングとかやってみたいんだよ→生の人間の動きをトレースさせたら、中の人がいるっぽく見えるんじゃね?楽できるんじゃね?→ついでにOSCパケットをリアルタイムで扱うテストもしよう。うん。という感じで始めました。
Progression : Napsterのブログパーツを作る(その0) - 準備とか
- Posted at: 2008年4月24日 01:03
- Update: 2009年2月13日 04:52

AS3用フレームワークのProgression Frameworkを使って、ブログパーツみたいなFlashを作りまーす。とりあえず今回は準備編。
いろいろあったけど生まれ変わった定額制の音楽ダウンロード・配信サービス Napster。売れ筋のCDは少ないけど、こっちで売ってないEP盤とかマイナーな曲があったり、レビューも充実(?)してたりと結構便利。なんせ定額で聴き放題ってのがイイ。毎週水曜くらいに新規追加されたニューリリースが更新されるんですが、アプリがWindows専用なので、Macでは使えません。いちいち違うところにあるWindowsパソコンを見にいくのが面倒なんです。ええ。
なもんでニューリリースの情報がいつでも見れるように、あとProgressionの勉強も兼ねて、ブログパーツみたいなものを作ろう!かと思います。
NDS : NintendoDSをFlashで使う(その5) - Flashと連携
- Posted at: 2008年2月18日 00:25
- Update: 2009年2月13日 04:52

ええかげん書ききらないと。出力側のFlashも作る。動作の動画だけ撮って、できた!ってことでいいかなぁ。。 えーと。。ソース嫁。
このエントリは書きかけの内容が含まれます。気がむいたら随時更新されます。
勉強会:第11回 大阪てら子「なぎまぐの Flash ライブコーディング featuring たけし(休)」に行ってきたよ
- Posted at: 2008年1月30日 16:18
- Update: 2009年2月13日 04:52
たまにはレポートも書かないとねー。関西屈指のキワモノツワモノ共が集う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 at: 2008年1月24日 12:05
- Update: 2009年2月13日 04:52
はいはーい。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) てところで使うポートを指定してます。任意で変えましょう。

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

タッチペンやボタンを操作すると、「{"p":1,"x":10,"y":50}」というデータがDSからPC側のServerに送られているのを確認できます。できるはず。。
関連エントリ:
- (その1) - 概要とWiFi環境
- (その2) - DSとFlashをMIDIで繋げる
- (その3) - DSの勝手アプリを作るお
- (その4) - Serverの準備
- (その5) - Flashと連携
参考資料:
NDS : NintendoDSをFlashで使う(その3) - DSの勝手アプリを作るお
- Posted at: 2007年12月19日 17:10
- Update: 2009年2月13日 04:52
入力側の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
さくっとビルドしてあげましょう。動作確認は。。次に進んでから。。
関連エントリ:
- (その1) - 概要とWiFi環境
- (その2) - DSとFlashをMIDIで繋げる
- (その3) - DSの勝手アプリを作るお
- (その4) - Serverの準備
- (その5) - Flashと連携
参考:
Home > Flash Archive