PROCESSING入門

Processingの基礎を解説します。

カテゴリ: Processing ゲーム

game

ゲームつくろうと思っていたら最初の所で終わりました。

真ん中の丸を押すと、周りの丸が増えます。

 float x;
float theta;
float marux, maruy, maru;
int click, clickconst;
float rotate;
Maru[] maruarray;


void setup(){
  size(400,600);
  smooth();
  noStroke();
}

void draw(){
  background(0);
  fill(255);
  ellipse(width/2,height/2,100+x,100+x);
  theta=atan2(mouseX,mouseY);
  
  if(mousePressed&&
  mouseX>-50*cos(theta)+width/2&&mouseX<50*cos(theta)+width/2&&
  mouseY>-50*sin(theta)+height/2&&mouseY<50*cos(theta)+height/2){
    x=20;
    marux=mouseX;
    maruy=mouseY;
    click+=1;
    clickconst=click;
    clickconst=constrain(clickconst,0,80);
  }
  if(x>0){
    x-=3;
  }
  fill(0);
  textSize(10);
  text("click"+ click, width/2,height/2);
 
 reset(); 
 
 for(Maru maru:maruarray){
   maru.draw();
 }
}

void reset(){
  maruarray=new Maru[clickconst];
  for(int i=0; i<maruarray.length; i++){
    Maru maru = new Maru(i);
    maruarray[i]=maru;
  }
}

class Maru{
 float i;
 Maru(float i){
  this.i=i;
 }

void draw(){
 noStroke();
 fill(random(255),random(255),random(255));
 pushMatrix();
 translate(width/2,height/2);
 rotate(rotate);
 if(  
  100*cos(i)>-100*cos(theta)&&100*cos(i)<100*cos(theta)&&
  100*sin(i+rotate)>-100*sin(theta)&&100*sin(i+rotate)<100*cos(theta)){
    fill(255);
  }
 ellipse(100*cos(i),100*sin(i+rotate),3,3);
 ellipse(100*cos(i),100*sin(i-rotate),3,3);
 ellipse(200*cos(i+rotate),200*sin(i+rotate),3,3);
 rotate+=0.0005;
 popMatrix();
 
}

sikakugame


参考書を読みながら作成しました。
//-------------------------------------------
int sikakux=0;
int sikakuy=170;
int sikakuw=100;
int sikakuh=100;
int sikakutype=0;
final int notsikaku=50;//□でないものの確率
final int sikakuspeed=2;//□のスピード

String message="";
int messageFrame=0;//メッセージを表示する時間 

//初期設定-------------------------------------------
void setup(){
  size(640,480);
  reset();
}
//-------------------------------------------
void draw(){
  background(0);
  fill(200);
  rect(0,110,width,230);
  
  if(!stepUnit()){//stepUnitがtrueでないとき
    messageFrame=0;//メッセージを消す
    reset();//リセット関数を呼び出す。
  }
  
  drawsikaku();//□を描写
  drawtext();//点数を描写
}

//点数を描写する関数-------------------------------------------
void drawtext(){
  if(messageFrame>0){
    messageFrame--;//メッセージを表示する時間を短くしていく
    fill(255);
    textAlign(CENTER);
    textSize(30);
    text(message,sikakux+sikakuw/2,sikakuy+sikakuh+40);
  }
}
 
//マウスがクリックされた時-------------------------------------------
void mousePressed(){
  if(isHitMouse()){//isHitMouseがtrueの時
    messageFrame=60*2;
    if(sikakutype!=0){//sikakutypeが0でない時
      message="OK";
    }else{
      message="MISS";
    }
  }
}
//マウスがクリックされた時呼び出される-------------------------------------------
boolean isHitMouse(){
  return ( mouseX>sikakux&&mouseX<sikakux+sikakuw&&
           mouseY>sikakuy&&mouseY<sikakuy+sikakuh);
//マウスが□の範囲内ならばtrueを返す 
}
 
//□をリセットする-------------------------------------------
void reset(){
  if(random(100)<notsikaku)sikakutype=1;
  else sikakutype=0;
//50%の確率でsikakutype=1になる。 
  
  sikakux=-sikakuw;
//□の位置を元に戻す。

 
}
//□が画面内にあるか-------------------------------------------
boolean stepUnit(){
  sikakux+=sikakuspeed;
    return (sikakux<=width+sikakuw);
//□が画面より大きくなるとfalseを返す 
  }

//□を描写する-------------------------------------------
void drawsikaku(){
  fill(255);
  rect(sikakux,sikakuy,sikakuw,sikakuh);
  if(sikakutype!=0){//sikakutypeが0でないとき
    fill(0);
    line(sikakux+10,sikakuy,sikakux,sikakuy+sikakuh);
  }
}


 
ifとtrue,falseを合わせる使い方が勉強になりました。
 

rakka2

先ほどの落下ゲームProcessing:落下ゲームを改良しました。
クラスを用いて、20個のボールがランダムな位置から落下するようにしました。
スコアも表示するようにしました。
カラフルにもしました。
 
クラスで使用する変数(落下位置などに関係するもの)はクラス内で宣言しないと、プログラムが混乱してしまうことを学びました。
 差し支えないものだけが関数の外のグローバル変数として宣言するのですね。
 続きを読む

このページのトップヘ