为什么下面的代码 不能改动

xiayuner 2009-11-28 04:46:12
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.*;

public class C extends Canvas implements Runnable
{
private static final int SCREEN_W = 240; //屏幕宽
private static final int SCREEN_H = 320; //屏幕高
private static final int MID_X = SCREEN_W >> 1; //屏幕中点,也是屏幕宽度的一半
private static final int MID_Y = SCREEN_H >> 1; //屏幕中点,也是屏幕高度的一半

private static final int SPF = 30; //线程休眠周期

private static final int TOTAL_ITEM = 6; //菜单选项总数
private static final int FULL_ANGLE = 360; //一个圆周的角度
private static final int PER_ITEM_ANGLE = FULL_ANGLE / TOTAL_ITEM; //每两个临近选项之间的夹角
private static final int START_ANGLE = 270;

private static final int MENU_ROLL_STEP = 15; //菜单每旋转一次的步数
private static final int DEST_ANGLE = PER_ITEM_ANGLE / MENU_ROLL_STEP; //每一步旋转的角度

private static final int MENU_LEFT = 0; //顺时针旋转
private static final int MENU_RIGHT = 1; //逆时针旋转
private int roll_direction; //菜单旋转方向
private boolean rolling = false; //菜单是否正在旋转

private Image[] imgMenuItem = new Image[TOTAL_ITEM];

private int curRollStep = 0;
private int curMenuCursor = 0;

private static final int[] MENU_ITEM_ANGLE = {
270, 330, 30, 90, 150, 210
};

private int[] menuItemAngle = MENU_ITEM_ANGLE;

public C()
{
setFullScreenMode(true);
for (int i = 0; i < imgMenuItem.length; i++)
{
imgMenuItem[i] = initImage("/" + i + ".png");
}
new Thread(this).start();
}

private static final Image initImage(String s)
{
Image ret = null;
try
{
ret = Image.createImage(s);
} catch(Exception e)
{
System.out.println("load Image : " + s + " error!");
}
return ret;
}

protected void paint(Graphics g)
{
g.setClip(0, 0, SCREEN_W, SCREEN_H);
g.setColor(0x444444);
g.fillRect(0, 0, SCREEN_W, SCREEN_H);
drawMenu(g);
}

private static final int[][] ROLL_EFFECT = {
{1, 1},
{1, 2}, {1, 3}, {1, 4},
{2, 1}, {3, 1}, {4, 1},
{1, 2}, {2, 1},
};

private int roll_mode;

private void drawMenu(Graphics g)
{
if (curRollStep < MENU_ROLL_STEP && rolling)
{
for (int i = 0; i < menuItemAngle.length; i++)
{
if (roll_direction == MENU_LEFT)
{
menuItemAngle[i] -= DEST_ANGLE;
} else
{
menuItemAngle[i] += DEST_ANGLE;
}
}
curRollStep++;
} else
{
rolling = false;
}

final int r = (MID_X >> 2) * 3; //旋转半径

final int max_w = imgMenuItem[0].getWidth(); //缩放的尺寸上限
final int max_h = imgMenuItem[0].getHeight();
final int min_w = max_w >> 1; //缩放的尺寸下限
final int min_h = max_h >> 1;

sortMenuItem();

for (int j = 0; j < imgMenuItem.length; j++)
{
int i = itemId[j];
int angle = getAngle(menuItemAngle[i], START_ANGLE);

int item_w = max_w - (max_w - min_w) * angle / 180;
int item_h = max_h - (max_h - min_h) * angle / 180;

if (roll_mode < 7)
{
g.drawImage(zoomImage(imgMenuItem[i], item_w, item_h),
(MID_X + getXByR(r, menuItemAngle[i] / ROLL_EFFECT[roll_mode][0])),
(MID_Y + getYByR(r, menuItemAngle[i] / ROLL_EFFECT[roll_mode][1])),
3);
} else
{
g.drawImage(zoomImage(imgMenuItem[i], item_w, item_h),
(MID_X + getXByR(r, menuItemAngle[i]) / ROLL_EFFECT[roll_mode][0]),
(MID_Y + getYByR(r, menuItemAngle[i]) / ROLL_EFFECT[roll_mode][1]),
3);
}
}
}

private int[] itemId = {0, 1, 2, 3, 4, 5};

private void sortMenuItem()
{
for (int i = 0; i < itemId.length - 1; i++)
{
for (int j = i + 1; j < itemId.length; j++)
{
if (getAngle(menuItemAngle[itemId[i]], START_ANGLE) < getAngle(menuItemAngle[itemId[j]], START_ANGLE))
{
int t = itemId[i];
itemId[i] = itemId[j];
itemId[j] = t;
}
}
}
}

/** 将图片缩放到指定尺寸 */
private static Image zoomImage(Image img_in, int w_out, int h_out)
{
int w_in = img_in.getWidth();
int h_in = img_in.getHeight();
int rgb_in[] = new int[w_in * h_in];
img_in.getRGB(rgb_in, 0, w_in, 0, 0, w_in, h_in);

int rgb_out[] = new int[w_out * h_out];
for (int y_out = 0; y_out < h_out; y_out++)
{
int y_in = y_out * h_in / h_out;
for (int x_out = 0; x_out < w_out; x_out++)
{
int x_in = x_out * w_in / w_out;
rgb_out[(w_out * y_out) + x_out] = rgb_in[(w_in * y_in) + x_in];
}
}
return Image.createRGBImage(rgb_out, w_out, h_out, true);
}

public void run()
{
long start, end, space;
while (true)
{
start = System.currentTimeMillis();

repaint();
serviceRepaints();

end = System.currentTimeMillis();
space = end - start;
if (SPF > space)
{
try
{
Thread.sleep(SPF - space);
} catch (Exception e)
{
}
} else
{
Thread.yield();
}
if (autoRoll)
{
keyPressed(-4); //每循环自动向右旋转
}
}
}

private boolean autoRoll = true;

protected void keyPressed(int keycode)
{
switch(keycode)
{
case '0':
roll_mode = 0;
menuItemAngle = MENU_ITEM_ANGLE;
break;

case '1':
roll_mode = 1;
menuItemAngle = MENU_ITEM_ANGLE;
break;

case '2':
roll_mode = 2;
menuItemAngle = MENU_ITEM_ANGLE;
break;

case '3':
roll_mode = 3;
menuItemAngle = MENU_ITEM_ANGLE;
break;

case '4':
roll_mode = 4;
menuItemAngle = MENU_ITEM_ANGLE;
break;

case '5':
roll_mode = 5;
menuItemAngle = MENU_ITEM_ANGLE;
break;

case '6':
roll_mode = 6;
menuItemAngle = MENU_ITEM_ANGLE;
break;

case '7':
roll_mode = 7;
menuItemAngle = MENU_ITEM_ANGLE;
break;

case '8':
roll_mode = 8;
menuItemAngle = MENU_ITEM_ANGLE;
break;

case '9':
autoRoll = !autoRoll;
break;
}
if (rolling)
{
return;
}
switch (keycode)
{
case -4:
roll_direction = MENU_RIGHT;
curMenuCursor--;
if (curMenuCursor < 0)
{
curMenuCursor = 5;
}
curRollStep = 0;

rolling = true;
break;

case -3:
roll_direction = MENU_LEFT;
curMenuCursor++;
if (curMenuCursor > 5)
{
curMenuCursor = 0;
}
curRollStep = 0;

rolling = true;
break;
}
}

public final int cos256(int angle)
{
return sin256(angle + 90);
}

public final int sin256(int angle)
{
int d = angle < 0 ? -1 : 1;
angle = Math.abs(angle % 360);
if (angle <= 90)
{
return SIN[angle] * d;
} else if (angle <= 180)
{
return SIN[180 - angle] * d;
} else if (angle <= 270)
{
return -SIN[angle - 180] * d;
} else
{
return -SIN[360 - angle] * d;
}
}

/** 正弦表0~90度 */
private static final short SIN[] = {
0, 4, 8, 13, 17, 22, 26, 31, 35, 40,
44, 48, 53, 57, 61, 66, 70, 74, 79, 83,
87, 91, 95, 100, 104, 108, 112, 116, 120, 124,
127, 131, 135, 139, 143, 146, 150, 154, 157, 161,
164, 167, 171, 174, 177, 181, 184, 187, 190, 193,
196, 198, 201, 204, 207, 209, 212, 214, 217, 219,
221, 223, 226, 228, 230, 232, 233, 235, 237, 238,
240, 242, 243, 244, 246, 247, 248, 249, 250, 251,
252, 252, 253, 254, 254, 255, 255, 255, 255, 255,
256
};

/** 获得两个角度之间的夹角 */
private final int getAngle(int angle_1, int angle_2)
{
int ret = Math.abs((angle_1 % 360) - angle_2) % 360;
if (ret > 180)
{
ret = 360 - ret;
}

return ret;
}

/** 通过半径和角度获得横坐标 */
private final int getXByR(int r, int angle)
{
return (r*cos256(angle))>>8;
}

/** 通过半径和角度获得纵坐标 */
private final int getYByR(int r, int angle)
{
return -((r*sin256(angle))>>8); //直角坐标系的Y轴和屏幕坐标系的Y轴上下相反
}
}
...全文
38 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiayuner 2009-11-28
  • 打赏
  • 举报
回复
不管怎么该都有错 甚至于敲一个空格
更不用说其他该法了
JavaAlpha 2009-11-28
  • 打赏
  • 举报
回复
哪里不可以改呢?你想改什么? 与什么错误?

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧