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;
}
沒有留言:
張貼留言