`
鸟哥哥
  • 浏览: 98195 次
  • 性别: Icon_minigender_1
  • 来自: 梅州兴宁
社区版块
存档分类
最新评论

鸟哥,射击游戏技术分享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也可以搞定,内存和精度其实就是个矛盾体,网友使用时,自己均衡考虑。

 

分享到:
评论
14 楼 鸟哥哥 2010-06-29  
puhao7117441 写道
哦错了,45*4字节哦……

这点就是要交给自己均衡了,选择时各不一样:回复中已有人提到用byte了,ls的意见也就是提到用int了。
13 楼 puhao7117441 2010-06-29  
哦错了,45*4字节哦……
12 楼 puhao7117441 2010-06-29  
都有点久了也,还是问一下,我仿佛在某处看到说用short的时候,最后计算的时候,short转int还是需要额外时间的,这样的话,为了在这个sin对应数组里节约45个字节的空间导致最后计算的时候多出一两个指令周期的,会不会有点不值呢?
11 楼 zovikoo 2010-04-22  
当年写台球游戏时,全物理模仿用到sin cos tan的角度精度数组,这三个数组其中之一就是LZ提供的内个,下标代表角度,值就是你想要的,的确很不错的说,其实我们完全不用做到分毫不差的画一个圆,近似于就可以了,除非策划BT到疯子地步````
10 楼 鸟哥哥 2010-03-31  
xmj101 写道
老大,製作個PDF吧

嗯,适当的时候再做吧,现在写的文章水平有限,分享1,2都差不多是隐藏贴的水平,愧对观众啊。一些入门资料,遇到过的技术问题和一些解决方案,差不多都写在blog上了,再进步进步才配得上导出成pdf。
9 楼 xmj101 2010-03-31  
老大,製作個PDF吧
8 楼 鸟哥哥 2010-03-12  
tapestry1122 写道
相当年用的是俄罗斯人写的一个浮点库,精度确实高,在模拟器上没觉得什么,结果上真机后速度那个慢啊,最后只有废弃

有同感,有时手机应用也不必那么精确,自己单独写出几个运算来就行了。
7 楼 lzyzizi 2010-03-08  
路过,支持技术分享。。。
抱歉,想点收藏的时候点了下隐藏贴。。。
6 楼 tapestry1122 2010-03-06  
相当年用的是俄罗斯人写的一个浮点库,精度确实高,在模拟器上没觉得什么,结果上真机后速度那个慢啊,最后只有废弃
5 楼 鸟哥哥 2010-03-05  
stone0591 写道
我是用255,256要用short存
private static int sin(int angle) {
byte[] SINES = { 0, 4, 8, 13, 17, 22, 26, 31, 35, 39, 44, 48, 53, 57,
61, 65, 70, 74, 78, 83, 87, 91, 95, 99, 103, 107, 111, 115,
119, 123, 127, -125, -121, -118, -114, -110, -107, -103, -100,
-96, -93, -89, -86, -83, -79, -76, -73, -70, -67, -64, -61,
-58, -56, -53, -50, -48, -45, -43, -40, -38, -36, -33, -31,
-29, -27, -25, -24, -22, -20, -18, -17, -15, -14, -13, -11,
-10, -9, -8, -7, -6, -5, -5, -4, -3, -3, -2, -2, -2, -2, -2, -1 };
angle %= 360; // 360 degrees
if (angle < 0) {
angle += 360;
}
if (angle <= 90) { // 0..90 degrees
return SINES[angle] & 0xff;
} else if (angle <= 180) { // 90..180 degrees
return SINES[180 - angle] & 0xff;
} else if (angle <= 270) { // 180..270 degrees
return -SINES[angle - 180] & 0xff;
} else { // 270..360 degrees
return -SINES[360 - angle] & 0xff;
}
}

很好,谢谢哈,学习了!
4 楼 stone0591 2010-03-05  
我是用255,256要用short存
private static int sin(int angle) {
byte[] SINES = { 0, 4, 8, 13, 17, 22, 26, 31, 35, 39, 44, 48, 53, 57,
61, 65, 70, 74, 78, 83, 87, 91, 95, 99, 103, 107, 111, 115,
119, 123, 127, -125, -121, -118, -114, -110, -107, -103, -100,
-96, -93, -89, -86, -83, -79, -76, -73, -70, -67, -64, -61,
-58, -56, -53, -50, -48, -45, -43, -40, -38, -36, -33, -31,
-29, -27, -25, -24, -22, -20, -18, -17, -15, -14, -13, -11,
-10, -9, -8, -7, -6, -5, -5, -4, -3, -3, -2, -2, -2, -2, -2, -1 };
angle %= 360; // 360 degrees
if (angle < 0) {
angle += 360;
}
if (angle <= 90) { // 0..90 degrees
return SINES[angle] & 0xff;
} else if (angle <= 180) { // 90..180 degrees
return SINES[180 - angle] & 0xff;
} else if (angle <= 270) { // 180..270 degrees
return -SINES[angle - 180] & 0xff;
} else { // 270..360 degrees
return -SINES[360 - angle] & 0xff;
}
}
3 楼 鸟哥哥 2010-03-05  
newthinker 写道
你这个实现在手机上未必就好,可以考虑使用256度系统。虽然精度差了,但是手机屏幕很小,完全可以忽略,而且你知道256的好处。。。没个象限64度。想想吧。。。

这个已经在手机上跑起来了,根据公司有的机器,移植了25款,其中中屏E398都过,行内人都应该知道,如果E398都过了,中屏以上机器没有过不了的。
ls所说的256度系统,还想请教,小的真不知这系统啥来的。谢谢哈!
2 楼 鸟哥哥 2010-03-04  
shizhiwu 写道
short[] sins  这个数组是不是跟度数对应呢?

对,0到90角度做数组下标取对应值,同样有提高速度功效。代码不多,精妙之处应该还不少。
1 楼 shizhiwu 2010-03-04  
short[] sins  这个数组是不是跟度数对应呢?

相关推荐

    鸟哥的私房菜1

    鸟哥的私房菜,还不错,看看吧,文件太大,分割成三个,2,3的链接是 http://download.csdn.net/source/387484 http://download.csdn.net/source/387487

    linux鸟哥全套资料

    《Linux鸟哥全套资料》包含了两本经典的Linux学习书籍——基础版与服务器版,是Linux初学者和进阶者不可或缺的资源。这份压缩包不仅提供了完整的电子书内容,还附带了其他辅助学习材料,旨在帮助用户深入理解和掌握...

    鸟哥linux服务篇

    1. **Linux系统基础**:在开始深入服务篇之前,鸟哥首先介绍了Linux操作系统的基本概念,包括Linux发行版的选择、安装过程、用户与权限管理,以及文件系统结构等基础知识,为后续的学习打下坚实的基础。 2. **网络...

    鸟哥 鸟哥 Linux

    《鸟哥的Linux私房菜》是一本深受Linux爱好者欢迎的教材,分为基础篇和服务器篇,第三版在原有的基础上进行了更新和完善,旨在帮助读者深入理解和掌握Linux操作系统。该书由"鸟哥"编写,以其通俗易懂的语言和丰富的...

    鸟哥的linux(全套pdf)

    《鸟哥的Linux私房菜》是一本深受Linux爱好者欢迎的入门教程,它以其通俗易懂、...无论你是要成为系统管理员、开发人员还是单纯的技术爱好者,这本书都会提供丰富的知识和实用技巧,帮助你在Linux的世界里游刃有余。

    鸟哥的私房菜

    1. Linux简介:了解Linux的历史、发行版分类以及与Unix的关系,掌握Linux的核心哲学——“一切皆为文件”。 2. Linux安装:包括虚拟机安装、硬盘安装、网络安装等多种方式,让你熟悉Linux系统的部署过程。 3. ...

    鸟哥SQL常用命令.rar

    "鸟哥"是网络上一位知名的IT教育者,他的教程通常深入浅出,易于理解。"鸟哥SQL常用命令"这个资源可能是一个包含了他在教学中总结的SQL基础操作和常见用法的压缩包文件。下面我们将详细探讨SQL的一些核心概念和常用...

    鸟哥linux服务器架设篇

    鸟哥linux服务器架设篇 mobi 鸟哥linux服务器架设篇 mobi

    鸟哥的私房菜简体中文版

    随着技术的发展,其他文件系统如EXT3、EXT4、XFS等也在不断更新,以满足更大存储容量和更高效性能的需求。这些文件系统支持各种文件操作命令,如mkfs、fsck、mount等。 Linux操作系统安装过程中,BIOS与CMOS设置是...

    鸟哥PHP鸟哥PHP鸟哥PHP

    #### 示例 1:`calc()` 函数 ```php function calc($a, $b) { $a = $a * 2 % 1000; $b = $b * 3 % 1000; return $a + $b; } ``` 这个函数接收两个参数 `$a` 和 `$b`,分别计算它们乘以 2 和 3 后对 1000 取模的...

    鸟哥的linux私房菜

    《鸟哥的Linux私房菜》是一本面向Linux学习者的经典教材,它不仅提供了Linux系统的基础知识,还包含了大量实用的操作技巧和命令参考,非常适合初学者和希望系统学习Linux的用户。从提供的内容片段来看,这本书中涉及...

    鸟哥的私房菜linux

    鸟哥的私房菜linux 关于linux初学者很好的教材

    鸟哥的Linux 私房菜 基础学习篇.mobi

    鸟哥的Linux 私房菜 基础学习篇.mobi,鸟哥的Linux 私房菜 基础学习篇.mobi

    Linux鸟哥 私房菜

    《Linux鸟哥私房菜》是一本深受Linux爱好者和专业人士喜爱的经典教程,它全面而深入地介绍了Linux操作系统。这本书不仅适合初学者入门,也适合有经验的Linux用户深化理解和提升技能。书中涵盖的内容广泛,包括了...

    Weibo LAMP演变-鸟哥

    鸟哥,即惠新宸,是中国知名的IT专家,尤其在Linux和开源技术领域有深厚的造诣,他的分享通常包含丰富的实践经验和技术洞见。 【描述】:“这是鸟哥在上海分享的ppt” 这句话表明这个压缩包里包含的是鸟哥在上海某...

    kindle鸟哥的私房菜mobil 版本

    kindle鸟哥的私房菜mobil 版本,网上的积分收费太贵了。

    鸟哥的私房菜电子版_part1

    鸟哥的私房菜电子版 Linux基础知识 经典中的经典

Global site tag (gtag.js) - Google Analytics