顯示具有 07160211_吳東軒 標籤的文章。 顯示所有文章
顯示具有 07160211_吳東軒 標籤的文章。 顯示所有文章

2022年1月16日 星期日

Final期末作業(更新版)

 期末作業

期末作業接近尾聲了,但還是有一些問題,而且還換了一種寫法,努力在dayline前做完!

程式碼

PImage img1,img2,img3,img4;//讀入圖片
float []bombX=new float[100];//用陣列計算砲彈生成數和速度
float []bombY=new float[100];
float []bombVX=new float[100];
float []bombVY=new float[100];
boolean []BombDisappear = new boolean[100];
int bx[]= new int[6];//紀錄船的xy座標
int by[]= new int[6];
int count=3000;//一秒=60frame
int score=0;//初始分數為0
int rec=0;//紀錄哪個魚雷
PFont myFont;//讀入字體
boolean flag = true;//判斷是否生成物件
int temp = 0;//設定打到船隻的計數器
class Boat{//發明Boat物件
  float x,y,vx;
  boolean dead, flag;
  Boat(){//建構同名的東西
    x = -100;
    y = random(300,600);
    vx = random(1,3);
    dead = false;//沒有死掉
    flag = false;
  }
  void draw(){
    if(dead==true)
    {
      BombDisappear[rec]=false;//魚雷不消失
      return;//不畫船
    }
    image(img2,x-120,y-80,250,120);//由左至右的船,調整中心點位置
    
    for(int i=0;i<100;i++)
    {
      if(dist(bombX[i]+100,bombY[i]+50,x,y)<40)//調整炸彈中心點位置
      {  
        rec=i;//紀錄發射魚雷和擊中的船隻為同一個
        dead=true;//判斷死亡
        score+=100;//判斷加分
        BombDisappear[rec]=true;//判斷魚雷打到就消失
        bombX[i]+=1000;
        bombY[i]+=1000;
      }
    }
    x = x + vx;
    if(x>850)//超出界定範圍,就重新隨機生成
    {
      x=-200;
      y=random(300,650);
      vx=random(1,3);
    }
  }
}
class Boat1{//發明Boat1物件
  float x1,y1,vx1;
  boolean dead, flag;
  Boat1(){//建構同名的東西
    x1 = 900;
    y1 = random(300,600);
    vx1 = random(-3,-1);
    dead = false;//沒有死掉
  }
  void draw(){
    if(dead==true)
    {
      BombDisappear[rec]=false;//魚雷不消失
      return;//不畫船
    }
    image(img3,x1-120,y1-50,200,80);//由右至左的船,調整中心點位置
    for(int i=0;i<100;i++)
    {
      if(dist(bombX[i]+100,bombY[i]+50,x1,y1)<40)//調整炸彈中心點位置
      {
        rec=i;//紀錄發射魚雷和擊中的船隻為同一個
        dead=true;//判斷死亡
        score+=100;//判斷加分
        BombDisappear[rec]=true;//判斷魚雷打到就消失
        bombX[i]+=1000;
        bombY[i]+=1000;
      }
    }
    x1 = x1 + vx1;
    if(x1<-200)//超出界定範圍,就重新隨機生成
    {
      x1=1000;
      y1=random(300,650);
      vx1=random(-3,-1);
    }
  }
}
Boat[]ships;
Boat1[]ships1;
float x2=300,y2=85;//船隻起始位置
int N=0;
void setup(){
  size(800,800);
  img1=loadImage("boat.png");//船
  img4=loadImage("bomb.png");//魚雷
  img2=loadImage("deep1.png");//由右至左的潛水艇
  img3=loadImage("deep.png");//由左至右的潛水艇
  myFont = createFont("微軟正黑體",30);//讀入需要的中文字體
  textFont(myFont);
  for(int i=0;i<100;i++)BombDisappear[i]=false; 
}
void draw()
{  
  println(temp);
  if(temp == 6)
  {
   flag = true;
   temp = 0;
  }
  if(flag == true)//當temp=6時,flag就會被判斷為true,然後生成船隻物件
  {
    ships = new Boat[3];
    ships1 = new Boat1[3];  
    for(int i=0;i<3;i++)
    {
      ships[i]= new Boat();//生成船隻
      ships1[i]= new Boat1(); 
      ships[i].x=bx[i];//紀錄xy座標
      ships[i].y=by[i];
      ships1[i].x1=bx[i+3];//0,1,2被用過,需+3
      ships1[i].y1=by[i+3];
    }
    flag=false;//在被重置之前,所有的船隻物件只會生成一次
  }
  background(#C9E4F0);//天空顏色
  fill(#225BD3);rect(0,200,800,1000);//海洋顏色與調整位置
  image(img1,x2,y2,300,200);//船隻大小
  if(keyPressed && keyCode==LEFT)x2-=2;//船隻向左移動
  if(keyPressed && keyCode==RIGHT)x2+=2;//船隻向右移動
  for(int i=0;i<3;i++) //左邊船隻
  {
    if(ships[i] == null) continue;//如果物件被更新為空值,就不再去畫船隻
    if (ships[i].dead == true)
    {
      ships[i] = null;//用null設定刪除被打到的船隻物件
      temp++;
    } 
    else
      ships[i].draw();
  }
  for(int i=0;i<3;i++) //右邊船隻
  {
    if(ships1[i] == null) continue;//如果物件被更新為空值,就不再去畫船隻
    if (ships1[i].dead == true)
    {
      ships1[i] = null;//用null設定刪除被打到的船隻物件
      temp++;
    }
    else
      ships1[i].draw();
  }
  for(rec=0;rec<N;rec++)
  {
    if(BombDisappear[rec]==false)
    {
      bombY[rec]+=bombVY[rec];//更新魚雷的y座標
      image(img4,bombX[rec],bombY[rec],200,50);//魚雷圖
    }
  }
  fill(#030303);textSize(30);//結算畫面背景顏色和字型大小
  text("剩餘時間:"+int(count/60)+"秒",600,50);//倒數計時器
  if(count<=0)//結算畫面
  {
    background(0,255,255);
    fill(0);textSize(80);text("遊戲結束",240,300);
    fill(0);textSize(40);text("分數: "+score+"分",300,500);//計算總共分數
  }
  else{
    count--;
  }
}
void mousePressed()//魚雷生成
{
  N++;
  bombX[N-1]=x2+50;bombY[N-1]=y2+110;//每次魚雷都會從船隻發射
  bombVX[N-1]=0;bombVY[N-1]=3;
}

最後成功把剩下的問題解決了,運用了上課的教學內容以及小葉老師的指導,最後把遊戲給做好了!




2021年12月27日 星期一

week12課程

期末作品製作

炸潛水艇

1.船和炸彈的操控

▲船隻左右移動
image(img1,x,y,300,200);//船隻大小
if(keyPressed && keyCode==LEFT)x-=1.5;//船隻向左移動
if(keyPressed && keyCode==RIGHT)x+=1.5;//船隻向右移動

▲滑鼠點擊發射
void mousePressed()
{
  N++;
  bombX[N-1]=x+50;bombY[N-1]=y+110;//每次砲彈都會從船隻發射
  bombVX[N-1]=0;bombVY[N-1]=1;
}

2.潛水艇亂數移動

▲用陣列設定潛水艇的變數
float []boatX=new float[3];//潛水艇由左至右的xy座標和速度
float []boatY=new float[3];
float []boatVX=new float[3];
float []boatX1=new float[3];//潛水艇由右至左xy座標和速度
float []boatY1=new float[3];
float []boatVX1=new float[3];

void setup()
{
    for(int i=0 ; i<3 ; i++)//亂數生成潛水艇位置和速度
  {
    boatX[i]=random(-200,-200);//潛水艇從左方產生
    boatY[i]=random(300,600);
    boatVX[i]=random(1,2);
    boatX1[i]=random(800,800);//潛水艇從右方產生
    boatY1[i]=random(300,600);
    boatVX1[i]=random(-2,-1);
  }
}

3.新增倒數計時器和結算畫面

fill(#030303);textSize(30);
text("剩餘時間:"+int(count/60)+"秒",600,50);//倒數計時器
if(count<=0)//結算畫面
{
  background(0,255,255);
  fill(0);textSize(80);text("Game Over",180,300);
  fill(0);textSize(40);text("Score: ",300,500);
}
else{
  count--;
}

▲預期製作進度

1.船隻隨機生成(完成)
2.砲彈和潛水艇的碰撞偵測(碰撞條件有問題,需做更正)
3.結束畫面(完成)
4.倒數計時器(完成)
5.分數計算(和碰撞偵測一併完成)

★目前程式碼★

float x=300,y=85;//船隻起始位置
float []bombX=new float[100];//用陣列計算砲彈生成數和速度
float []bombY=new float[100];
float []bombVX=new float[100];
float []bombVY=new float[100];
float []boatX=new float[3];//潛水艇由左至右的xy座標和速度
float []boatY=new float[3];
float []boatVX=new float[3];
float []boatX1=new float[3];//潛水艇由右至左xy座標和速度
float []boatY1=new float[3];
float []boatVX1=new float[3];
PImage img1,img2,img3,img4;
boolean []die={false,false,false};
int count=3000;
int score=0;
PFont myFont;//讀入字體
int N=0;
void setup()
{
  size(800,800);//視窗大小
  img1=loadImage("boat.png");//船
  img2=loadImage("deep1.png");//潛水艇
  img3=loadImage("deep.png");//反向潛水艇
  img4=loadImage("bomb.png");//魚雷
  for(int i=0 ; i<3 ; i++)//亂數生成潛水艇位置和速度
  {
    boatX[i]=random(-200,-200);//潛水艇從左方產生
    boatY[i]=random(300,600);
    boatVX[i]=random(1,2);
    boatX1[i]=random(800,800);//潛水艇從右方產生
    boatY1[i]=random(300,600);
    boatVX1[i]=random(-2,-1);
  }
  myFont = createFont("微軟正黑體",30);//讀入需要的中文字體
  textFont(myFont);
}
void draw()
{
  background(#C9E4F0);//天空顏色
  fill(#225BD3);rect(0,200,800,1000);//海洋顏色與調整位置
  image(img1,x,y,300,200);//船隻大小
  if(keyPressed && keyCode==LEFT)x-=1.5;//船隻向左移動
  if(keyPressed && keyCode==RIGHT)x+=1.5;//船隻向右移動
  for(int i=0;i<3;i++)
  {
    boatX[i]+=boatVX[i];
    image(img2,boatX[i],boatY[i],250,120);//由左至右潛水艇大小和座標
    if(dist(bombX[i],bombY[i],boatX[i],boatY[i])<50)
    {
      die[i]=true;
    }
    if(boatX[i]>850)//由左至右重新隨機生成
    {
      boatX[i]=-200;
      boatY[i]=random(300,750);
      boatVX[i]=random(1,2);
    }
    if(die[i])//這段判斷需改
    {
      boatX[i]=0;
      boatY[i]=random(300,750);
      boatVX[i]=random(1,2);
    }
  }
  for(int i=0;i<3;i++)
  {
    boatX1[i]+=boatVX1[i];
    image(img3,boatX1[i],boatY1[i],200,80);//由右至左潛水艇大小和座標
    if(dist(bombX[i],bombY[i],boatX1[i],boatY1[i])<50)
    {
      die[i]=true;
    }
    if(boatX1[i]<-200)//由右至左重新隨機生成
    {
      boatX1[i]=1000;
      boatY1[i]=random(300,750);
      boatVX1[i]=random(-2,-1);
    }
    if(die[i])//這段判斷需改
    {
      boatX1[i]=800;
      boatY1[i]=random(300,750);
      boatVX1[i]=random(-2,-1);
    }
  }
  for(int i=0;i<N;i++)
  {
    bombY[i]+=bombVY[i];
    image(img4,bombX[i],bombY[i],200,50);
    if(bombY[i]>800)
    {
      for(int k=i;k<N-1;k++)//此迴圈作為回收砲彈用途,陣列從0計算,0...i...N-1,補中間的空洞,需左移補上
      {
        bombX[k]=bombX[k+1];
        bombY[k]=bombY[k+1];
        bombVX[k]=bombVX[k+1];
        bombVY[k]=bombVY[k+1];
      }
      N--;
    }
  }
  println(N);
  fill(#030303);textSize(30);
  text("剩餘時間:"+int(count/60)+"秒",600,50);//倒數計時器
  if(count<=0)//結算畫面
  {
    background(0,255,255);
    fill(0);textSize(80);text("Game Over",180,300);
    fill(0);textSize(40);text("Score: ",300,500);
  }
  else{
    count--;
  }
}
void mousePressed()
{
  N++;
  bombX[N-1]=x+50;bombY[N-1]=y+110;//每次砲彈都會從船隻發射
  bombVX[N-1]=0;bombVY[N-1]=1;
}




2021年12月20日 星期一

week11課程

期末作業進度

炸潛水艇

1.畫出背景

void setup()
{
  size(800,800);//視窗大小
}
float x=400,y=175;//船隻起始位置
float bombX,bombY,bombVX,bombVY;
void draw()
{
    background(#C9E4F0);//天空顏色
    fill(#225BD3);rect(0,200,800,1000);//海洋顏色與調整位置
    fill(255);ellipse(x,y,200,50);//船隻大小
}

2.畫出砲彈、發射砲彈

void setup()
{
  size(800,800);//視窗大小
}
float x=400,y=175;//船隻起始位置
float bombX,bombY,bombVX,bombVY;
boolean shooting=false;
void draw()
{
    background(#C9E4F0);//天空顏色
    fill(#225BD3);rect(0,200,800,1000);//海洋顏色與調整位置
    fill(255);ellipse(x,y,200,50);//船隻大小
    if(shooting)
    {
        bombX+=bombVX;bombY+=bombVY;
        ellipse(bombX,bombY,10,10);
    }
}
void mousePressed()//滑鼠點擊就發射砲彈
{
    bombX=x;bombY=y;
    bombVX=0;bombVY=1;
    shooting=true;
}

3.砲彈生成數

float []bombX=new float[100];//用陣列計算砲彈生成數和速度
float []bombY=new float[100];
float []bombVX=new float[100];
float []bombVY=new float[100];

void draw()
{
    background(#C9E4F0);//天空顏色
    fill(#225BD3);rect(0,200,800,1000);//海洋顏色與調整位置
    fill(255);ellipse(x,y,200,50);//船隻大小
    for(int i=0;i<N;i++)
   {
        bombY[i]+=bombVY[i];
        fill(#555252);ellipse(bombX[i],bombY[i],20,50);
    }
}


4.計算砲彈發射數和重置

for(int i=0;i<N;i++)
  {
    bombY[i]+=bombVY[i];
    fill(#555252);ellipse(bombX[i],bombY[i],20,50);
    if(bombY[i]>800)
    {
      for(int k=i;k<N-1;k++)//此迴圈作為回收砲彈用途,陣列從0計算,0...i...N-1,補中間的空洞,需左移補上
      {
        bombX[k]=bombX[k+1];
        bombY[k]=bombY[k+1];
        bombVX[k]=bombVX[k+1];
        bombVY[k]=bombVY[k+1];
      }
      N--;
    }
  }
  println(N);
void mousePressed()
{
  N++;
  bombX[N-1]=x;bombY[N-1]=y;//矩陣從0開始算,頭尾都算在計算時需-1
  bombVX[N-1]=0;bombVY[N-1]=1;
}


▲進度預期

1.潛水艇隨機生成
2.砲彈和潛水艇的碰撞偵測及消失
3.結尾畫面
4.倒數計時器
5.分數計算

2021年12月13日 星期一

week10課程

 課程回顧

1.設定船隻和砲彈的大小和速度

float x,y,z;//作為3D使用
float x=350,10,vx=-1.3,vy=0;//作為2D使用,船隻的起始位置
float bombX=500,bombY=100,bombvx=0,bombvy=1.5;//砲彈的大小和位置
void setup(){
  size(1000,1000);
}
void draw(){
    background(#3351F2);
    ellipse(x,y,50,15);
    ellipse(bombX,bombY,5,5);
    x += vx; y += vy;
    bombx += bombvx; bomby += bombvy;
}

2.匯入圖片和素材

void setup(){
  size(1000,1000);
  img1=loadImage("boat.png");//船
  img2=loadImage("deep.png");//潛水艇
  img3=loadImage("bomb.png");//魚雷
}
void draw(){
  background(#3351F2);
  image(img1,x,y,300,200);//船的大小
  image(img2,x1,y1,200,80);//敵船的大小
  image(img3,bombX,bombY,150,80);//砲彈大小
}

3.左右移動

if(keyPressed && keyCode==LEFT)x-=1.5;//船向左移動
if(keyPressed && keyCode==RIGHT)x+=1.5;//船向右移動

▲預計改善地方

1.用陣列的方法製造出多艘敵船
2.希望可以讓砲彈跟著船隻發射

★目前程式碼

float x=350,y=10;//玩家操控船的起始位置
float x1=1000,y1=500,vx=-2,vy=0;//敵艦的位置
float bombX=500,bombY=100,bombvx=0,bombvy=2;//砲彈座標和速度
PImage img1,img2,img3,img4;
void setup(){
  size(1000,1000);
  img1=loadImage("boat.png");//船
  img2=loadImage("deep.png");//潛水艇
  img3=loadImage("bomb.png");//魚雷
}
void draw(){
  background(#3351F2);
  image(img1,x,y,300,200);//船的大小
  image(img2,x1,y1,200,80);//敵船的大小
  image(img3,bombX,bombY,150,80);//砲彈大小
  if(keyPressed && keyCode==LEFT)x-=1.5;//船向左移動
  if(keyPressed && keyCode==RIGHT)x+=1.5;//船向右移動
  x1 += vx; y1 += vy;
  bombX += bombvx; bombY += bombvy;
}

2021年12月6日 星期一

week09課程

 今天開始製作期末作品

Step1:確認操控船隻的移動

float x=500,y=100,xy=-2;
void setup(){
  size(1000,1000);
}
void draw(){
  background(255);
  ellipse(x,y,150,50);
  if(keyPressed && keyCode==LEFT)x-=2;
  if(keyPressed && keyCode==RIGHT)x+=2;
}

後續預期製作

Step2:船隻可發射砲彈

Step3:敵艦可以隨機生成移動

Step4:敵艦可發射砲彈

Step5:確認擊中偵測是否成功

Step6:計分表








2021年11月29日 星期一

week08課程

 期末作品想法

1.小人移動

Step1:讀入圖檔

PImage img;
void setup(){
  size(500,500);
  img=loadImage("child.jpg");//讀取圖片
}
void draw(){
  background(0);
  image(img,0,0);
}

Step2:擷取圖片部分區塊

PImage img;
void setup(){
  size(500,500);
  img=loadImage("child.jpg");//讀取圖片
}
void draw(){
  background(255);
  //image(img,0,0);
  image(img.get(0,0,141,211),0,0);//針對特定區域截圖
}

Step3:人物初步移動

PImage img;
void setup(){
  size(500,500);
  img=loadImage("child.jpg");//讀取圖片
}
int a=0;
void draw(){
  background(255);
  //image(img,0,0);
  image(img.get(190*a,0,190,252),0,0);
  a = (a+1)%4;//有4個動作
}

Step4:調整移動速度

PImage img;
void setup(){
  size(500,500);
  img=loadImage("child.jpg");//讀取圖片
}
int a=0;
void draw(){
  background(255);
  //image(img,0,0);
  image(img.get(190*a,0,190,252),0,0);
  if(frameCount%30==0)a = (a+1)%4;//1秒有60frame,設定%30在一秒內移動2次
}

Step5:移動方向

PImage img;
void setup(){
  size(500,500);
  img=loadImage("child.jpg");//讀取圖片
  imageMode(CENTER);
}
int a=0,b=0,x=250,y=250;//設定b變數調整方向
void draw(){
  background(255);
  //image(img,0,0);
  image(img.get(141*a,211*b,141,211),x,y);
  if(frameCount%30==0)a = (a+1)%4;1秒有60frame,設定%30在一秒內移動2次
}
void keyPressed(){
  if(keyCode==DOWN){b=0;y++;}
  if(keyCode==UP){b=1;y--;}
  if(keyCode==LEFT){b=2;x--;}
  if(keyCode==RIGHT){b=3;x++;}
}

2021年11月22日 星期一

week07課程

 球體掉落

1.球體落下

float x=250,y=250;
void setup()
{
  size(500,600);
}
void draw()
{
  background(255);//防止殘影將背景設成白色
  ellipse(x,y,50,50);
  y++;//向下加速度
}

float x=250,y=250,vx=0,vy=3;//設立變數
void setup()
{
  size(500,600);
}
void draw()
{
  background(255);//防止殘影將背景設成白色
  ellipse(x,y,50,50);
  y = y + vy;//向下加速度
}

2.多個球體

float x=250,y=50,vx=0,vy=3;//設立變數
float x2=150,y2=50,vx2=0,vy2=1;//設立第二個變數
void setup()
{
  size(500,600);
}
void draw()
{
  background(255);//防止殘影將背景設成白色
  ellipse(x,y,50,50);
  ellipse(x2,y2,50,50);
  y = y + vy;//向下加速度
  y2 = y2 + vy2;//向下加速度
}

//改用陣列設定變數
float []x={250,150,350,300};
float []y={0,50,80,100};
float []vx={0,0,0,0};
float []vy={3,2,2.5,4};
void setup()
{
  size(500,600);
}
void draw()
{
  background(255);//防止殘影將背景設成白色
  for(int i=0;i<4;i++)//使用for迴圈跑出4個球,再根據上方陣列有不同的呈現效果
  {
    ellipse(x[i],y[i],50,50);
    y[i] = y[i] + vy[i];//向下加速度
  }
}

3.反彈球體

//改用陣列設定變數
float []x={250,150,350,300};
float []y={0,50,80,100};
float []vx={0,0,0,0};
float []vy={3,2,2.5,4};
void setup()
{
  size(500,600);
}
void draw()
{
  background(255);//防止殘影將背景設成白色
  for(int i=0;i<4;i++)//使用for迴圈跑出4個球,再根據上方陣列有不同的呈現效果
  {
    ellipse(x[i],y[i],50,50);
    y[i] = y[i] + vy[i];//向下加速度
    if(y[i]>600)vy[i]=-vy[i];//碰到下方
    if(y[i]<0)vy[i]=-vy[i];//碰到上方
  }
}

球體碰撞

1.距離碰撞

//改用陣列設定變數
float []x={250,150,350,300};
float []y={0,50,80,100};
float []vx={0,0,0,0};
float []vy={3,2,2.5,4};
void setup()
{
  size(500,600);
}
void draw()
{
  background(255);//防止殘影將背景設成白色
  for(int i=0;i<4;i++)//使用for迴圈跑出4個球,再根據上方陣列有不同的呈現效果
  {
    if(dist(mouseX,mouseY,x[i],y[i])<=50)
    {
      continue;
    }
    fill(255,255,0);ellipse(x[i],y[i],50,50);
    y[i] = y[i] + vy[i];//向下加速度
    if(y[i]>600)vy[i]=-vy[i];//碰到下方
    if(y[i]<0)vy[i]=-vy[i];//碰到上方
  }
  fill(255,0,0);ellipse(mouseX,mouseY,50,50);
}

//改用陣列設定變數
float []x={250,150,350,300};
float []y={0,50,80,100};
float []vx={0,0,0,0};
float []vy={3,2,2.5,4};
boolean[]dead={false,false,false,false};//false 0,true 1
void setup()
{
  size(500,600);
}
void draw()
{
  background(255);//防止殘影將背景設成白色
  for(int i=0;i<4;i++)//使用for迴圈跑出4個球,再根據上方陣列有不同的呈現效果
  {
    if(dist(mouseX,mouseY,x[i],y[i])<=50)//距離判斷
    {
      dead[i]=true;
    }
    if(dead[i]==true)continue;//死了就continue跳下一個
    fill(255,255,0);ellipse(x[i],y[i],50,50);
    y[i] = y[i] + vy[i];//向下加速度
    if(y[i]>600)vy[i]=-vy[i];//碰到下方
    if(y[i]<0)vy[i]=-vy[i];//碰到上方
  }
  fill(255,0,0);ellipse(mouseX,mouseY,50,50);
}

2.boolean練習

boolean down=true;
void setup()
{
  size(500,300);
}
void draw()
{
  if(mousePressed)down=true;
  else down=false;
  if(down)background(255,0,0);
  else background(0,255,0);
}

3.class物件練習

//使用class物件
class Ball{//發明Ball物件
  float x,y,vx,vy;
  boolean dead;
  Ball(){//建構同名的東西
    x = random(500);
    y = random(100,200);
    vy = random(3,4);
    dead = false;//沒有死掉
  }
  void draw(){
    if(dead==true)return;
    ellipse(x,y,50,50);
    if(dist(mouseX,mouseY,x,y)<50){
      dead=true;
    }
    y = y + vy;
    if(y>500)vy = -vy;
    if(y<0)vy = -vy;
  }
}
Ball[]balls;
void setup(){
  size(500,500);
  balls = new Ball[20];
  for(int i=0;i<20;i++){
    balls[i]= new Ball();
  }
}
void draw(){
  background(255);
  for(int i=0;i<20;i++){
    balls[i].draw();
  }
}






2021年11月15日 星期一

week06課程

 時間運作

1.字體呈現與預設位置

void setup(){
    size(500,500);
    fill(255,0,0);
    textSize(40);
    text("Hello",50,50);
}
void draw(){
   text("Hello",50,100);
}

2.顯示影格

void setup(){
    size(500,500);
    fill(255,0,0);
    textSize(40);
}
void draw(){
    background(255);
    text("Time:"+frameCount,50,100);//1秒加60個影格
}
void setup(){
    size(500,500);
    fill(255,0,0);
    textSize(40);
}
void draw(){
    background(255);
    text("Time:"+frameCount/60,50,100);//讓frameCount/60顯示正常速度
}
void setup(){
    size(500,500);
    fill(255,0,0);
    textSize(40);
}
void draw(){
    background(255);
    text("Time:"+frameCount/60,50,100);//讓frameCount/60顯示正常速度
    text("millis():"+millis()/1000,50,200);//millis是1/1000秒,相較於frameCount更為準確
}

3.顯示時間

void setup(){
size(500,500);
fill(255,0,0);
textSize(40);
}
void draw()
{
  background(255);
  text(hour()+":"+minute()+":"+second(),50,100);//用hour,minute,second來呈現現實時間
  text("millis():"+millis()/1000,50,200);//millis是1/1000秒
}

輸入特殊字體

1.字體清單

println(PFont.list());

2.顯示文字

PFont myFont;//宣告變數
void setup(){
  size(500,500);
  myFont = createFont("標楷體",100);//設定字體和大小
  textFont(myFont);
  text("中文",100,100);//顯示文字大小
}

3.切換字型

PFont font1,font2;//宣告變數
void setup(){
  size(500,500);
  font1 = createFont("標楷體",100);//設定字體和大小
  textFont(font1);
  font2 = createFont("微軟中黑體",100);//設定字體和大小
  textFont(font2);
}
void draw(){
  background(0);
  text("中文",100,100);
  if(mousePressed)textFont(font2);
  else textFont(font1);
}


顯示幾位數

1.nf(number formate)

void setup(){
size(500,500);
fill(255,0,0);
textSize(40);
}
void draw()
{
  background(255);
  String hh=nf(hour(),2);//nf後設定的數字可以顯示幾位數
  String mm=nf(minute(),2);
  String ss=nf(second(),2);
  text(hh+":"+mm+":"+ss+"",50,100);
  text("millis():"+millis()/1000,50,200);//millis是1/1000秒
}

2.顯示倒數和剩下時間

PFont myFont;//宣告變數
void setup(){
size(500,500);
myFont = createFont("標楷體",100);//設定字體和大小
textFont(myFont);
fill(255,0,0);
textSize(60);
}
void draw()
{
  background(255);
  String hh=nf(hour(),2);//nf後設定的數字可以顯示幾位數
  String mm=nf(minute(),2);
  String ss=nf(second(),2);
  text("現在:"+hh+":"+mm+":"+ss+"",50,100);
  text("睡覺:02:00:00",50,200);
  int now = hour()*60*60+minute()*60+second();
  int next = 02*60*60+00*60+00;
  int remain = next-now;
  text("剩下:"+remain+"秒",50,300);
  hh=nf(remain/60*60%60,2);//讓remain得出的結果轉換成小時分鐘秒數
  mm=nf(remain/60%60,2);
  ss=nf(remain%60,2);
  text("剩下:"+hh+":"+mm+":"+ss,50,400);
}










2021年11月1日 星期一

week05課程

 導入影片

▲Processing一直無法連線故本次部落格沒有圖片說明

1.事前準備

安裝video函式庫

在(檔案→範例)中可以找到video的函式庫

2.播放影片

在預設的範例硬碟裡頭可以找到要播放的影片

試著撰寫播放影片的程式碼
movie.loop();→重複播放
movie.play();→只播一次

3.開啟視訊鏡頭

找到capture函式庫


多個鏡頭視角
透過陣列給定每個鏡頭不同的變數,讓程式去讀取對應的鏡頭並作使用

存取影格
每當動作改變時都會做更新並存取
saveFrame();

4.紀錄影格

設定滑鼠點擊即記錄

像素更新
透過陣列和for迴圈來改變每個像素的顏色並做更新

顏色更新

亮度值更新
先透過滑鼠點擊暫停後,再利用for迴圈去更新每個像素的亮度值再做輸出