ゲームや日記を公開中。 --- a blog about games, life. my handle is 'd_of_i'.
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
最近弾幕シューティングというものに興味が出てきたので、
いろいろとシューティングのことを考えてます。

自分のシューティング暦は、
最後にやった市販モノがファミコンのグラディウスかツインビーで
あとはフリーのモノをちょろちょろっとやってる程度の浅いものなので
言ってることがおかしかったりするかもしれませんがご容赦ください。


今日は「簡単弾幕生成」のお話。

綺麗な幾何学模様を描く弾幕が流行りらしいです。

弾幕シューティングには多彩な弾幕が必要です。
その動きを一つ一つを手でプログラミングしてたら日が暮れます。

で、これが使えるのではないかと閃きました。
FumuFumu-Q:Supershapes
一つの方程式で色々な形を作ることが出来る、このSuperShape。
これで出来る形をそのまま初速度としてやればOK。
4つのパラメータを色々変えるだけで、無限のパターンの弾幕生成が可能となります。
方程式が元なので、なかなか幾何学的に美しい弾幕が生成されます。


という訳で、これのサンプルをproce55ingで作ってみました。
proce55ingは試作にも便利です。


ソースも公開してるので、使いたい方ご自由にどうぞ。

注意
・JavaAppletを有効にしてください。
操作方法
・画面内でクリックすると、パラメータがランダムに設定されなおされます。

 
 
Built with Processing

以下proce55ingソースコード

class Vec{
  float x,y;
  Vec(float a,float b){ x=a; y=b; }
}

void supershape(float m,float n1,float n2,float n3,float phi,Vec out){
   float t1 = pow(abs(cos(m * phi * 0.25)),n2);
   float t2 = pow(abs(sin(m * phi * 0.25)),n3);
   float r = pow(t1+t2,1/n1);
   if (abs(r) == 0) {
      out.x=0;
      out.y=0;
   } else {
      r = 1 / r;
      out.x=r * cos(phi);
      out.y=r * sin(phi);
   }
}

class Bullets{
  class Unit{
    Vec pos,vel;
    Unit(){
      pos=new Vec(0,0);
      vel=new Vec(0,0);
    }
  }
  Unit[] units=new Unit[2048];
  int used=0;
  
  Bullets(){
    for(int i=0; i<units.length; ++i){
      units[i]=new Unit();
    }
  }
  
  void put(float posx,float posy,float velx,float vely){
    if(used==units.length)
      return;
    Unit u=units[used];
    u.pos.x=posx;
    u.pos.y=posy;
    u.vel.x=velx;
    u.vel.y=vely;
     
    used++;
  }
  
  void erase(int i){
    if(used<=1){
      used=0;
      return;
    }
    Unit temp=units[i];
    units[i]=units[used-1];
    units[used-1]=temp;
    used--;
  }
  
  void draw(){
    fill(255,255,255);
    stroke(0,0,0);
    ellipseMode(CENTER_DIAMETER);
    for(int i=0; i<used; i++){
      Unit u=units[i];
      u.pos.x+=u.vel.x;
      u.pos.y+=u.vel.y;
      ellipse(u.pos.x,u.pos.y,8,8);
      if(u.pos.x<0 || u.pos.x>width || u.pos.y<0 || u.pos.y>height){
        erase(i);
        --i;
      }
      float dx=mouseX-u.pos.x;
      float dy=mouseY-u.pos.y;
      float len=sqrt(dx*dx+dy*dy);
      if(len<8){
        u.pos.x-=dx/(len*len)*10;
        u.pos.y-=dy/(len*len)*10;
      }
    }
  }
}

Bullets bullets=new Bullets();

int interval=50;
int NUM=64;
float m=5;
float n1=0.6;
float n2=1;
float n3=0.5;
float rotvel=0;
float rot=0;

void mousePressed(){
  interval=(int)random(2,50);
  NUM=(int)random(10,100);
  m=random(2,64);
  n1=random(0.1,16.0);
  n2=random(0.1,16.0);
  n3=random(0.1,16.0);
  rotvel=random(-PI,PI);
}

void gene(float x,float y){
  rot+=rotvel;
  if(rot>PI)
    rot-=PI*2;
  if(rot<-PI)
    rot+=PI*2;
  Vec v=new Vec(0,0);
  for(int i=0; i<NUM; ++i){
    supershape(m,n1,n2,n3,PI*2/NUM*i,v);
    bullets.put(x,y,cos(rot)*v.x-sin(rot)*v.y,sin(rot)*v.x+cos(rot)*v.y);
  }
}

void setup(){
  size(300,400);
  framerate(50);
  
  noSmooth();
  
  mousePressed();
}

int framecount=0;
void loop(){
  framecount++;
  background(80,80,80);
  
  if(framecount % interval == 0){
    gene(width/2,100);
  }
  
  fill(255,0,0);
  ellipse(mouseX,mouseY,8,8);
  
  bullets.draw();
}


スポンサーサイト





コメント
いいこと教えてもらった感じです。
2005/07/10(日) 08:52 | URL | dotimpact #PdRQ2K06[ 編集]
割と綺麗な弾幕が出来て、自分も驚いてます。
これを生かしたゲームが出来ないか思案中です。
そして遅延を生かしたゲームも考えてますです。
2005/07/10(日) 23:29 | URL | d_of_i #-[ 編集]
これはゲームの応用もできそうですが、
これの弾幕を見たあとに周囲を見ると歪むことが判明しました。
2005/08/10(水) 21:50 | URL | ナナシ #-[ 編集]
開発中、自分も何度も味わいました。

錯覚モノとして公開した方がよかったかな。
2005/08/11(木) 00:17 | URL | d_of_i #-[ 編集]
ずっと見ていたらとなりのアマゾンの広告がゆがんで見えましたw
2005/10/10(月) 10:41 | URL | ゴン #-[ 編集]
これでスクリーンセーバーとかにしたら楽しそう。
2005/10/10(月) 15:33 | URL | kof #-[ 編集]
このコメントは管理者の承認待ちです
2006/01/01(日) 13:19 | | #[ 編集]
シューティング系にしてたらおもしろそう
2006/02/19(日) 01:34 | URL | うい #-[ 編集]
このコメントは管理者の承認待ちです
2009/08/08(土) 14:22 | | #[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
:
 
Trackback
この記事のトラックバックURL
http://ishi.blog2.fc2.com/tb.php/127-5b9bbe0a
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。