2024年10月21日 星期一

聽均一席話如聽一席話 Week07 11160712

 //week07_1_arras01_background_fill_stroke_ellipse_rect_line

void setup(){
  size(500,500);
  
}
float x=250,y=250;
void draw(){
  background(215,184,200);
  fill(167,167,175);
  stroke(110,100,113);
  rect(240,200,20,30);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(x,y,55,55);//圓形本體
  
  line(x,y,mouseX,mouseY);
}
單純畫出砲管和本體

//week07_2_02_srras02_sin_cos
void setup(){
  size(500,500);
  
}
float x=250,y=250;
void draw(){
  background(215,184,200);
  
  float dx=mouseX-x,dy=mouseY-y;
  float a=atan2(dy,dx);
  strokeWeight(20);
  line(x,y,x+cos(a)*40,y+sin(a)*40);//cos()算出x的方向sin()算出y的方向
  
  fill(167,167,175);
  stroke(110,100,113);
  rect(240,200,20,30);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(x,y,55,55);//圓形本體
  
  //line(x,y,mouseX,mouseY);
  
}

利用sin和cos找出游標的點

//week07_3_arras03_atan_angle_rotate_translate_mytank
void setup(){
  size(500,500);
  
}
float x=250,y=200;
void draw(){
  background(215,184,200);
  
  float dx=mouseX-x,dy=mouseY-y;
  float a=atan2(dy,dx);
  line(x,y,mouseX,mouseY);//cos()算出x的方向sin()算出y的方向
  mytank(x,y,a);
 
  
}
void mytank(float x,float y,float a){
  translate(x,y);
  rotate(a);
  
  fill(167,167,175);
  stroke(110,100,113);
  rect(20,-10,30,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形本體
  
}

讓砲管跟著游標動

//week07_4_arras04_background_for_line_line_void_keyPressed_keyCode
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);//灰底的線
  //stroke(211,180,196);//紅底的線
  for(int i=0;i<30;i++){
    line(0,i*30,500,i*30);
    line(i*30,500,i*30,0);
  }
  float dx=mouseX-x,dy=mouseY-y;
  float a=atan2(dy,dx);
  line(x,y,mouseX,mouseY);//cos()算出x的方向sin()算出y的方向
  mytank(x,y,a);
 
  
}
void mytank(float x,float y,float a){
  translate(x,y);
  rotate(a);
  
  fill(167,167,175);
  stroke(110,100,113);
  rect(20,-10,30,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形本體
  
}

讓砲塔能夠上下左右移動

//week07_5_arras05_correct_move_translate_translate_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,500,i*30,0);
  }
  float dx=mx-x,dy=my-y;//改用mx,my
  float a=atan2(dy,dx);
  line(x,y,mx,my);//cos()算出x的方向sin()算出y的方向
  mytank(x,y,a);
 
  
}
void mytank(float x,float y,float a){
  translate(x,y);
  rotate(a);
  
  fill(167,167,175);
  stroke(110,100,113);
  rect(20,-10,30,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形本體
  
}

讓背景跟著移動

//week07_6_arras06_vx_vy_void_keyPressed_void_keyReleased_void_draw
void setup(){
  size(500,400);
  
}
void keyPressed(){//按下去時會有速度,放開後速度會變成0
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,500,i*30,0);
  }
  float dx=mx-x,dy=my-y;//改用mx,my
  float a=atan2(dy,dx);
  line(x,y,mx,my);//cos()算出x的方向sin()算出y的方向
  mytank(x,y,a);
 
  
}
void mytank(float x,float y,float a){
  translate(x,y);
  rotate(a);
  
  fill(167,167,175);
  stroke(110,100,113);
  rect(20,-10,30,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形本體
  
}
動起來更順
//week07_7_arras07_angle_bulletx_bullety_bulletvx_bulletvy
void setup(){
  size(500,400);
  
}
void keyPressed(){//按下去時會有速度,放開後速度會變成0
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;
}

void mousePressed(){
  bulletX=x;
  bulletY=y;
  bulletVX=cos(angle);
  bulletVY=sin(angle);
}


float angle;
float bulletX=0,bulletY=0,bulletVX=0,bulletVY=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,500,i*30,0);
  }
  float dx=mx-x,dy=my-y;//改用mx,my
  float a=atan2(dy,dx);
  angle = a;
  line(x,y,mx,my);//cos()算出x的方向sin()算出y的方向
  pushMatrix();
  mytank(x,y,a);
  popMatrix();
  if(bulletVX!=0 && bulletVY!=0){
    bulletX +=bulletVX;
    bulletY +=bulletVY;
    ellipse(bulletX,bulletY,20,20);
  }
  
  
}


void mytank(float x,float y,float a){
  translate(x,y);
  rotate(a);
  
  fill(167,167,175);
  stroke(110,100,113);
  rect(20,-10,30,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形本體
  
}
射出子彈(但是只能一顆)

//week07_8_arras08_array_many_bullet
void setup(){
  size(500,400);
  
}
void keyPressed(){//按下去時會有速度,放開後速度會變成0
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;
}

void mousePressed(){
  int i=bulletN;//一開始會有0顆子彈,之後慢慢增加
  bulletX[i]=x;
  bulletY[i]=y;
  bulletVX[i]=cos(angle);
  bulletVY[i]=sin(angle);//子彈的位置和速度
  bulletN++;
}


float angle;
int bulletN = 0;
float [] bulletX=new float[100];//致命問題子彈最多只有100發超過會當機
float [] bulletY=new float[100];
float [] bulletVX=new float[100];
float [] bulletVY=new float[100];
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,500,i*30,0);
  }
  float dx=mx-x,dy=my-y;//改用mx,my
  float a=atan2(dy,dx);
  angle = a;
  line(x,y,mx,my);//cos()算出x的方向sin()算出y的方向
  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);
  }
  
  
}


void mytank(float x,float y,float a){
  translate(x,y);
  rotate(a);
  
  fill(167,167,175);
  stroke(110,100,113);
  rect(20,-10,30,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形本體
  
}

可以射出很多子彈,但是如果超過100會當機

//week07_9_arras09_recycle
void setup(){
  size(500,400);
  
}
void keyPressed(){//按下去時會有速度,放開後速度會變成0
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;
}

void mousePressed(){
  int i=bulletN;//一開始會有0顆子彈,之後慢慢增加
  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);
}


float angle;
int bulletN = 0;
float [] bulletX=new float[100];//致命問題子彈最多只有100發超過會當機
float [] bulletY=new float[100];
float [] bulletVX=new float[100];
float [] bulletVY=new float[100];
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,500,i*30,0);
  }
  float dx=mx-x,dy=my-y;//改用mx,my
  float a=atan2(dy,dx);
  angle = a;
  line(x,y,mx,my);//cos()算出x的方向sin()算出y的方向
  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);
  }
  
  
}


void mytank(float x,float y,float a){
  translate(x,y);
  rotate(a);
  
  fill(167,167,175);
  stroke(110,100,113);
  rect(20,-10,30,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形本體
  
}
解決了會當機的bug

//week07_10_arras10_bulleT_totimeout
void setup(){
  size(500,400);
  
}
void keyPressed(){//按下去時會有速度,放開後速度會變成0
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;
}

void mousePressed(){
  int i=bulletN;//一開始會有0顆子彈,之後慢慢增加
  bulletX[i]=x;
  bulletY[i]=y;
  bulletVX[i]=cos(angle);
  bulletVY[i]=sin(angle);//子彈的位置和速度
  bulleT[i]=600;
  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);
}


float angle;
int bulletN = 0;
float [] bulletX=new float[100];//致命問題子彈最多只有100發超過會當機
float [] bulletY=new float[100];
float [] bulletVX=new float[100];
float [] bulletVY=new float[100];
int []bulleT= new int[100];
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,500,i*30,0);
  }
  float dx=mx-x,dy=my-y;//改用mx,my
  float a=atan2(dy,dx);
  angle = a;
  line(x,y,mx,my);//cos()算出x的方向sin()算出y的方向
  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);
    bulleT[i]--;
    if(bulleT[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];
        bulleT[k-1]=bulleT[k];
      }
      bulletN--;
    }
  }
  println(bulletN);
}


void mytank(float x,float y,float a){
  translate(x,y);
  rotate(a);
  
  fill(167,167,175);
  stroke(110,100,113);
  rect(20,-10,30,20);//砲管
  
  fill(204,102,156);
  stroke(125,84,105);
  strokeWeight(3);
  ellipse(0,0,55,55);//圓形本體
  
}
改成射出的子彈會過了10秒後消失以解決當機的問題

沒有留言:

張貼留言