2023/11/02 
碰撞偵測 Mario v.s. Pikachu
牛頓力學 (1)靜者恆靜、動者恆動
// 碰撞偵測 Mario v.s. 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;
}
// 碰撞偵測 Mario v.s. 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;
}
牛頓力學 (2)f=m*a 位置、速度、加速度
// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)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; // 重力加速度
}
// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)f=m*a 位置、速度、加速度
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){ // 利用if判斷, 看有沒有碰到地板y=350的位置
y=350;
}
ellipse(x, y, 10, 10);
}
// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)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; // 重力加速度
}
// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)f=m*a 位置、速度、加速度
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){ // 利用if判斷, 看有沒有碰到地板y=350的位置
y=350;
}
ellipse(x, y, 10, 10);
}

能量耗損
vy = -vy * 0.7; 會耗損、速度變慢vx = vx * 0.8; 摩擦力
// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)f=m*a 位置、速度、加速度
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){ // 利用if判斷, 看有沒有碰到地板y=350的位置
y=350;
vy = -vy * 0.5; // 會耗損、速度變慢
vx = vx * 0.8;
}
ellipse(x, y, 10, 10);
}
vy = -vy * 0.7; 會耗損、速度變慢vx = vx * 0.8; 摩擦力// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)f=m*a 位置、速度、加速度
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){ // 利用if判斷, 看有沒有碰到地板y=350的位置
y=350;
vy = -vy * 0.5; // 會耗損、速度變慢
vx = vx * 0.8;
}
ellipse(x, y, 10, 10);
}


Mario Jump

移動與跳躍
用void keyPressed()&void keyReleased()準備左右移動vy += 0.98處理UP後重力加速度的跳躍動作
void setup()
{
size(400, 400);
}
float MarioX=50, MarioY=250, vx=0, vy=0;
void draw()
{
background(108, 137, 255); // blue
MarioX += vx;
MarioY += vy;
// vy += 0.98;
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;
}
建立新的布林值flying來偵測是否跳起來
boolean flying = false;
void setup()
{
size(400, 400);
}
float MarioX=50, MarioY=250, vx=0, vy=0;
void draw()
{
background(108, 137, 255); // blue
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) { // 按下UP
vy = -20;
flying = true; // 開始跳
}
}
void keyReleased()
{
if (keyCode == LEFT || keyCode == RIGHT) vx = 0;
}

建立一個方塊, 碰撞偵測(下邊界)
// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)f=m*a 位置、速度、加速度
void setup()
{
size(400, 400);
}
float MarioX=50, MarioY=250, vx=0, vy=0;
void draw()
{
background(108, 137, 255); // blue
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 (hitBlock(200, 150, 20, 20)){
vy=0;
MarioY = 150+20;
}
}
boolean hitBlock(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) { // 按下UP
vy = -20;
flying = true; // 開始跳
}
}
void keyReleased()
{
if (keyCode == LEFT || keyCode == RIGHT) vx = 0;
}
// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)f=m*a 位置、速度、加速度
void setup()
{
size(400, 400);
}
float MarioX=50, MarioY=250, vx=0, vy=0;
void draw()
{
background(108, 137, 255); // blue
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 (hitBlock(200, 150, 20, 20)){
vy=0;
MarioY = 150+20;
}
}
boolean hitBlock(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) { // 按下UP
vy = -20;
flying = true; // 開始跳
}
}
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); // blue
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 (hitBlock(200, 150, 20, 20)){
if (vy>0){
MarioY = 150-10; // 在block上方
flying = false;
}else{ // block下方
vy=0;
MarioY = 150+20+10;
}
}
}
boolean hitBlock(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) { // 按下UP
vy = -20;
flying = true; // 開始跳
}
}
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); // blue
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 (hitBlock(200, 150, 20, 20)){
if (vy>0){
MarioY = 150-10; // 在block上方
flying = false;
}else{ // block下方
vy=0;
MarioY = 150+20+10;
}
}
}
boolean hitBlock(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) { // 按下UP
vy = -20;
flying = true; // 開始跳
}
}
void keyReleased()
{
if (keyCode == LEFT || keyCode == RIGHT) vx = 0;
}

修改離開block後的bug, 使其可以站上磚塊與掉下磚塊
// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)f=m*a 位置、速度、加速度
void setup()
{
size(400, 400);
}
float MarioX=50, MarioY=250, vx=0, vy=0;
void draw()
{
background(108, 137, 255); // blue
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 (hitBlock(200, 150, 20, 20)){
if (vy>0){
MarioY = 150-10; // 在block上方
flying = false;
stand_block = true;
}else{ // block下方
vy=0;
MarioY = 150+20+10;
}
}
if (stand_block == true && flying == false && leaveBlock(200, 150, 20, 20)){
stand_block = false;
flying = true;
vy=0;
}
}
boolean leaveBlock(int x, int y, int w, int h)
{
if (x-7>MarioX || MarioX>x+w+7) return true;
else return false;
}
boolean hitBlock(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_block = false;
void keyPressed()
{
if (keyCode == RIGHT) vx=2;
if (keyCode == LEFT) vx=-2;
if (keyCode == UP && flying==false) { // 按下UP
vy = -20;
flying = true; // 開始跳
}
}
void keyReleased()
{
if (keyCode == LEFT || keyCode == RIGHT) vx = 0;
}
// 碰撞偵測: Mario v.s. Pikachu
// 牛頓力學 (1)靜者恆靜、動者恆動
// (2)f=m*a 位置、速度、加速度
void setup()
{
size(400, 400);
}
float MarioX=50, MarioY=250, vx=0, vy=0;
void draw()
{
background(108, 137, 255); // blue
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 (hitBlock(200, 150, 20, 20)){
if (vy>0){
MarioY = 150-10; // 在block上方
flying = false;
stand_block = true;
}else{ // block下方
vy=0;
MarioY = 150+20+10;
}
}
if (stand_block == true && flying == false && leaveBlock(200, 150, 20, 20)){
stand_block = false;
flying = true;
vy=0;
}
}
boolean leaveBlock(int x, int y, int w, int h)
{
if (x-7>MarioX || MarioX>x+w+7) return true;
else return false;
}
boolean hitBlock(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_block = false;
void keyPressed()
{
if (keyCode == RIGHT) vx=2;
if (keyCode == LEFT) vx=-2;
if (keyCode == UP && flying==false) { // 按下UP
vy = -20;
flying = true; // 開始跳
}
}
void keyReleased()
{
if (keyCode == LEFT || keyCode == RIGHT) vx = 0;
}

沒有留言:
張貼留言