手机对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位置,既妙点画圆法
}
}