2023年11月2日 星期四

小凱 Week08

第一節課

今天要試試看在processing裡用碰撞偵測(馬力歐&皮卡丘打排球)。
week08-1
寫一個程式讓小球往右下角走(先沒有碰撞)。

week08-2
加上一個重力加速度(一開始初速度往上,重力往下)。

week08-3(碰撞偵測)
用if判斷範圍,超過就設成指定的參數(看有沒有到指定的位置)。
//牛頓力學(1)靜者恆靜、動者恆動(2)f=ma、位置、速度、加速度
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; 
 }
 ellipse(x,y,10,10); 
}

加上能量耗損(速度變慢)。

week08-4(mario左右)
寫程式讓馬力歐可以透過鍵盤左右移動(還不能停下來,也還沒設定跳躍)。
//牛頓力學(1)靜者恆靜、動者恆動(2)f=ma、位置、速度、加速度
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,10,20);
  fill(229,119,42); rect(0,260,400,150);
}
void keyPressed(){
  if(keyCode==RIGHT) vx=2;
  if(keyCode==LEFT) vx=-2;
}


第二節課

week08-5讓馬力歐停下來(左右),加上往上的跳躍(會一直往上飛)。
//牛頓力學(1)靜者恆靜、動者恆動(2)f=ma、位置、速度、加速度
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,10,20);
  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; 
}

week08-6設定跳躍(讓它不會一直飛,會往下掉)。
//牛頓力學(1)靜者恆靜、動者恆動(2)f=ma、位置、速度、加速度
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,10,20);
  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){
  vy=-20;
  flying=true;
  }
}
void keyReleased(){
 if(keyCode==LEFT||keyCode==RIGHT) vx=0; 
}

會發現連按上會一直往上跳(加上flying==false)

week08-7(撞方塊),加上方塊跟碰撞函式。
//牛頓力學(1)靜者恆靜、動者恆動(2)f=ma、位置、速度、加速度
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,10,20);
  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;
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-8(用vy的方向決定stand跟fall)。
//牛頓力學(1)靜者恆靜、動者恆動(2)f=ma、位置、速度、加速度
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,10,20);
  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){
    vy=0; 
    marioY=150;
    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; 
}
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-9判斷碰撞方塊(站在方塊上移動要掉下來)
//牛頓力學(1)靜者恆靜、動者恆動(2)f=ma、位置、速度、加速度
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,10,20);
  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){
    vy=0; 
    marioY=150;
    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-a(改成隨機參數)
//牛頓力學(1)靜者恆靜、動者恆動(2)f=ma、位置、速度、加速度
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,10,20);
  fill(229,119,42); rect(0,260,400,150);
  drawTestBox(200,150,20,20);
  drawTestBox(100,150,20,20);
  drawTestBox(300,150,20,20);
}
void drawTestBox(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+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;
  stand_box=false;
  }
}
void keyReleased(){
 if(keyCode==LEFT||keyCode==RIGHT) vx=0; 
}


沒有留言:

張貼留言