📄 gameutils.java
字号:
import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
public class GameUtils {
/**
* 分行绘制字符串
* @param g 画笔
* @param str 需要绘制的字符串
* @param font 需要设定的的字体,如为null,采用默认
* @param color 字体颜色
* @param sx 开始绘制的x坐标
* @param sy 开始绘制的y坐标
* @param w 绘制范围的宽度
* @param h 绘制范围的高度
* @param currRow 当前行数,从0开始
* @param border 行的间隔
*/
public static void drawString(Graphics g,String str,Font font,int color,int sx,int sy,int w,int h,int currRow,int border){
if(font!=null)
g.setFont(font);
else
font = Font.getDefaultFont();
g.setColor(color);
int charH = border;//font.getHeight();
int Wsize = 0; //记录字体宽
int Hsize = 0; //记录字体高
int nRow = h/charH-1; //总行数
Vector v = new Vector();
v.addElement(new Integer(0));
for(int lastIndex=0; lastIndex<str.length(); ){
char c = str.charAt(lastIndex);
Wsize += font.charWidth(c); //累加每个字符的宽
lastIndex++;
if(Wsize>=w){
if(Wsize==w)
v.addElement(new Integer(lastIndex)); //加入容器
else{
lastIndex--;
v.addElement(new Integer(lastIndex)); //加入容器
}
Hsize += border;//font.getHeight(); //累加字符高度
Wsize = 0;
}
}
v.addElement(new Integer(str.length())); //截取最后一行子串
//下标越界检测
if(currRow>v.size()-nRow)
currRow = v.size()-nRow;
if(currRow<0)
currRow = 0;
//从指定行开始绘制
int j = 0;
g.setClip(sx, sy, w, h);
for(int i=currRow; i<v.size()-1; i++){
g.drawString(str.substring(((Integer)v.elementAt(i)).intValue(), //起始索引
((Integer)v.elementAt(i+1)).intValue()), //目标索引
sx, sy+j*border, 20);
j++;
}
g.setClip(0, 0, 176, 208); //恢复裁剪区
//绘制游标
int size = 5;
int px = sx+w/2;
int py = sy+h;
if(currRow!=0){ //上
g.fillTriangle(px-size, py+size, px-size/2, py, px, py+size);
}
if(currRow<=(Hsize-h)/charH+2){ //下
g.fillTriangle(px, py, px+size/2, py+size, px+size, py);
}
v.removeAllElements();
g.setFont(Font.getDefaultFont());
}
/**
* 绘制字符串
* @param str 需要绘制的字符串
* @param x 目标x坐标
* @param y 目标y坐标
* @param bd 行宽
* @param g 画笔
*/
public static void drawSTR(String str,int x,int y,int bd,Graphics g){
String temp = str;
int tx = x;
int ty = y;
int end = 0;
int start = 0;
int border = bd; //行的间隔增量
if(bd==0) //如果没设置,采用默认值
border = 15;
while(end!=-1){
temp = str.substring(start, end); //截取子串
g.drawString(temp, tx, ty, 20);
start = end; //使下一次的开始位置为上一次读取的末尾
end = str.indexOf("\n",start+1); //从开始位置的下一位继续寻找
if(start>0)
ty += border;
}
}
/**
* 从BIN文件读取图片资源
* @param binfile BIN文件名
* @param pos 起始图片号
* @param num 需要读取的图片数量
* @param obj 对象,传this
* @return 读取到的图片数组
*/
public static Image[] loadImages(String binfile,int num,Object obj){
try {
Image[] img = new Image[num];
byte[] b;
int len;
// 创建输入流对图象文件进行读取
InputStream is = obj.getClass().getResourceAsStream("/"+binfile);
for(int i=0; i<num; i++){
// 获取长度
len = (is.read() & 0xff) << 24;
len |= (is.read() & 0xff) << 16;
len |= (is.read() & 0xff) << 8;
len |= (is.read() & 0xff);
b = new byte[len];
is.read(b, 0, b.length);
img[num-i-1] = Image.createImage(b, 0, b.length);
}
is.close();
is = null;
System.gc();
return img;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 播放媒体
* @param filename 文件名
* @param soundType 文件类型
* @param loop 是否循环
* @param obj 对象,传this
*/
public static void playSound(String filename,String soundType,boolean loop,Object obj){
InputStream is = obj.getClass().getResourceAsStream("/"+filename);
try {
if(player==null){
player = Manager.createPlayer(is, soundType);
player.realize();
player.prefetch();
}
if(player.getState()!=Player.STARTED){
if(loop)
player.setMediaTime(0);
player.start();
}
} catch (IOException e) {
e.printStackTrace();
} catch (MediaException e) {
e.printStackTrace();
}
}
/**
* 停止媒体播放
*/
public static void stop(){
try {
if(player!=null){
player.stop();
player.close();
player = null;
}
} catch (MediaException e) {
e.printStackTrace();
}
}
private static Player player = null;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -