⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameutils.java

📁 最近弄的一个跨栏小游戏
💻 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 + -