2024年10月21日 星期一

BK Week07 ArrasGame

 Processing 程式碼

畫出砲塔 砲管 跟 引導線
void setup(){
   size(500, 400);
}
float x = 250, y = 200;
void draw(){
    background(245, 184, 200);
    fill(204, 102, 156);
    stroke(125, 84, 105);
    strokeWeight(3);
    ellipse(x, y, 55, 55); //砲塔
    
    fill(167, 167, 175);
    stroke(110, 110, 113);
    strokeWeight(3);
    rect(240, 160, 20, 20); //砲管
    
    line(x, y, mouseX, mouseY); //引導線
}


利用 atan sin cot 畫出一條很粗的線 可以跟著滑鼠游標的(x,y)旋轉
void setup() {
  size(500, 400);
}
float x = 250, y = 200;
void draw() {
  background(245, 184, 200);
  float dx = mouseX - x, dy = mouseY - y;
  float a = atan2(dy, dx);
  strokeWeight(20); //很粗的一條線, 長度是40
  line(x, y, x+cos(a)*50, y+sin(a)*50); //cos()算出x方向, sin()算出y方向

  fill(204, 102, 156);
  stroke(125, 84, 105);
  strokeWeight(3);
  ellipse(x, y, 55, 55); //砲塔

  fill(167, 167, 175);
  stroke(110, 110, 113);
  strokeWeight(3);
  rect(240, 160, 20, 20); //砲管
}


宣告一個 myTank 函式 把剛剛的程式碼整合進去 完成砲台的部分
void setup() {
  size(500, 400);
}
float x = 250, y = 200;
void draw() {
  background(215, 184, 200);
  float dx = mouseX - x, dy = mouseY - y;
  float a = atan2(dy, dx); // atan2() 算出角度
  line(x, y, mouseX, mouseY);
  myTank(x, y, a);
}
void myTank(float x, float y, float a) {
  translate(x, y); //大二下圖學課教的移動
  rotate(a); //大二下圖學課教的旋轉
  fill(167, 167, 175);
  stroke(110, 110, 113);
  strokeWeight(4);
  rect(20, -10, 20, 20); //砲管
  
  fill(204, 102, 156);
  stroke(125, 84, 105);
  strokeWeight(3);
  ellipse(0, 0, 55, 55); //砲塔

  
}


畫出 灰底+灰線背景 加上 keyPressed 當按上下左右鍵可以移動砲台
void setup() {
  size(500, 400);
}
void keyPressed() {
  if (keyCode==RIGHT) x += 1;
  if (keyCode==LEFT) x -= 1;
  if (keyCode==UP) y -= 1;
  if (keyCode==DOWN) y += 1;
}
float x = 250, y = 200;
void draw() {
  background(219); //灰底
  stroke(210); //灰底的線
  for (int i=0; i<30; i++) {
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }

  //background(215, 184, 200); //紅底
  //stroke(211, 180, 196); //紅底的線
  float dx = mouseX - x, dy = mouseY - y;
  float a = atan2(dy, dx); // atan2() 算出角度
  line(x, y, mouseX, mouseY);
  myTank(x, y, a);
}
void myTank(float x, float y, float a) {
  translate(x, y); //大二下圖學課教的移動
  rotate(a); //大二下圖學課教的旋轉
  fill(167, 167, 175);
  stroke(110, 110, 113);
  strokeWeight(4);
  rect(20, -10, 20, 20); //砲管

  fill(204, 102, 156);
  stroke(125, 84, 105);
  strokeWeight(3);
  ellipse(0, 0, 55, 55); //砲塔
}


加入 mx my 當按方向鍵時 是背景移動 砲台永遠待在正中央
void setup() {
  size(500, 400);
}
void keyPressed() {
  if (keyCode==RIGHT) x += 1;
  if (keyCode==LEFT) x -= 1;
  if (keyCode==UP) y -= 1;
  if (keyCode==DOWN) y += 1;
}
float x = 250, y = 200;
void draw() {
  background(219); //灰底
  translate(-x, -y); //讓全世界, 都向反方向移動
  translate(width/2, height/2); //把 0.0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  for (int i=0; i<30; i++) {
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }

  //background(215, 184, 200); //紅底
  //stroke(211, 180, 196); //紅底的線
  float dx = mx - x, dy = my - y; //改用 mx, my
  float a = atan2(dy, dx); // atan2() 算出角度
  line(x, y, mx, my); //改用 mx, my
  myTank(x, y, a);
}
void myTank(float x, float y, float a) {
  translate(x, y); //大二下圖學課教的移動
  rotate(a); //大二下圖學課教的旋轉
  fill(167, 167, 175);
  stroke(110, 110, 113);
  strokeWeight(4);
  rect(20, -10, 20, 20); //砲管

  fill(204, 102, 156);
  stroke(125, 84, 105);
  strokeWeight(3);
  ellipse(0, 0, 55, 55); //砲塔
}


讓砲台移動的更順暢
// 希望能移動得很順, 因為 keyPressed 每秒的次數不夠快, 要在 void draw() 裡移動它
// 會移動的背景, 但是其他要正確運作
void setup() {
  size(500, 400);
}
void keyPressed() {
  if (keyCode==RIGHT) vx = 1; //x += 1
  if (keyCode==LEFT) vx = -1; //x -= 1
  if (keyCode==UP) vy = -1; //y -= 1
  if (keyCode==DOWN) vy = 1; //y+=1
}
void keyReleased() {
  if (keyCode==LEFT || keyCode==RIGHT) vx = 0;
  if (keyCode==UP || keyCode==DOWN) vy = 0;
}
float x = 250, y = 200, vx = 0, vy = 0;
void draw() {
  x += vx;
  y += vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界, 都向反方向移動
  translate(width/2, height/2); //把 0.0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  for (int i=0; i<30; i++) {
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }

  //background(215, 184, 200); //紅底
  //stroke(211, 180, 196); //紅底的線
  float dx = mx - x, dy = my - y; //改用 mx, my
  float a = atan2(dy, dx); // atan2() 算出角度
  line(x, y, mx, my); //改用 mx, my
  myTank(x, y, a);
}
void myTank(float x, float y, float a) {
  translate(x, y); //大二下圖學課教的移動
  rotate(a); //大二下圖學課教的旋轉
  fill(167, 167, 175);
  stroke(110, 110, 113);
  strokeWeight(4);
  rect(20, -10, 20, 20); //砲管

  fill(204, 102, 156);
  stroke(125, 84, 105);
  strokeWeight(3);
  ellipse(0, 0, 55, 55); //砲塔
}

發射子彈
void setup() {
  size(500, 400);
}
void keyPressed() {
  if (keyCode==RIGHT) vx = 1; //x += 1
  if (keyCode==LEFT) vx = -1; //x -= 1
  if (keyCode==UP) vy = -1; //y -= 1
  if (keyCode==DOWN) vy = 1; //y+=1
}
void keyReleased() {
  if (keyCode==LEFT || keyCode==RIGHT) vx = 0;
  if (keyCode==UP || keyCode==DOWN) vy = 0;
}
float x = 250, y = 200, vx = 0, vy = 0;
void draw() {
  x += vx;
  y += vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界, 都向反方向移動
  translate(width/2, height/2); //把 0.0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標
  ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  for (int i=0; i<30; i++) {
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }

  //background(215, 184, 200); //紅底
  //stroke(211, 180, 196); //紅底的線
  float dx = mx - x, dy = my - y; //改用 mx, my
  float a = atan2(dy, dx); // atan2() 算出角度
  angle = a;
  line(x, y, mx, my); //改用 mx, my
  pushMatrix();
  myTank(x, y, a);
  popMatrix();
  if (bulletVX!=0 && bulletVY!=0) {
    bulletX += bulletVX;
    bulletY += bulletVY;
    ellipse(bulletX, bulletY, 20, 20);
  }
}
float angle;
float bulletX = 0, bulletY = 0, bulletVX = 0, bulletVY = 0; //子彈的x,y位置和速度
void mousePressed(){
   bulletX = x;
   bulletY = y;
   bulletVX = cos(angle);
   bulletVY = sin(angle);
}
void myTank(float x, float y, float a) {
  translate(x, y); //大二下圖學課教的移動
  rotate(a); //大二下圖學課教的旋轉
  fill(167, 167, 175);
  stroke(110, 110, 113);
  strokeWeight(4);
  rect(20, -10, 20, 20); //砲管

  fill(204, 102, 156);
  stroke(125, 84, 105);
  strokeWeight(3);
  ellipse(0, 0, 55, 55); //砲塔
}


發射超多子彈, 但陣列只有100, 超過會當機
void setup() {
  size(500, 400);
}
void keyPressed() {
  if (keyCode==RIGHT) vx = 1; //x += 1
  if (keyCode==LEFT) vx = -1; //x -= 1
  if (keyCode==UP) vy = -1; //y -= 1
  if (keyCode==DOWN) vy = 1; //y+=1
}
void keyReleased() {
  if (keyCode==LEFT || keyCode==RIGHT) vx = 0;
  if (keyCode==UP || keyCode==DOWN) vy = 0;
}
float x = 250, y = 200, vx = 0, vy = 0;
void draw() {
  x += vx;
  y += vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界, 都向反方向移動
  translate(width/2, height/2); //把 0.0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標
  //ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  for (int i=0; i<30; i++) {
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }

  //background(215, 184, 200); //紅底
  //stroke(211, 180, 196); //紅底的線
  float dx = mx - x, dy = my - y; //改用 mx, my
  float a = atan2(dy, dx); // atan2() 算出角度
  angle = a;
  line(x, y, mx, my); //改用 mx, my
  pushMatrix();
  myTank(x, y, a);
  popMatrix();
  for (int i=0; i<bulletN; i++) {
    bulletX[i] += bulletVX[i];
    bulletY[i] += bulletVY[i];
    ellipse(bulletX[i], bulletY[i], 20, 20);
  }
}
float angle;
int bulletN = 0; //一開始有0個子彈, 之後慢慢增加
float [] bulletX = new float[100]; //致命問題: 只有100發子彈, 超過會當機
float [] bulletY = new float [100];
float [] bulletVX = new float [100];
float [] bulletVY = new float [100]; //子彈的x,y位置和速度
void mousePressed() {
  int i = bulletN;
  bulletX[i] = x;
  bulletY[i] = y;
  bulletVX[i] = cos(angle);
  bulletVY[i] = sin(angle);
  bulletN ++;
}
void myTank(float x, float y, float a) {
  translate(x, y); //大二下圖學課教的移動
  rotate(a); //大二下圖學課教的旋轉
  fill(167, 167, 175);
  stroke(110, 110, 113);
  strokeWeight(4);
  rect(20, -10, 20, 20); //砲管

  fill(204, 102, 156);
  stroke(125, 84, 105);
  strokeWeight(3);
  ellipse(0, 0, 55, 55); //砲塔
}


發射超多子彈, 但不會當機, 當到陣列到100時, 陣列會自動回到50
void setup() {
  size(500, 400);
}
void keyPressed() {
  if (keyCode==RIGHT) vx = 1; //x += 1
  if (keyCode==LEFT) vx = -1; //x -= 1
  if (keyCode==UP) vy = -1; //y -= 1
  if (keyCode==DOWN) vy = 1; //y+=1
}
void keyReleased() {
  if (keyCode==LEFT || keyCode==RIGHT) vx = 0;
  if (keyCode==UP || keyCode==DOWN) vy = 0;
}
float x = 250, y = 200, vx = 0, vy = 0;
void draw() {
  x += vx;
  y += vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界, 都向反方向移動
  translate(width/2, height/2); //把 0.0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標
  //ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  for (int i=0; i<30; i++) {
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }

  //background(215, 184, 200); //紅底
  //stroke(211, 180, 196); //紅底的線
  float dx = mx - x, dy = my - y; //改用 mx, my
  float a = atan2(dy, dx); // atan2() 算出角度
  angle = a;
  line(x, y, mx, my); //改用 mx, my
  pushMatrix();
  myTank(x, y, a);
  popMatrix();
  for (int i=0; i<bulletN; i++) {
    bulletX[i] += bulletVX[i];
    bulletY[i] += bulletVY[i];
    ellipse(bulletX[i], bulletY[i], 20, 20);
  }
}
float angle;
int bulletN = 0; //一開始有0個子彈, 之後慢慢增加
float [] bulletX = new float[100]; //致命問題: 只有100發子彈, 超過會當機
float [] bulletY = new float [100];
float [] bulletVX = new float [100];
float [] bulletVY = new float [100]; //子彈的x,y位置和速度
void mousePressed() {
  int i = bulletN;
  bulletX[i] = x;
  bulletY[i] = y;
  bulletVX[i] = cos(angle);
  bulletVY[i] = sin(angle);
  bulletN ++;
  if(bulletN==100){
     for(int k=0; k<50; k++){
        bulletX[k] =  bulletX[k+50];
        bulletY[k] =  bulletY[k+50];
        bulletVX[k] =  bulletVX[k+50];
        bulletVY[k] =  bulletVY[k+50];
     }
     bulletN = 50;
  }
  println(bulletN);
}
void myTank(float x, float y, float a) {
  translate(x, y); //大二下圖學課教的移動
  rotate(a); //大二下圖學課教的旋轉
  fill(167, 167, 175);
  stroke(110, 110, 113);
  strokeWeight(4);
  rect(20, -10, 20, 20); //砲管

  fill(204, 102, 156);
  stroke(125, 84, 105);
  strokeWeight(3);
  ellipse(0, 0, 55, 55); //砲塔
}


發射超多子彈, 但發射後10秒會消失
void setup() {
  size(500, 400);
}
void keyPressed() {
  if (keyCode==RIGHT) vx = 1; //x += 1
  if (keyCode==LEFT) vx = -1; //x -= 1
  if (keyCode==UP) vy = -1; //y -= 1
  if (keyCode==DOWN) vy = 1; //y+=1
}
void keyReleased() {
  if (keyCode==LEFT || keyCode==RIGHT) vx = 0;
  if (keyCode==UP || keyCode==DOWN) vy = 0;
}
float x = 250, y = 200, vx = 0, vy = 0;
void draw() {
  x += vx;
  y += vy;
  background(219); //灰底
  translate(-x, -y); //讓全世界, 都向反方向移動
  translate(width/2, height/2); //把 0.0 移畫面正中心
  float mx = mouseX+x-width/2, my = mouseY+y-height/2; //換算 mx, my 的座標
  //ellipse(mx, my, 8, 8);
  stroke(210); //灰底的線
  for (int i=0; i<30; i++) {
    line(0, i*30, 500, i*30);
    line(i*30, 0, i*30, 500);
  }

  //background(215, 184, 200); //紅底
  //stroke(211, 180, 196); //紅底的線
  float dx = mx - x, dy = my - y; //改用 mx, my
  float a = atan2(dy, dx); // atan2() 算出角度
  angle = a;
  line(x, y, mx, my); //改用 mx, my
  pushMatrix();
  myTank(x, y, a);
  popMatrix();
  for (int i=0; i<bulletN; i++) {
    bulletX[i] += bulletVX[i];
    bulletY[i] += bulletVY[i];
    ellipse(bulletX[i], bulletY[i], 20, 20);
    bulletT[i] --;
    if(bulletT[i]==0){
       for(int k=i+1; k<bulletN; k++){
          bulletX[k-1] = bulletX[k]; 
          bulletY[k-1] = bulletY[k]; 
          bulletVX[k-1] = bulletVX[k]; 
          bulletVY[k-1] = bulletVY[k]; 
          bulletT[k-1] = bulletT[k]; 
       }
       bulletN --; //少了一顆子彈
    }
  }
}
float angle;
int bulletN = 0; //一開始有0個子彈, 之後慢慢增加
float [] bulletX = new float[100]; //致命問題: 只有100發子彈, 超過會當機
float [] bulletY = new float [100];
float [] bulletVX = new float [100];
float [] bulletVY = new float [100]; //子彈的x,y位置和速度
int [] bulletT = new int[100]; //每個子彈的壽命
void mousePressed() {
  int i = bulletN;
  bulletX[i] = x;
  bulletY[i] = y;
  bulletVX[i] = cos(angle);
  bulletVY[i] = sin(angle);
  bulletT[i] = 600; //每個子彈, 只有10秒壽命
  bulletN ++;
  if(bulletN==100){
     for(int k=0; k<50; k++){
        bulletX[k] =  bulletX[k+50];
        bulletY[k] =  bulletY[k+50];
        bulletVX[k] =  bulletVX[k+50];
        bulletVY[k] =  bulletVY[k+50];
     }
     bulletN = 50;
  }
  println(bulletN);
}
void myTank(float x, float y, float a) {
  translate(x, y); //大二下圖學課教的移動
  rotate(a); //大二下圖學課教的旋轉
  fill(167, 167, 175);
  stroke(110, 110, 113);
  strokeWeight(4);
  rect(20, -10, 20, 20); //砲管

  fill(204, 102, 156);
  stroke(125, 84, 105);
  strokeWeight(3);
  ellipse(0, 0, 55, 55); //砲塔
}

沒有留言:

張貼留言