2023年11月2日 星期四

UU_week08

2023/11/02 螢幕擷取畫面 2023-11-02 134814.png

碰撞偵測 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; }

牛頓力學 (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); }

image.png image.png

能量耗損

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

image.png image.png
image.png image.png

Mario Jump image.png 2023-11-02 13-41-32.gif

移動與跳躍

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

2023-11-02 14-12-01.gif

建立一個方塊, 碰撞偵測(下邊界)

// 碰撞偵測: 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; }

2023-11-02 14-38-22.gif

修改殘影+上邊界(可以站在方塊上)

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

螢幕擷取畫面 2023-11-02 151102.png 2023-11-02 15-06-16.gif

修改離開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; }

螢幕擷取畫面 2023-11-02 152029.png 2023-11-02 15-22-06.gif

沒有留言:

張貼留言