2023年11月2日 星期四

KZNK Week08 MARIO

   Week08-1  NEWTON1

開啟processing,輸入以下程式碼
//碰撞偵測: Mario vs. Pikachu
//牛頓力學 (1)靜者恆靜、動者恆動
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;
}
命名week08_01_newton_vx_vy
球往右下跑





















   Week08-2  NEWTON2 F=MA

開啟processing,輸入以下程式碼
//碰撞偵測: Mario vs. Pikachu
//牛頓力學 (1)靜者恆靜、動者恆動(2)f=ma位置 速度 加速度
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; //重力加速度
}
命名week08_02_newton_gravity
加速度來製造拋物線




















   Week08-3  NEWTON3 FLOOR

開啟processing,輸入以下程式碼
//碰撞偵測: Mario vs. Pikachu
//牛頓力學 (1)靜者恆靜、動者恆動(2)f=ma位置 速度 加速度
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(y>350){//利用if判斷有沒有碰到地板
  y=350;
  vy=-vy*0.5; //能量耗損 速度變慢
  vx= vx*0.8;
  }
}
命名week08_03_newton_floor
設Y來製造地板
還有能量耗損




















 Week08-4  MARIO1

開啟processing,輸入以下程式碼
//碰撞偵測: Mario vs. Pikachu
//牛頓力學 (1)靜者恆靜、動者恆動(2)f=ma位置 速度 加速度
void setup(){
  size(400,400);
}
float marioX=50,marioY=250,vx=2,vy=-20;
void draw(){
  background(108,137,255);
  marioX += vx;
  fill(255,0,0); ellipse(marioX,marioY,15,20);
  fill(299,119,42); rect(0,260,400,150);
}
void keyPressed(){
  if(keyCode==RIGHT) vx= 2;
  if(keyCode==LEFT) vx= -2; 
}
命名week08_04_mario_keyCode_UP_RIGHT_LEFT
小人可以左右控制但不會停下來





















 Week08-5 MARIO2

開啟processing,輸入以下程式碼
//碰撞偵測: Mario vs. Pikachu
void setup(){
  size(400,400);
}
float marioX=50,marioY=250,vx=0,vy=0;
void draw(){
  background(108,137,255);
  marioX += vx;
  marioY += vy; //vy+=0.98;
  fill(255,0,0); ellipse(marioX,marioY,15,20);
  fill(299,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;
}
命名week08_05_mario_keyReleased
左右可以停下控制 但上會直接飛走






















 Week08-6 MARIO3 FLYING

開啟processing,輸入以下程式碼
//碰撞偵測: Mario vs. Pikachu
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,20);
  fill(299,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;
}
命名week08_06_mario_flying_vy098
flying來控制UP鍵的飛行






















 Week08-7 MARIO4 HITBOX

開啟processing,輸入以下程式碼
//碰撞偵測: Mario vs. Pikachu
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,20);
  fill(299,119,42); rect(0,260,400,150);
  fill(299,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; //一開始沒有在飛
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;
}
命名week08_07_mario_hitbox_if
用hitBox來做碰撞測試 如果碰到BOX就掉下來























 Week08-8 MARIO5 ONBOX

開啟processing,更改以下程式碼
  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+10) return true;
  else return false;
} 
命名week08_08_mario_diretion_stand_fall
可以站在BOX上,但掉不下來






















 Week08-9 MARIO6

開啟processing,輸入以下程式碼
//碰撞偵測: Mario vs. Pikachu
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,20);
  fill(299,119,42); rect(0,260,400,150);
  fill(299,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+10) 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; //開始飛行
  }
}
void keyReleased(){   //放開鍵盤
  if(keyCode==LEFT || keyCode==RIGHT) vx= 0;
}
命名week08_09_mario_fallbox
可以從BOX掉下來






















 Week08-10 MARIO7

開啟processing,輸入以下程式碼
命名week08_10_mario_twobox
製作多個BOX

沒有留言:

張貼留言