日期:2014-05-20  浏览次数:20721 次

手机对RGB象素处理以及对浮点运算
小弟刚学j2me1个多月,刚利用半个月的时间做了一款2d竖屏飞行射击游戏,开发工具为eclipes,一开始开发还算比较顺利,但是在最后利用eclipes打包的时候出现了很多问题.
1   我一开始使用的logo图片采用的是闪屏效果,也就是一个图标从透明到清晰再到透明,在eclipes上运行非常顺利,但是打包出来后,就没有闪屏效果了,就是一个图片突然出现又突然消失,本人用的手机模拟器是MidpX安装上的,请问这种情况是因为模拟器版本太旧?还是基本上现在的大部分手机都不支持象素处理?]


附上代码:
protected   void   drawLogo(Image   img){       //通过2.0处理RGB方式绘制开始logo的闪屏效果
        wOflogo=img.getWidth();//获取图片的宽度
hOflogo=img.getHeight();//获取图片的高度
px=new   int[wOflogo*hOflogo];
img.getRGB(px,0,wOflogo,0,0,wOflogo,hOflogo);//获取图片的像素

for(int   i=0;i <px.length;i++)
{
int   r=(px[i]> > 16)&255;
int   g=(px[i]> > 8)&255;
int   b=px[i]&255;
px[i]=alpha < <24|r < <16|g < <8|b;
}

bufg.setColor(0xffffff);
bufg.fillRect(0,0,sw,sh);//白屏

if(logobestRGB)
{
alpha+=10;
if(alpha> =255)       //画到最亮的时候
{
alpha=255;
logobestRGB=false;
}
}else
{
alpha-=10;
if(alpha <=0)       //画到最暗的时候
{
alpha=0;
chooselogo=2;
}
}
bufg.drawRGB(px,0,wOflogo,(sw-wOflogo)/2,(sh-hOflogo)/2,wOflogo,hOflogo,true);
}

2   由于本人一开始对于手机规范不太清楚,只是按照自己的想法开发手机游戏,在本人的射击游戏中,射击到了跟踪射击,定角度射击以及画圆算法,以上算法我全部引入了double型变量,运用比例关系以及Math.sin,cos来计算,在计算机上运行一点问题都没有,但一打包就傻了眼,有的模拟器直接提示 "floating   point   not   supported "就退出,有的就是黑屏没任何反应,即使在规范里调成cldc1.1也没用.现在我已经了解到基本上大部分的手机都不支持cldc1.1浮点运算,打算把所有浮点运算全部消除,但我并不想放弃跟踪射击,定角度射击以及画圆,就想改一下功能函数,请教达人,这些部分函数都可以怎么修改才能不射击到double,而且使精度损失减到最小?

附上代码:
            //跟踪函数
            public   void   getObjPosition(double   myplaneX,double   myplaneY){     //计算出到目标点所需要的x速度和y速度
        double   distanceX=myplaneX-this.x;   //myplanX为目标点x位置
          double   distanceY=myplaneY-this.y;//myplanY为目标点y位置
          double   distance=Math.sqrt(distanceX*distanceX+distanceY*distanceY);
         
          speedX=distanceX*speedline/distance;
          speedY=distanceY*speedline/distance;
            }


            //以arc角度发射子弹
            public   void   arcFire(double   arc){    

        speedX=speedline*Math.cos((arc%361)*MainCan.degtorad);
                speedY=-speedline*Math.sin((arc%361)*MainCan.degtorad);
          //MainCan.degtorad为主类中定的static从角度到弧度的转换值
            }


//画圆算法
        public   void   getArcPosition(int   r,int   centerX,int   centerY,int   num){     //r为半径,centerX,centerY为圆心坐标,num为分多少快描点
        for(int   i=0;i <num;i++){
        int   poX=centerX+(int)(r*Math.cos(i*(360/num)*MainCan.degtorad));
        int   poY=centerY-(int)(r*Math.sin(i*(360/num)*MainCan.degtorad));
        arcposition[i][0]=poX;
        arcposition[i][1]=poY;//arcposition[][]为已定义好的用来存储找到的点的x位置和y位置,既妙点画圆法
        }
        }