2023年11月2日 星期四

於 week08

week08

第一步  解決牛頓力學

靜者恆靜,動者恆動
void setup(){
  size(400,400);
}
float x=200, y=200, vx=1, vy=1;
void draw(){
  ellipse(x,y,10,10);
  x += vx;
  y += vy;
}


第二步  加上重力加速度

f=m*a 位置、速度、加速度

void setup(){
  size(400,400);
}
float x=50, y=250, vx=2, vy=-20;
void draw(){
  ellipse(x,y,10,10);
  x += vx;
  y += vy;
  vy += 0.98; // 重力加速度
}


第三步  碰撞偵測

利用if判斷,看有沒有碰到地板

void setup(){
  size(400,400);
}
float x=50, y=250, vx=2, vy=-20;
void draw(){
  x += vx;
  y += vy;
  vy += 0.98;
  if(y>350){ // 看有沒有到地板 y=350位置
  y=350;
  }
  ellipse(x,y,10,10);
}


第四步  如何反彈

會消耗,越彈越低

void setup(){
  size(400,400);
}
float x=50, y=250, vx=2, vy=-20;
void draw(){
  x += vx;
  y += vy;
  vy += 0.98;
  if(y>350){
  y=350;
  vy = -vy * 0.5; //能量耗損、速度變慢
  vx = vx * 0.8;
  }
  ellipse(x,y,10,10);
}


第五步  增加背景、左右移動

按鍵盤左右鍵會往左右移動

void setup(){
  size(400,400);
}
float marioX=50, marioY=250, vx=0,vy=0;

void draw(){
  background(108,137,255);
  marioX += vx;
  fill(255,0,0); ellipse(marioX,marioY,15,25);
  fill(229,119,42); rect(0,260,400,150);
  }

void keyPressed(){
  if(keyCode==RIGHT) vx = 2;
  if(keyCode==LEFT) vx = -2;
}


第六步  左右上鍵移動

放開左右鍵會停止 按上鍵會飛走

void setup(){
  size(400,400);
}
float marioX=50, marioY=250, vx=0,vy=0;

void draw(){
  background(108,137,255);
  marioX += vx;
  marioY += vy; // 上下位置改變
  fill(255,0,0); ellipse(marioX,marioY,15,25);
  fill(229,119,42); rect(0,260,400,150);
  }

void keyPressed(){
  if(keyCode==RIGHT) vx = 2;
  if(keyCode==LEFT) vx = -2;
  if(keyCode==UP) vy = -20;
  
}

void keyReleased(){
  if(keyCode==LEFT || keyCode==RIGHT) vx = 0;
}


第七步  飛行有重力

有重力加速度碰到地板會停止

void setup(){
  size(400,400);
}
float marioX=50, marioY=250, vx=0,vy=0;

void draw(){
  background(108,137,255);
  marioX += vx;
  if(flying){ //如果在飛行中
    marioY += vy; 
    vy += 0.98; // 重力加速度往下 
    if(marioY >= 250){ // 碰到地板
      marioY = 250; // 站在地板上
      flying = false; // 不再飛行
    }
  }
  fill(255,0,0); ellipse(marioX,marioY,15,25);
  fill(229,119,42); rect(0,260,400,150);
  }
boolean flying = false; // 一開始沒有在飛
void keyPressed(){
  if(keyCode==RIGHT) vx = 2;
  if(keyCode==LEFT) vx = -2;
  if(keyCode==UP && flying==false) { //如果沒有在飛,才能飛
    vy = -20;
    flying = true; // 開始飛行
  }
}

void keyReleased(){
  if(keyCode==LEFT || keyCode==RIGHT) vx = 0;
}


第八步 碰到方塊會被卡住

增加一個方塊,當球球碰到不會穿透
..........
  fill(255,0,0); ellipse(marioX,marioY,15,25);
  fill(229,119,42); rect(0,260,400,150);
  fill(229,119,42); rect(200,150,20,20);
  if(hitBox(200,150,20,20)){
    vy=0;
    marioY = 150+20;
  }
}
boolean hitBox(int x, int y, int w, int h){
  if(x<marioX && marioX<x+w && y<marioY && marioY<y+h) return true;
  else return false;
}
boolean flying = false;
........


第九步 停在方格上

讓球球停在方格上面不會掉下去

............
 fill(255,0,0); ellipse(marioX,marioY,15,25);
  fill(229,119,42); rect(0,260,400,150);
  fill(229,119,42); rect(200,150,20,20);
  if(hitBox(200,150,20,20)){
    if(vy>0){
      marioY = 150-10;
      flying = false;
    }
    else{
    vy=0;
    marioY = 150+20+10;
    }
  }
}
boolean hitBox(int x, int y, int w, int h){
  if(x-7<marioX && marioX<x+w+7 && y-10<marioY && marioY<y+h+1) return true;
  else return false;
}
boolean flying = false;
...........

第十步 讓球下去

讓球球從方格上掉到地上

...........
fill(229,119,42); rect(200,150,20,20);
  if(hitBox(200,150,20,20)){
    if(vy>0){
      marioY = 150-10;
      flying = false;
      stand_box = true;
    }
    else{
    vy=0;
    marioY = 150+20+10;
    }
  }
  if(stand_box==true && flying==false && leaveBox(200,150,20,20)){
    stand_box = false;
    flying = true;
    vy=0;
  }
}
boolean leaveBox(int x, int y, int w, int h){
  if(x-7>marioX ||marioX>x+w+7) return true;
  else return false;
}
boolean hitBox(int x, int y, int w, int h){
  if(x-7<marioX && marioX<x+w+7 && y-10<marioY && marioY<y+h+1) return true;
  else return false;
}
boolean flying = false, stand_box = false;
..........


第十一步 另一個版本

好多方塊

...........
  fill(255,0,0); ellipse(marioX,marioY,15,25);
  fill(229,119,42); rect(0,260,400,150);
  drawAndTestBox(200,150,20,20);
}
void drawAndTestBox(int x, int y, int w, int h){
    fill(229,119,42); rect(x,y,w,h);
  if(hitBox(x,y,w,h)){
    if(vy>0){
      marioY = y-10;
      flying = false;
      stand_box = true;
    }
    else{
    vy=0;
    marioY = y+h+10;
    }
  }
  if(stand_box==true && flying==false && leaveBox(x,y,w,h)){
    stand_box = false;
    flying = true;
    vy=0;
  }
}
boolean leaveBox(int x, int y, int w, int h){
  if(x-7>marioX ||marioX>x+w+7) return true;
  else return false;
}
boolean hitBox(int x, int y, int w, int h){
  if(x-7<marioX && marioX<x+w+7 && y-10<marioY && marioY<y+h+1) return true;
  else return false;
}
boolean flying = false, stand_box = false;
void keyPressed(){
  if(keyCode==RIGHT) vx = 2;
  if(keyCode==LEFT) vx = -2;
  if(keyCode==UP && flying==false) {
    vy = -20;
    flying = true;
    
  }
}
.........







































沒有留言:

張貼留言