`
aiquantong
  • 浏览: 112793 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

J2ME游戏只移植到Android平台(一)

阅读更多

为了让J2ME游戏无需大的改动就可以在Android的平台下,我是在利用Android平台的类库拼接成J2ME类,如用Android的canvas类和paint类拼接成J2me的Graphics类,用Bitmap重写J2ME的Image类。最终得到一个中间件包!

 

Font类的代码:

import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Typeface;

//复写J2ME的Font类中的变量和函数
public class Font {

	public static final int FACE_MONOSPACE = 32;
	public static final int FACE_PROPORTIONAL = 64;
	public static final int FACE_SYSTEM = 0;

	public static final int FONT_INPUT_TEXT = 1;
	public static final int FONT_STATIC_TEXT = 0;

	public static final int SIZE_LARGE = 32;
	public static final int SIZE_MEDIUM = 24;
	public static final int SIZE_SMALL = 16;

	public static final int STYLE_BOLD = 1;
	public static final int STYLE_ITALIC = 2;
	public static final int STYLE_PLAIN = 0;
	public static final int STYLE_UNDERLINED = 4;

	//在J2ME的graphics 在android 就是Paint
	//Paint 其实要比graphics 分装的东西要多,包括字体的大小也是有其控制的
	private Paint paint;
	private int face, style, size;

	//measureText 来测量字体的长度
	int charsWidth(char[] ch, int offset, int length) {
		return (int) paint.measureText(ch, offset, length);
	}

	int charWidth(char ch) {
		char[] charArr = new char[1];
		charArr[0] = ch;
		return (int) paint.measureText(charArr, 0, charArr.length);
	}

	int getBaselinePosition() {
		FontMetrics fm = paint.getFontMetrics();
		return (int) fm.bottom;
	}

	private Font() {
		face = FACE_SYSTEM;
		style = STYLE_PLAIN;
		size = SIZE_MEDIUM;
		setPaintAtt(paint);
	}

	private Font(int face, int style, int size) {
		this.face = face;
		this.style = style;
		this.size = size;
		setPaintAtt(paint);
	}

	private Font(Paint paint, int face, int style, int size) {
		setPaintAtt(paint);
	}

	//android 中字体的样式都是由Typeface控制
	public void setPaintAtt(Paint paint) {

		this.paint = paint;
		if (paint == null)
			paint = new Paint();

		switch (face) {
		case FACE_MONOSPACE:
			paint.setTypeface(Typeface.MONOSPACE);
			break;
		case FACE_PROPORTIONAL:
			break;
		case FACE_SYSTEM:
			paint.setTypeface(Typeface.DEFAULT);
			break;
		}
		paint.setAntiAlias(true);
		switch (style) {
		case STYLE_BOLD:
			paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
			break;
		case STYLE_ITALIC:
			paint.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));
			break;
		case STYLE_PLAIN:
			paint.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
			break;
		case STYLE_UNDERLINED:
			// paint.setTypeface(Typeface.SERIF);
			break;
		}
		paint.setTextSize(size);
	}

	public static Font getFont(int face, int style, int size) {
		Font font = new Font(face, style, size);
		return font;
	}

	public static Font getFont(int fontSpecifier) {
		switch (fontSpecifier) {
		case FONT_INPUT_TEXT:
			return getFont(FACE_SYSTEM, SIZE_MEDIUM, STYLE_UNDERLINED);
		case FONT_STATIC_TEXT:
			return getFont(FACE_SYSTEM, SIZE_MEDIUM, STYLE_ITALIC);
		default:
			return new Font();
		}
	}

	public static Font getDefaultFont() {
		return new Font();
	}

	public static Font getFont(Paint paint) {
		Font font = new Font();
		font.paint = paint;
		font.size = (int) paint.getTextSize();
		return font;
	}

	public int getFace() {
		// Typeface tf = paint.getTypeface();
		return 0;
	}

	//这里字体的高度复写了一下,大家请参考一下api
	public int getHeight() {
		FontMetrics fm = paint.getFontMetrics();
		return (int) Math.ceil(fm.descent - fm.ascent);
	}

	public int getSize() {
		return (int) paint.getTextSize();
	}

	public int getStyle() {
		Typeface tf = paint.getTypeface();
		return tf.getStyle();
	}

	public boolean isBold() {
		Typeface tf = paint.getTypeface();
		return tf.isBold();
	}

	public boolean isItalic() {
		Typeface tf = paint.getTypeface();
		return tf.isItalic();
	}

	public boolean isPlain() {
		Typeface tf = paint.getTypeface();
		return tf.isItalic();
	}

	public boolean isUnderlined() {
		return paint.isUnderlineText();
	}

	public int stringWidth(String str) {
		return (int) paint.measureText(str);
	}

	public int substringWidth(String str, int offset, int len) {
		return (int) paint.measureText(str.substring(offset, offset + len));
	}

}

 

 

Image类

import java.io.IOException;
import java.io.InputStream;

import lxs.slg.Game;

import android.content.res.AssetManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;

public class Image {
	//在android 中 图片对象是Bitmap
	private Bitmap img;
	private int alpha;

	private Image() {
		img = null;
		alpha = 0xff;
	}

	private Image(Bitmap img, int alpha) {
		this.img = img;
		this.alpha = alpha;
	}

	private Image(Image source) {
		this.img = source.img;
		this.alpha = source.alpha;
	}

	public static Image createImage(String src) {
		if (src.startsWith("/")) {
			src = src.substring(1);
		}

		//当前的activity对象
		//如下是标准的读取Bitmap方法
		Resources resources = Game.father.getResources();
		AssetManager assetManager = resources.getAssets();
		InputStream in = null;
		Bitmap img = null;
		try {
			in = assetManager.open(src);
			img = BitmapFactory.decodeStream(in);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new Image(img, 0xff);
	}

	public static Image createImage(byte[] imageData, int imageOffset,
			int imageLength) {
		//从byte对象创建一个Bitmap 是由BitmapFactory函数负责的
		Bitmap img = BitmapFactory.decodeByteArray(imageData, imageOffset,
				imageLength);
		return new Image(img, 0xff);
	}

	public static Image createImage(Image source) {
		return new Image(source);
	}

	public static Image createImage(Image image, int x, int y, int width,
			int height, int transform) {
		Bitmap bmp = Bitmap.createBitmap(image.img, x, y, width, height);
		Paint paint = new Paint();
		paint.setAlpha(image.alpha);

		Image tImage = createImage(width, height);
		Canvas canvas = new Canvas(tImage.img);
		//调用Graphics函数 获取旋转矩阵
		Matrix mMatrix = Graphics.getTransformMetrix(transform, width, height);
		//调用如下的函数将其绘制在兴建的Bitmap对象上
		canvas.drawBitmap(bmp, mMatrix, paint);

		return tImage;
	}

	public static Image createImage(InputStream stream) {
		Bitmap img = BitmapFactory.decodeStream(stream);
		return new Image(img, 0xff);
	}

	public static Image createImage(int width, int height) {
		//android 中创建Image 对象的函数
		Bitmap img = Bitmap
				.createBitmap(width, height, Bitmap.Config.ARGB_8888);
		return new Image(img, 0xff);
	}

	public static Image createRGBImage(int[] rgb, int width, int height,
			boolean processAlpha) {
		Bitmap img;
		if (processAlpha) {
			img = Bitmap.createBitmap(rgb, width, height,
					Bitmap.Config.ARGB_8888);
		} else {
			//不需要支持透明的图片,我们采用差分颜色图片点阵标识
			img = Bitmap
					.createBitmap(rgb, width, height, Bitmap.Config.RGB_565);
		}
		return new Image(img, 0xff);
	}

	//获取图片的绘制对象
	public Graphics getGraphics() {
		Canvas canvas = new Canvas(img);
		Paint paint = new Paint();
		paint.setAlpha(alpha);
		return new Graphics(canvas, paint);
	}

	public void setAlpha(int alpha) {
		this.alpha = alpha;
	}

	public int getAlpha() {
		return alpha;
	}

	public Bitmap getImg() {
		return img;
	}

	public int getHeight() {
		return img.getHeight();
	}

	public void getRGB(int[] rgbData, int offset, int scanlength, int x, int y,
			int width, int height) {
		img.getPixels(rgbData, offset, scanlength, x, y, width, height);
	}

	public int getWidth() {
		return img.getWidth();
	}

	boolean isMutable() {
		return img.isMutable();
	}

	public void replaceColor(int newColor, int oldColor) {
		int width = img.getWidth();
		int height = img.getHeight();
		int[] pixels = new int[width * height];
		img.getPixels(pixels, 0, width, 0, 0, width, height);

		for (int i = 0; i < pixels.length; i++) {
			if ((pixels[i] | 0x00ffffff) == (oldColor | 0x00ffffff)) {
				pixels[i] = oldColor;
			}
		}
		img = Bitmap.createBitmap(pixels, 0, 0, height, height,
				Bitmap.Config.ARGB_8888);
	}
}

   

  • 大小: 8.6 KB
分享到:
评论

相关推荐

    J2ME游戏如何移植成android

    作为一名IT行业大师,我将详细地解释J2ME游戏移植到Android平台的技术要点。 首先, lets talk about the differences between J2ME and Android平台。J2ME是一个Java ME平台,主要用于开发移动设备应用程序,而...

    j2me移植Android引擎

    【标题】"J2ME移植Android引擎"涉及的是将基于Java Micro Edition (J2ME) 开发的游戏或应用转换到Android平台的过程。J2ME是Java平台的一个子集,主要用于移动设备和嵌入式系统,而Android则是一个开源的操作系统,...

    J2ME游戏移植到Android手机

    【J2ME游戏移植到Android手机】是一个技术性较强的主题,涉及到两个不同的移动平台:Java ME(J2ME)和Android。J2ME是早期移动设备上广泛使用的开发框架,而Android则是现代智能手机的主要操作系统。当需要将J2ME...

    j2me移植到Android(Ophone)-游戏文档

    目前大多数的手机游戏还是以J2ME平台为主,而OPhone做为一个后起之秀、一个新的手机操作系统,目前上面的软件和游戏还不是很多,但是它有一个很大的优点——也是基于JAVA语言开发。有了这个优点也就意味着所有的J2ME...

    浅谈J2me游戏如何快速移植到Android

    对于许多从事J2ME开发工作的人员而言,可能会突然间面临一个紧迫的需求:那就是将原本在J2ME平台上的游戏移植到Android平台上。乍一看,这似乎是一项庞大且复杂的工程,但事实上,通过合理规划与策略实施,这一过程...

    J2ME游戏移植Android平台要点

    在本文中,我们将深入探讨如何将J2ME游戏移植到Android平台的关键点,以及两者之间的主要差异。 首先,让我们简要了解一下J2ME和Android的基础。J2ME(Java 2 Micro Edition)是Java 2的一个子集,设计用于嵌入式...

    j2me移植到android的代码封装

    当需要将J2ME应用移植到Android时,会遇到一些兼容性问题,因为两者的核心库和API有所差异。本篇文章将深入探讨如何将J2ME中的`Image`、`Font`、`Graphics`等关键类进行封装,以便在Android平台上运行。 首先,我们...

    j2me移植android

    Java 2 Micro Edition(J2ME)是一种专为嵌入式设备和移动设备设计的Java平台,它在功能手机时代广泛应用于开发各种应用程序。...提供的"j2me移植Android.txt"文件可能包含详细的步骤和技巧,建议仔细阅读并参考。

    j2me_android_sdk1.16

    "j2me_android_sdk1.16"便为此目的提供了一个解决方案,它是一个专为Android设计的SDK,允许开发者将J2ME程序移植到Android系统,从而拓宽了应用的受众范围。 该SDK的主要功能在于封装了J2ME API,使得开发者能够...

    j2me移植到android 代码替换开发包 移植利器(版权持有)

    j2me移植到android 代码替换开发包:替换j2me平台的Graphics ,Image ,HttpConntion,RecordStore,Player,Connector,Font,Canvas...

    android J2ME加载器 可以在android机上运行java游戏

    Android平台上的J2ME加载器是一款特殊的软件,它允许用户在Android设备上运行基于Java ME(J2ME)开发的游戏和应用程序。Java ME是Java的一个轻量级版本,主要用于移动设备和嵌入式系统,因此许多早期的移动游戏都是...

    两个小时精通Android开发之界面篇【j2me移植】

    笔者最近需要移植一个J2ME的项目到Android平台上,所以抽空研究了一下Android平台的接口规范。 Android平台除了在一些接口上采用了和J2ME不一样的名称之外,基本的接口内容还是一样的,那么移植J2ME到Android平台最...

    J2ME游戏的基本结构

    在 J2ME 中开发游戏,理解其基本结构至关重要,因为这将直接影响到游戏的性能、可移植性和用户体验。下面我们将深入探讨 J2ME 游戏的基本结构。 一、J2ME 开发环境 J2ME 游戏开发通常需要一个集成开发环境(IDE),...

    Android-development.rar_android_game android J2ME_site:en.pudn.c

    它特别指出,如果你已经有J2ME的基础,这个教程将有助于你理解如何将J2ME的游戏移植到Android平台。J2ME是一种用于开发移动设备和嵌入式系统的Java平台,它的移植性使得许多开发者能将其在J2ME上的作品适应到更现代...

    JAVA-zhuankuai(j2me).rar_J2ME游戏_j2me_j2me 游戏

    游戏可以在支持J2ME的不同设备上运行,只需一次编写,到处运行。 通过研究这个源码,初学者可以了解到J2ME游戏开发的基本流程,同时对于有经验的开发者来说,也是一个回顾旧技术并理解其工作原理的好机会。尽管现代...

    j2me_android_sdk_1.0

    Android下实现的J2ME API类库,使用此SDK可以无缝将你J2ME APP移植成android APP, 支持MIDP2.0、cldc1.0,WMA,jsr75等常用API 20111204更新新版: 1 JAD.MF文件:增加屏幕方向设置 2 JAD.MF文件:增加游戏专用摇杆...

    j2me2android

    1. **J2ME到Android的移植**:项目的核心在于提供了一种机制,使得开发者可以将原本为J2ME平台编写的应用程序移植到Android平台上,无需完全重写。 2. **源代码开放**:作为一个开源项目,"j2me2android"的源代码可...

    ME上Layer,LayerManager,Sprite,TiledLayer移植到android

    总结起来,从J2ME移植到Android涉及到对原概念的重新实现,利用Android的视图系统和绘图API来模拟原有功能。理解并掌握这些概念在Android环境下的应用,是成功完成移植的关键。同时,要注意充分利用Android平台的...

    Android代码-安卓J2ME模拟器

    **Android代码 - 安卓J2ME模拟器** 在移动开发领域,J2ME(Java 2 Micro Edition)曾是广泛应用于早期...同时,对于开发者来说,它也是一个学习和研究Android平台上的模拟技术、跨平台移植以及旧代码复用的宝贵资源。

    android平台中使用j2me MIDP2.0中GameAPI

    在Android平台上,开发游戏时有时会遇到需要复用或移植早期J2ME(Java 2 Micro Edition)MIDP 2.0中的Game API的情况。MIDP 2.0是J2ME针对移动设备提供的一套游戏开发框架,其中Game API提供了丰富的图形和动画处理...

Global site tag (gtag.js) - Google Analytics