お絵描きやプログラミングやアーマードコアについて綴っていくつもりです。プログラミングは備忘録的に使うつもりだったりする。
プロフィール

typeすつーか

Author:typeすつーか
FC2ブログへようこそ!

最新トラックバック
カウンターです
ついったー

広告とか

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/-- --:-- スポンサー広告 TB(-) CM(-)
天下一プログラマーコンテスト2014予選B C問題「天下一王国の歴史」にでてくるセルオートマトンのシュミレーター作ったので、せっかくだから遊んでみた。

ソースはここです。

振動子の発見

World全体を使ってるので、振動子と呼べるのか、そこら辺詳しくないですが・・・(汗)






  • 周期が4のもの



automata003.png


automata004.png


automata005.png


automata006.png


automata007.png




  • 周期が2のもの その1



automata2000.png


automata2001.png




  • 周期が2のもの その2



automataa000.png


automataa001.png
スポンサーサイト
2014/08/27 03:01 processing TB(0) CM(0)
この記事はProcessing Advent Calendar 2013の27日目です。

こんにちは、すつーかです。
よく"すーつかさん"って呼ばれますが、すつーかです。

processingでネットワークSnifferとか作れないかなとか思って調べてみたらライブラリ見つけました。
もう誰かが作ってくださっていたようです。
さっそく試してみましょう。

Carnivore
RSG / Carnivore | github

で、こちらがサンプルを実行した動画↓

Carnivore Processing Sketches from Caroline Brown on Vimeo.



どうですか!
ワクワクしてきませんか!?
僕はワクワクドキドキしてきました!

ipアドレスの第3オクテット目をx座標、第4オクテット目をy座標としているようです。(たぶん

でもちょっと残念なことが。
Dropboxっぽいアイコンとか、SkypeのIMっぽいアイコンとか、iTunesっぽいアイコンとかありますよね?
ソース見て分かったんですが、これ実は

...適当に割り振ってるだけだったのです




というわけで自分なりに作ってみました↓

processing_carnivore_extends from Type Stuka on Vimeo.



Dropboxとのトラフィックを検出するとDropboxのアイコン、同じくtwitterのアイコンも表示するようにしてみました。
いいですね〜。今自分がどんなサービスを利用しているか、あるいはバックグランドでどんなサービスが動いているかが見れてとても興奮しますね^〜^
ipアドレスの都合上、とても小さく描画してますが、ちゃんとipも一つ一つしっかり描画しています。
nslookupのクラスもpdeで作って、ipアドレスからドメインを取得し、描画できるようにもしました。
あと、赤色のノードがローカルのPCです。ひと目でわかって便利!


Sample3には、テキストファイルにログを保存しておけば再生してくれる機能があります。
ログファイルっていうのはこんなかんじの形式でした↓
p5logfile.png


時刻と送信元ipアドレスと送信先ipアドレスですね。
これくらいのログなら既存のpcapファイルからスクリプト使って出力できそうです。
(...というかwiresharkのexport機能で出力できたような...?)
pythonを使ってログファイル作るスクリプト書きました。


これを使えばWireshark SampleCapturesのパケットも簡単にログファイル出力できますね。
NTPとか、UDP通信のものはスクリプトのtcpをudpに置き換えて使ってください。


で、いろいろ再生してみました(。∀。)


Wireshark SampleCaptures

TELNET↓

Visualize telnet-raw.pcap from Type Stuka on Vimeo.




NTP(ポート番号を描画するようにしました。おもいっきりNTPのポートですね!)↓

ntp traffic from Type Stuka on Vimeo.





P5erの皆さん!
processingでTCP/IPのスイスアーミーナイフ作りませんか!?


ではまた!
2013/12/25 05:35 processing TB(0) CM(0)
プラグイン使えよという話ですが、直貼りェ...

int start_x= 10;
int start_y= 10;

int goal_x = 400;
int goal_y = 20;

int speed=1;

void setup(){
size(500, 500);
stroke(0,0,255);
strokeWeight(10);
point(start_x, start_y);
stroke(255,0,0);
point(goal_x, goal_y);
stroke(0,0,0);
strokeWeight(0);
initDDA();
}

void draw(){
point(dot_x,dot_y);
drawDDA();
}


int dot_x=start_x;
int dot_y=start_y;

int direct_x;
int direct_y;

int diff_x;
int diff_y;

int diff=0;

void initDDA(){
direct_x=start_x<=goal_x?1:-1;
direct_y=start_y<=goal_y?1:-1;

diff_x=start_x<=goal_x?goal_x-start_x:start_x-goal_x;
diff_y=start_y<=goal_y?goal_y-start_y:start_y-goal_y;

diff=diff_x>=diff_y?diff_x/2:diff_y/2;
}

void drawDDA(){
if(diff_x>=diff_y){
for(int i=0;i dot_x+=direct_x;//毎回x.

//Y方向には誤差が蓄積したときに移動.
diff+=diff_y;
if(diff>=diff_x){
diff-=diff_x;
dot_y+=direct_y;//たまにY.
}
}
}
else{
for(int i = 0; i< speed; i++){
dot_y+=direct_y;//毎回y.

diff+=diff_x;
if(diff>=diff_y){
diff-=diff_y;
dot_x+=direct_x;//たまにx.
}
}
}

if(dot_x < 0|| dot_x > width || dot_y < 0 || dot_y > height){
noLoop();
}
}
2013/04/05 00:47 processing TB(0) CM(0)
Processing Advent Calendar 2012 23日目の記事です。



↑即興でつくったブロック崩し(-ω-`)








AdventCalenderにむけてSimpleOpenNIでなにかをつくりたかったのですが、
事実上、アイデアソンで終わってしまった・・・。


そこで今回は、おもしろ(がじぇっと)の素となるもの、
すなわちアイデアの採掘方法を自分なりに公開しようとおもいます。


私がよく用いている発想法として、まず第一に


   

I.不便と感じたときに、それを便利にするものをつくる



があります。


そして、今回の記事のメインディッシュはコレ↓



   

II. Processing × ナニカ





いきなりこれをみただけでは「(・へ・?)」

となってしまうかもしれません。





私は今回のハッカソン(?)にあたり、
きがつくとProcessing向けのさまざまなライブラリを手当たり次第にあたっていました。
ちょうど、「ナニカ」の部分に当てはめて。




そして生まれました。








がじぇっとの「素」が。






タイトルをみて楽しみにしてらっしゃった方ごめんなさい、
また機会をみてつくろうとおもいます(ーー;)






申し訳なけ程度にうp・・・↓


import SimpleOpenNI.*;

SimpleOpenNI kinect;
HashMap hands = new HashMap();
PVector pos2d;

void setup(){
kinect = new SimpleOpenNI(this);
kinect.enableDepth();
kinect.enableRGB();
kinect.enableScene();
kinect.alternativeViewPointDepthToImage();
kinect.setMirror(true);

//---
kinect.enableGesture();
kinect.addGesture("Wave");
kinect.addGesture("Click");
//kinect.addGesture("RaiseHand");
kinect.enableHands();

size(kinect.rgbWidth(), kinect.rgbHeight());


pos2d = new PVector(100, 100);

}

int px = 0, py = 0, vx = 5, vy = 16;
void draw(){
kinect.update();
image(kinect.rgbImage(), 0, 0);

drawHands();
ellipse(px, py, 30, 30);
reflec();
racket();
}

void reflec(){
px += vx;
py += vy;
if(px < 0 || px > kinect.rgbWidth()){
vx = -vx;
}
if(py < 0 || py > kinect.rgbHeight()){
vy = -vy;
}
}

void racket(){
if(abs(pos2d.x - px) < 30 && abs(pos2d.y - py) < 30){
px = (int)random(kinect.rgbWidth());
py = (int)random(kinect.rgbHeight());
}

}

void drawHands(){
for(Map.Entry entry : hands.entrySet()){
int id = (Integer)entry.getKey();
PVector pos3d = (PVector)entry.getValue();

pos2d = new PVector();
kinect.convertRealWorldToProjective(pos3d, pos2d);

//ellipse
stroke(255, 0, 0, 128);
strokeWeight(32);
point(pos2d.x, pos2d.y);
}

}


void onRecognizeGesture(String strGesture, PVector idPosition, PVector endPosition){
println("Recognzed "+ strGesture);
kinect.startTrackingHands(endPosition);
}

void onUpdateHands(int handId, PVector pos, float time){
hands.put(handId, pos);
}

void onDestroyHands(int handId, float time){
hands.remove(handId);
}





このプログラムの遊び方


    まず初めに、手を振るジェスチャである、「バイバイ」をすると手を認識する

    画面にでてきた火球をタッチするとなんか起こる

    それだけ!



つまりは、動くボールを描画する入門的なコードとSimpleOpenNIの初歩の部分をミックスしたというものです。



明日はp5infoさんです。






-------------追記-----------------


SimpleOpenNIを使ったブロック崩しゲームできました。

y軸方向の反射はありません。。。

import SimpleOpenNI.*;

SimpleOpenNI kinect;
HashMap hands = new HashMap();
PVector pos2d;
int flag[][] = new int[8][4];

void setup(){
kinect = new SimpleOpenNI(this);
kinect.enableDepth();
kinect.enableRGB();
kinect.enableScene();
kinect.alternativeViewPointDepthToImage();
kinect.setMirror(true);

//---
kinect.enableGesture();
kinect.addGesture("Wave");
kinect.addGesture("Click");
//kinect.addGesture("RaiseHand");
kinect.enableHands();

size(kinect.rgbWidth(), kinect.rgbHeight());


pos2d = new PVector(100, 100);

for(int i = 0; i < 8; i++){
for(int k = 0; k < 4; k++){
flag[i][k] = 1;
}
}
}

int px = 0, py = 0, vx = 5, vy = 16;
void draw(){
kinect.update();
image(kinect.rgbImage(), 0, 0);

drawHands();
ellipse(px, py, 30, 30);
rect(pos2d.x - 50, kinect.rgbHeight()- 70, 100, 20);
reflec();
racket();
panel();
}

void panel(){
int offset = 50;
for(int i = 0; i < 8; i ++){
for(int k = 0; k < 4; k++){
if(flag[i][k]==1){
rect(offset + k*150 , i*35, 100, 30);
}else continue;
}
}

}


void reflec(){
px += vx;
py += vy;
if(px < 0 || px > kinect.rgbWidth()){
vx = -vx;
}
if(py < 0 || py > kinect.rgbHeight()){
vy = -vy;
}

for(int i = 0; i < 8; i ++){
for(int k = 0; k < 4; k++){
if(flag[i][k]==1){
if(abs(50 + k*150 + 50 - px) < 50 &&
abs(i*35 - py) < 15){
flag[i][k]=0;
vy = -vy;
}
}else continue;
}
}
}

void racket(){
if(abs(pos2d.x - px) < 100 && py > kinect.rgbHeight() - 75){
vy = -vy;
}

}

void drawHands(){
for(Map.Entry entry : hands.entrySet()){
int id = (Integer)entry.getKey();
PVector pos3d = (PVector)entry.getValue();

pos2d = new PVector();
kinect.convertRealWorldToProjective(pos3d, pos2d);

//ellipse
stroke(255, 0, 0, 128);
strokeWeight(32);
point(pos2d.x, pos2d.y);

//drawPos(id, pos3d, pos2d);
}

}



void onRecognizeGesture(String strGesture, PVector idPosition, PVector endPosition){
println("Recognized "+ strGesture);
kinect.startTrackingHands(endPosition);
}

void onUpdateHands(int handId, PVector pos, float time){
hands.put(handId, pos);
}

void onDestroyHands(int handId, float time){
hands.remove(handId);
}
2012/12/23 23:56 processing TB(0) CM(2)
Processing Advent Calendar 2012 10日目を担当することになりました、すつーかです。よろしくお願いします。
今回は「プロジェクトの紹介」を行いたいと思います。


事の発端は、コーディングまみれになりたいという事と、
すつーかがAndroidアプリとしてゲームをリリースしたかったという事にありました。

Androidアプリの作り方はいろいろあると思いますが、当時、王道と言いますか良く言われている開発環境がEclipse+AndroidSDKでした。

でもゲームプログラミングもままならない&Androidエミュ重い(最近は軽くなってきた?)やらAndroid絡みのエラー対処に追われ、RPG作りどころではありませんでした。


ゲームプログラミングの専門書を見てみるも、ソースコードの理解に追われまくり、これまた「コーディングまみれになりたい」といった欲求も満たされない始末。


「もう、全部自分の頭だけて考えて完成するような環境クレ・・・」






ということでProcessingでRPGのロジックを完成させるプロジェクトがスタート。

title.png





早く作りたい一心で、開発手法やら何やら気にせず作っていきました。

相方のプログラマと、ココこうしたら良いんじゃない?
だとか、随時クラス図書き換えたり、pde書き直したりして面白かったです。
一番面白かったのは、
初めは手続き型から、ある程度コードを描いたところでクラス別に作り直した所でした。




はじめに、チップを配置するスケッチを描きました


final int CHIP = 30;

void setup() {
size(480, 480);
}

void draw() {
for (int i = 0; i < 16; i++) {
for (int k = 0; k < 16; k++) {
rect(k * CHIP, i * CHIP, CHIP, CHIP);
}
}
}



次に、配列からマップ情報を取得するスケッチに改良しました


final int CHIP = 30;

int[][] map = {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};


void setup() {
size(480, 480);
}

void draw() {
for (int i = 0; i < 16; i++) {
for (int k = 0; k < 16; k++) {
if(map[i][k] == 1) fill(100);//map[y][x]であることに注意
if(map[i][k] == 0) fill(200);
rect(k * CHIP, i * CHIP, CHIP, CHIP);
}
}
}


柔軟性を持たせた



  • 縦、横のマス数を指定可能にした。

  • ウィンドウサイズ: マスの個数とCHIPサイズから自動計算。

    • →でも、マス数を固定にして、あとはピクセルを自動計算 ってのも良さそう


final int CHIP = 30;
int masu_x = 16;
int masu_y = 16;

int[][] map = {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};


void setup() {
size(CHIP * masu_x, CHIP * masu_y);
}

void draw() {
for (int i = 0; i < masu_y; i++) {
for (int k = 0; k < masu_x; k++) {
if(map[i][k] == 1) fill(100);//map[y][x]であることに注意
if(map[i][k] == 0) fill(200);
rect(k * CHIP, i * CHIP, CHIP, CHIP);
}
}
}


fill()メソッドをimage()に変更したバージョン.


  • しかし、これではswitch文みたくなってしまう・・・次!

    • final int CHIP = 30;
      int masu_x = 16;
      int masu_y = 16;

      int[][] map = {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
      };


      PImage kusa;
      PImage wall;
      PImage hero;
      //-------------------------------------------------------------------
      void setup() {
      size(CHIP * masu_x, CHIP * masu_y);
      kusa = loadImage("kusa.bmp");
      wall = loadImage("stone3.bmp");
      //hero = loadImage("heroD.bmp");
      }

      void draw() {
      for (int i = 0; i < masu_y; i++) {
      for (int k = 0; k < masu_x; k++) {
      //switch文のようになってしまい、コードが増えてしまう。
      if(map[i][k] == 1) image(wall, k * CHIP, i * CHIP, CHIP,CHIP);//map[y][x]であることに注意
      if(map[i][k] == 0) image(kusa, k * CHIP, i * CHIP, CHIP,CHIP);
      }
      }
      }





      switch文を配列一行で済ませるように改善した



      final int CHIP = 30;
      int masu_x = 16;
      int masu_y = 16;

      int[][] map = {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
      {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
      };


      String imgName[] = {"kusa", "stone3", "heroD"};//##随時ココに追加しなければならない・・・
      PImage img[] = new PImage[20];//##ここのサイズを指定しなければならない・・・
      //-------------------------------------------------------------------
      void setup() {
      size(CHIP * masu_x, CHIP * masu_y);
      for(int i = 0; i < imgName.length; i++){
      img[i] = loadImage(imgName[i] + ".bmp");
      }
      }

      void draw() {
      for (int i = 0; i < masu_y; i++) {
      for (int k = 0; k < masu_x; k++) {
      //switch文の問題点を解消。 一行で済ますことに成功.(switchの対応付けを配列の対応付けで済ませただけですね)
      image(img[map[i][k]], k * CHIP, i * CHIP, CHIP,CHIP);//map[y][x]であることに注意
      }
      }
      }


      他にも色々ソースコード公開したいのですが、自分ひとりで作ってる訳でもないので序盤のみの公開ということで。





      バージョン管理


      プログラマ2名、ドット絵師1名、BGM担当1名の計4人体制で製作中。
      最近は開発が止まってる。

      「バージョン管理には何使ってるの?」


      と言われると、

      _人人人人人人人人人人人_
      > フォルダです!!! <
       ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄


      versionfiled.png

      クラス図どうなってるの?


      と言われると、

      _人人人人人人人人人人_
      > 手書きです!!! <
       ̄^Y^Y^Y^Y^Y^Y^Y^Y^ ̄


      classByHand.jpg
      twitterで@ayato_pさんに「astash*つかえww」と言われる始末www



      相方のプログラマもサポートしてくれた



      • マップデータ作成ツール


      →CSVファイルに出力してくれる。width*heightも指定可能。塗りつぶし機能まで実装してくれた。

      tocsv.png



      ゲーム画面


      rpg1.png

      フラッドフィルも実装


      rpg2.png

      メニューウィンドウも。


      rpgMenu.png

      ファイル別にクラス分けてたらタブだらけになった


      rpgTab.png



      そんなこんなで、ある程度の簡単なゲームをリリースしていって、少しづつフレームワークとしてのクオリティを高めていこうと思っています。
      Androidに移植するのは来年になりそう・・・。
      2012/12/09 23:30 processing TB(0) CM(1)

検索フォーム
ブロとも申請フォーム
QRコード
QR
IPv4枯渇時計
linuxコマンド
ぶくろぐ
本棚です
icat
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。