2022年11月22日 星期二

week12_新手上碌

前提及要:

因已完成大部分功能(畫線、墨水、球運動軌跡、得分機制...)

欲精簡程式碼以便套用在每個關卡上,卻卡住了

1.使用自訂函式分頁:return的回傳值只能有一個

2.使用Class物件,出現動態、靜態模式的問題.....

求助老師--------

刪掉重頭再來-用

Class{ArrayList}物件裡有鏈結串列

線class 裡面有好多點

+

ArrayList<class>好多個物件串成鏈結串列

好多條線

1.物件、陣列

1-1.陣列:

PVector pt;        //pt是一個向量

PVector [  ] pts;        //pts是一個放向量的矩陣

pts=new PVector[10];   //new方法:創建一個物件pts 是 用來放向量、大小為10的矩陣

pts[i]=new PVector(  random(200),random(200)  );  //創一個隨機的座標放到矩陣裡

1-2.物件:定義>宣告>創造new

定義物件類型

物件包含{

        變數

        定義函式

}


---------------    定義好之後,如何使用class?    ---------------

宣告

Line line;

new方法:建立物件實體

line new  Line(  );


2.Class{ArrayList}物件裡有鏈結串列

在每一個節點裡存到下一個節點的指標,
不需要事先知道資料大小    ex. 畫線不知道要多少個點
宣告
ArrayList<資料型態>名稱;

2-1.畫圖用的物件Curve:
先定義一個物件Curve,專門用來畫線、儲存向量(座標點)

class Curve{
    ArrayList<PVector>pts;        // pts是放向量的鏈結串列
    Curve( ){                ///在class面呼叫自己 >>建構子:一開始就會做的事
            pts=new ArrayList<PVector>();        //一開始先 創建向量pts
    }
    void draw(){        //畫線用的函式
        for(int i=0;i<pts.size()-1;i++){
            line(pts.get(i).x,pts.get(i).t,pts.get(i+1).x,pts.get(i+1).y);
                                                                        //第i個與i+1個連成線
        }
     }
    void addPoint(float x,float y){        ///儲存向量的方法
        PVector pt=new PVector(x,y);        //創建一個向量pt(x,y)
        pts.add(pt);        //存入pts裡
  }
}
宣告
Curve curve;
new方法 創造物件
curve=new Curve();

2-2.當滑鼠拖曳時畫線:
void mouseDragged(){
    curve.addPoint( mouseX, mouseY); //把滑鼠點存入curve裡
}
void draw(){
    curve.draw();        //把curve畫出來
}
終點都會指向下一個>>>線無法分段

3.ArrayList<class>好多個物件串成鏈結串列
curve是一個Curve物件

Curve裡有{
    放向量的鏈結串鍊pts
    畫線的方法
    把向量pt存入pts的方法
}

3-1.把線分段
為了把線分段,意即需要好幾段curve、不知道要多少段
------------    如何創造數個curve??    ------------
使用鏈結串列
ArrayList<Curve>curves;        //curves是一個"放很多Curve的鏈結串列"
宣告>創建
3-1.2  for-each循環  for(int i:x)
把每一段都畫出來
for(Curve c:curves){  //for-each循環
                                    ///設置c為第一個curves、第二、第三個...從頭跑到尾
    c.draw();//畫線//對於每一個線段curve都把他畫出來
}
按下滑鼠時分段
void mousePressed(){        //按下滑鼠時,分段
  curve =new Curve();        //創一個新的curve物件
  curves.add(curve);            ///把線段加入curves裡
                                              ///每條線都收在curves鏈結串列之中
}

拖曳滑鼠時 秀出每條線段有多少點
println(curves.size(),"--",curve.pts.size() );        //輸出一行 就不用換行了


4.實作
4-1.墨水量  
每次結束線段//釋放滑鼠時,累加線段點的總數
points_size+=curve.pts.size();
貼上之前寫好的Ink();
4-2.開始遊戲按鈕
設定開關
boolean playing=false;
在所有畫線的功能前 加上條件 (Playing&&有墨水)

4-3.不可畫的範圍
定義一個物件Noline{
        顯示不能畫的區域//秀出矩形
        規定畫線&不能畫線
}
宣告與使用
NoLine zone;
zone=new NoLine();

4-4.清除所有線//重畫按鈕
鏈結串列:指向下一個,
若正著刪、要刪除第一個需要先跑到最後一個(因為最後一個指向第一個)
每刪除一個;整串都要往前位移一次
清空鏈結串列:倒著刪除
curves是有很多curve的鏈結串列;
curve是有很多向量(pts)的鏈結串列;
>>>雙層迴圈、由裡面刪到外面、倒著刪除



沒有留言:

張貼留言