2021年11月22日 星期一

ᐇ Week11

Week11

上課內容為類似接金筆互動,先產生球並給y方向速度下落,之後產生兩個,用for和array產生多個球,加上if判斷調整vy方向,碰撞判斷和boolean的true和false值,陣列變數和大小,random隨機亂數,class物件導向,加速度,特訓99

1.產生圓並按一定速度落下
在x,y位置產生圓並給速度vy

float x=250,y=0,vx=0,vy=3;
void setup(){
  size(500,600);
}
void draw(){
  background(255);
  ellipse(x,y,50,50);
  //y++;
  //y=y+3;
  y=y+vy;//vy是速度
}
2.產生兩個圓並按一定速度落下
增加x2,y2,vx2,vy2變數,有兩個球出現

float x=250,y=0,vx=0,vy=3;
float x2=150,y2=50,vx2=0,vy2=2;
void setup(){
  size(500,600);
}
void draw(){
  background(255);
  ellipse(x,y,50,50);
  ellipse(x2,y2,50,50);
  y=y+vy;
  y2=y2+vy2;
}
3.用for和陣列產生多個圓並落下
陣列產生多個值 

float []x={250,150,350,300};
float []y={0,50,80,100};
float []vx={0,0,0,0};
float []vy={3,2,2.5,4};
void setup(){
  size(500,600);
}
void draw(){
  background(255);
  for(int i=0;i<4;i++){
    ellipse(x[i],y[i],50,50);
    y[i]=y[i]+vy[i];
  }
}
4.加上互動使球來回碰撞
只能在y為0-600的範圍移動

if(y[i]>600) vy[i]=-vy[i];//碰到下方
if(y[i]<0) vy[i]=-vy[i];//接到上方
5.判斷碰撞
用dist距離判斷是否碰撞

float []x={250,150,350,300};
float []y={0,50,80,100};
float []vx={0,0,0,0};
float []vy={3,2,2.5,4};
void setup(){
  size(500,600);
}
void draw(){
  background(255);
  for(int i=0;i<4;i++){
    fill(255,255,0); ellipse(x[i],y[i],50,50);
    if(dist(mouseX,mouseY,x[i],y[i])<=50){//判斷碰撞
      continue;
    }
    y[i]=y[i]+vy[i];
    if(y[i]>600) vy[i]=-vy[i];//碰到下方
    if(y[i]<0) vy[i]=-vy[i];//接到上方
  }
  fill(255,0,0); ellipse(mouseX,mouseY,50,50);
}
6.boolean陣列
用boolean的false和true值調整球的存活狀態

float []x={250,150,350,300};
float []y={0,50,80,100};
float []vx={0,0,0,0};
float []vy={3,2,2.5,4};
boolean []dead={false,false,false,false,false};//false=0,true=1
void setup(){
  size(500,600);
}
void draw(){
  background(255);
  for(int i=0;i<4;i++){
    if(dist(mouseX,mouseY,x[i],y[i])<=50){//判斷碰撞
      dead[i]=true;//碰到就沒了
    }
    if(dead[i]==true) continue;//死了換下一個
    fill(255,255,0); ellipse(x[i],y[i],50,50);//沒死畫它
    y[i]=y[i]+vy[i];
    if(y[i]>600) vy[i]=-vy[i];//碰到下方
    if(y[i]<0) vy[i]=-vy[i];//接到上方
  }
  fill(255,0,0); ellipse(mouseX,mouseY,50,50);
}
7.boolean解釋練習
boolean的false為不成立,true為成立

boolean down=true;//按下
void setup(){
  size(500,300);
}
void draw(){
  if(mousePressed) down=true;
  else down=false;
  print(down);
  if(down) background(255,0,0);//紅色
  else background(0,255,0);//綠色
}
8.陣列大小和random亂數
產生更多球和隨即生成亂數

float []x;//宣告陣列變數
float []y;
float []vy;
boolean []dead;
int N=20;
void setup(){
  size(500,600);
  x=new float[N];//決定陣列大小
  y=new float[N];
  vy=new float[N];
  dead=new boolean[N];
  for(int i=0;i<N;i++){
    x[i]=random(500);//500以下亂數
    y[i]=random(100,200);
    vy[i]=random(3,4);//3,4中間亂數
    dead[i]=false;//沒有死掉
  }
}
void draw(){
  background(255);
  for(int i=0;i<N;i++){
    if(dist(mouseX,mouseY,x[i],y[i])<=50){//判斷碰撞
      dead[i]=true;//碰到就沒了
    }
    if(dead[i]==true) continue;//死了換下一個
    fill(255,255,0); ellipse(x[i],y[i],50,50);//沒死畫它
    y[i]=y[i]+vy[i];
    if(y[i]>600) vy[i]=-vy[i];//碰到下方
    if(y[i]<0) vy[i]=-vy[i];//接到上方
  }
  fill(255,0,0); ellipse(mouseX,mouseY,50,50);
}
9.class物件導向
主程式碼更短

class Ball{//發明Ball物件
  float x,y,vx,vy;
  boolean dead;
  Ball(){//建構同名
  x=random(500);
  y=random(100,200);
  vy=random(3,4);
  dead=false;
  }
  void draw(){
  if(dead==true) return;//離開函式
  ellipse(x,y,50,50);
  if(dist(mouseX,mouseY,x,y)<50){
    dead=true;
  }
  y=y+vy;
  if(y>500) vy=-vy;
  if(y<0) vy=-vy;
  }
}
Ball []balls;
void setup(){
  size(500,500);
  balls=new Ball[20];
  for(int i=0;i<20;i++){
    balls[i]=new Ball();
  }
}
void draw(){
  background(255);
  for(int i=0;i<20;i++){
    balls[i].draw();
  }
}
10.加入vx變數
增加x方向的速度

class Ball{//發明Ball物件
  float x,y,vx,vy;
  boolean dead;
  Ball(){//建構同名
  x=random(500);
  y=random(500);
  vy=random(-4,4);
  vx=random(-4,4);
  dead=false;
  }
  void draw(){
  if(dead==true) return;
  ellipse(x,y,50,50);
  if(dist(mouseX,mouseY,x,y)<50){
    dead=true;
  }
  x=x+vx;
  y=y+vy;
  if(y>500 || y<0) vy=-vy;
  if(x>500 || x<0) vx=-vx;
  }
}
11.加上重力

vy+=0.98;
12.特訓99
用以下程式碼做出簡單的特訓99游戲

class Ball{//發明Ball物件
  float x,y,vx,vy;
  boolean dead;
  Ball(){//建構同名
  reborn();
  }
  void reborn(){
    x=random(500);
    y=random(500);
    vy=random(-2,2);
    vx=random(-2,2);
    dead=false;
  }
  void draw(){
  if(dead==true) return;
  fill(255,0,0); ellipse(x,y,5,5);
  if(dist(mouseX,mouseY,x,y)<5){
    dead=true;
    gameOver=true;
  }
  x=x+vx;
  y=y+vy;
  if(y>500 || y<0) reborn();
  if(x>500 || x<0) reborn();
  }
}
Ball []balls;
void setup(){
  size(500,500);
  balls=new Ball[99];
  for(int i=0;i<99;i++){
    balls[i]=new Ball();
  }
}
boolean gameOver=false;
void draw(){
  background(0);
  for(int i=0;i<99;i++){
    balls[i].draw();
  }
  if(gameOver) background(255,0,0);
  
}






沒有留言:

張貼留言