Search

2012年6月22日 星期五

洗雙面電路板

    洗雙面電路板很簡單,先把兩個面的投影片印出來然後對準用釘書針釘起來。



    接著把雙面感光電路板放到兩張釘好的投影中間對準,然後用兩片壓克力板夾住接著拿去用檯燈曝光,然後一次曝光一面分為兩次曝光。



    接著顯影還有蝕刻的流程就都跟洗單面板一樣了,這是喬治查爾斯大大站上的DAC電路,最近剛好要來研究PCM2706就順便洗雙面板了。




完成!



2012年6月18日 星期一

德州儀器的效率超高!

    幾天前跟TI申請一些IC沒想到今天就收到FedEx的包裹了,而且還只是樣品而已!運費關稅都由TI負擔然後這次申請PCM * 3、OPA * 1、ADC * 1這些IC在露天拍賣買大概要NTD:1000up,預計接下來要再跟TI買些IC,以前跟台灣某某某廠買萬把塊的零件居然要一個多禮拜才收到...如果想跟TI申請樣品直接上他們的官方網站註冊帳號,然後搜尋想要的樣品,不一定每一種都有樣品可以申請,至於公司我想應該填寫學校就可以了,我是填寫以前案子客戶的公司。



2012年6月17日 星期日

nWay彈

    nWay就是擴散彈,如果要朝某個角度範圍發射n顆子彈,例如120~160度發射5顆子彈,那就可以知道160 - 120 = 40度,然後40 / 5 = 8度,所以從120~160度每8度發射一個子彈,然後要發射一圈就可以將範圍設定為0 ~360度,如果想增加遊戲性可以改變每顆子彈的發射速度讓它們看起來像是漩渦一樣,或者第一次發射時是從0 ~360度然後第二次發射是從5~5度(下一圈),而且每次每個子彈間隔角度都一樣,這樣第一次發射的子彈與第二次發射的子彈就會有交錯的效果等等...還可以改變很多參數就可以變成很多種新的花樣。

DEMO1


DEMO2

瞄準彈

瞄準彈就是由A點到B點移動,只要求得兩點的距離然後將距離除以一個速度就可以得到每次更新移動的距離等份,然後將兩個點的X座標以及Y座標的差帶入atan2(dx,dy)可以求得兩點的角度(C++以及Java的Math Library有相關的函數),所以將X軸加上cos(atan2(dx,dy)) * (distance / speed)而Y軸加上sin(atan2(dx,dy)) * (distance / speed)即可讓子彈從A點移動到B點,但是要注意的是這個公式會是等時的,也就是說假設A點距離B點比C點距離B點遠,但是當A以及C兩點同時朝B點發射子彈,兩個子彈會同時間到達B點,所以A點子彈會比C點發射的快,因為distance遠所以除以speed時的每個Frame的更新等份比較大,所以可以distance限制在例如當距離超過多少時限制在一個最大值,以及要將距離限制一個最小值否則兩點太近會使子彈移動速度太慢,以下DEMO可以看AimBullet類別的Update方法有其移動演算法,以及AimBullet類別的建構式有將distance初始時限制在一個範圍,然後如果將這個演算法改成每次更新時都要重新取得目標的座標,這樣就可以有導彈的效果,不過要記得將取樣次數限制在一定次數,否則這個子彈最後必定會擊中目標。

DEMO

2D-STG

    基本上2D-STG很好寫,我覺得比AVG還好寫,不過主要還是關卡編排要編排的好玩比較有難度不然其實很簡單,去年因為作業要接觸到Java所以配著Document用兩、三個小時寫個簡單的STG來從零熟悉Java,所以我直接用Java版本(我是把高中寫的C++版轉成Java)做說明還可以馬上看結果比較快。

DEMO


1.Object:

        基本上先簡易分為子彈與飛機兩種父類別,然後例如C++可以將其宣告為pure virtual或者Java的abstract,在由一些延伸去繼承這兩者並且實做自己的方法,例如擴散彈繼承子彈然後實做自己的子彈演算法,或者小兵機繼承飛機然後實做自己的攻擊方式或是移動方式等等...以下直接複製上面DEMO的Source Code:


abstract class BaseObject
{
   public double x,y,speed;

   public boolean Remove(){return false;}

   abstract public void Draw(Graphics g);
   abstract public void Update();
}

abstract class Plane extends BaseObject
{
   public double hp;

   public void Update(){}
   public void Update(double move_x,double move_y){}

   public double GetX(){return this.x;}
   public double GetY(){return this.y;}
 
   public int Fire(List Bullet){return 0;}
   public int Fire(List Bullet,double tx,double ty){return 0;}
}

abstract class Bullet extends BaseObject
{
   public double power;

   public boolean HitTest(double tx,double ty)
   {
      if(tx < this.x + 5 &&
     tx + 20 > this.x + 5 &&
     ty < this.y + 5 &&
     ty + 20 > this.y + 5){
  return true;
      }
      return false;
   }
}


2.Manager

        對於物件的管理最簡單的方法是使用STL的List,因為基本上遊戲中所有物件每個Frame都必須被更新所以使用List可以得到比較好的效能,例如C++可以std::list<Bullet>或者Java可以List<Bullet>,然後如果有新的物件要增加就使用push_back(Bullet)或是add(Bullet)之類的方法,而當飛機被摧毀或是子彈跑出畫面外就可以使用remove(iterator)之類的方法將之消除,然而一個遊戲會有很多子彈以及敵機,針對每種寫一個迭代有點太累人,所以可以直接std::list<std::list<Bullet> >或者List<List<Bullet> >,然後push_back(std::list<Bullet>)或add(List<Bullet>),將上面的各種類型的子彈以及飛機的List集中管理寫一次迭代每次更新即可,如果不要使用STL也可以自己實做個Memory Pool以及相應的演算法也可以,有的人用靜態陣列是非常不好的,一個是物件數量在編譯時期就確定,而且不論有多少物件都必須迭代完整個陣列會使效能非常差。

3.Algorithm
        
        物件在平面的移動的方法可以將X軸加上cos(angle)而Y軸要加上sin(angle),三角函數使用相應的Math Library即可,另外要注意的是大多都是傳入弧度值(C++跟Java都是),所以C++如果使用D3DX可以用D3DXToRadian(angle)或者Java的Math.toRadians(angle)方法取得傳入角度的弧度值,當然也可以自己將角度乘上 π / 180 即可得到弧度。

4.Frame Buffer

        一般俗稱的FPS即Frame Per Second在STG遊戲維持50以上才會順暢,然後為了防止更新閃爍可以自己實做一個類似D3DX或者OpenGL的Front Buffer & Back Buffer。


5.ETC

        其實STG的子彈演算法可以套用在類似洛克人之類的ATC遊戲上,然後要實做背景捲軸可以用D3DX或者OpenGL之類的,當主角位置改變時就改變背景貼圖的轉換矩陣的位移即可,背景圖要比畫面大,然後要確定角色移動所看到的背景不會大出這張背景。