鳥哥,射擊遊戲技術分享1

可先參見遊戲圖片和視頻

鳥哥,在論壇裏承諾過,有空會把相關技術展現出來,今天有空就提提吧。這裏不會提供完整代碼,僅僅用於算法交流。我想到哪就寫哪些吧,一個遊戲,相關的東西也是很多的。 先提提cldc1.0吧。

一、浮點運算處理

cldc1.0要求我們在遊戲開發中,不能使用浮點數,可是對於射擊遊戲,有很多運算要用到,那怎麼辦?下面會提到。至於爲什麼一定要用cldc1.0?那就和移植有關係了,當前主流用戶用的是不支持cldc1.1浮點運算的手機,公司考慮到用戶量,定位於cldc1.0,當然,目前絕大多數遊戲定位都是cldc1.0的。這裏再扯遠一點,像有些做3d遊戲的,如果用了自帶的可選3d api,就要求一定要支持cldc1.1,那麼用戶定位就是稍高端一點機器用戶了,覆蓋面將減少很大一部分,像上百寶箱等因爲都對移植機型數量有一定要求,決策確實需要慎重。

 沒有了浮點數,就沒有sinx,cosx函數,沒有了1/2=0.5,當運算時,j2me的做法都是先放大,後縮小。舉例,如sin1(弧度制)=0.01745240....,先把(sin1 )* n算出來,再除於n,這樣就不會丟失那麼多精度。原理就是如此。

遊戲中對sinx,cosx 採用角度制,放大陪數爲2的14次方倍,用工具計算出0到90度的值放數組裏,共91個值。至於爲什麼,有3點:

a 因爲如果用了2的次方,就可以直接用移位做運算,嚴重提高速度!

b 這些值放大以後,還能在一個short類型裏放得下,而不必用int,小2字節,91個值就相當於182字節。一個short類型16個位,放到2的15次方,一不小心就變負值了,不可,不可,所以選擇2的14次方。

c 其他角度的sinx,cosx用這91個值做數學變換即可。

下面給出這方面的源碼:

感興趣的網友可以用源碼研究:

 

//角度制
    //取得結果後,把最終結果>>14
    //如int a = 100; b = a * sin(1) >> 14;
    public static int sin(int x)
    {
        int degree = (360 + x % 360) % 360;
        if(degree >= 0 && degree <= 90)
        {
            return sins[degree];
        }
        else if(degree > 90 && degree <= 180)
        {
            return sins[180 - degree];
        }
        else if(degree > 180 && degree <= 270)
        {
            return -sins[degree - 180];
        }
        else
        {
            return -sins[360 - degree];
        }
    }

    public static int cos(int x)
    {
        return sin(90 - x);
    }

    static short[] sins = new short[]
    {
        0,286,571,856,1143,1428,1712,1997,2280,2562,2844,3126,3406,3686,3963,
        4240,4515,4790,5062,5334,5603,5872,6137,6401,6663,6923,7182,7438,7692,
        7942,8192,8437,8681,8922,9161,9397,9630,9859,10087,10310,10531,10749,
        10962,11173,11381,11585,11785,11983,12174,12365,12550,12732,12910,13084,
        13254,13421,13582,13741,13893,14044,14188,14329,14465,14598,14725,14848,
        14966,15081,15191,15296,15396,15491,15582,15668,15749,15825,15897,15964,
        16025,16082,16134,16182,16225,16261,16293,16321,16344,16361,16374,
        16380,16384
    };
 

 如果有用到上面代碼的網友,請在註釋裏寫上javaeye鳥哥,呵呵。

如有問題,歡迎提。謝謝

從下面的跟貼中,其實可以發現,是角度精確和內存大小問題,用byte可以搞定(下面有代碼),用short也可以搞定,內存和精度其實就是個矛盾體,網友使用時,自己均衡考慮。

 

發佈了28 篇原創文章 · 獲贊 1 · 訪問量 3208
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章