hoelog
勉強会:第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と連携
参考資料:
Photoshop : 外部ファイルから画像生成
- Posted at: 2008年1月15日 11:32
- Update: 2010年1月24日 22:33
普段の作業を手抜き楽にするためにPhotoshopを自動化させてみる。CS3でやるよ。
単純な作業を自動化するのって「アクション」を使うことが多いけど、ほんとに決まったことしかできないです。条件に合わせたいくつかのアクションを考えるよりも「スクリプト」機能を使った方がいろいろできるようです。
Photoshopで使用できるスクリプトにはVBScript、AppleScript、JavaScriptがあります。VBScriptはWindows、AppleScriptはMacでしか動きません。JavaScriptだと両方使えるのでJSで組んでいくことにします。もちろんそれぞれにできることが少し違ったりするんですが、Photoshop上で動かすぶんにはJSで十分です。
テキストを外部ファイルから読み出してメニューを動的に生成してみる

とにかく作ってみる。上のような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 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と連携
参考:
NDS : NintendoDSをFlashで使う(その2) - DSとFlashをMIDIで繋げる
- Posted at: 2007年12月18日 14:54
- Update: 2009年2月13日 04:52
ちょっと脱線。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/
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機器として認識しない場合はmmjかMandolane 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の勝手アプリを作るよ。
関連エントリ:
- (その1) - 概要とWiFi環境
- (その2) - DSとFlashをMIDIで繋げる
- (その3) - DSの勝手アプリを作るお
- (その4) - Serverの準備
- (その5) - Flashと連携
参考資料: