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











沒有留言:
張貼留言