2023年11月2日 星期四

week 08

 

WEEK 08


1.今天目標是做出像馬力歐似的遊戲,首先要先編出可以控制物件xy(模擬重力)的程式



2.透過拋物線測試重力加速的效果



3.讓物件判定地板以完成落地




3-1.模擬碰撞的反作用力,物體在落地後會減少反彈的能量,讓物件高度逐漸變低


相關程式碼:

if(y>350)

   {

      y=350; 

      vy=-vy*0.5;

      vx=vx*0.8;

   }


4.建立場景及玩家(馬力歐)本體,為背景及地板添加顏色並劃分好,給玩家一個物件以進行控制並給予顏色(紅色),但是一朝一個方向移動,玩家會無法停止前進,僅能直接改左右方向




5.讓玩家移動時可以停下,並增加跳躍的能力,但是跳躍會持續上升,無法下降

相關程式碼:
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; 
}


6.優化跳躍功能,讓跳躍會受重力影響而下降至落地


相關程式碼:

   if(flying)
   {
      marioY+=vy;
      vy+=0.98;
      if(marioY>=250)
      {
         marioY=250;
         flying=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;
   }
}


7.創建一個方塊,並給予其碰撞體積,讓玩家在跳躍撞到方塊時會有碰撞反應,但目前會穿模,不過會有撞到方塊的減速反應


相關程式碼:

   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-10<marioY && marioY<y+h) return true;
   else return false; 
}


8.優化碰撞體積問體,玩家可站立在方塊上,但是站上後直接左右移動會直接浮空移動,需再跳躍一次才會下落至地板


相關程式碼:

   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; 
}


9.將物件及方塊碰撞問體完全解決,現在玩家在方塊時移動不在會浮空,會正常落下及碰撞此方塊



完整程式碼:

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);
   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+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; 
}

10.方塊碰撞體積的另外寫法,可透過複製drawAndTestBox來增加箱子



完整程式碼【drawAndTestBox】:

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);
   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+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; 
}


































































沒有留言:

張貼留言