手机游戏动作编辑器MotionWelder–编写程序
开发环境:Eclipse+EclipseMe (Eclipse3.4版本以上使用EclipseMe时在添加第三方库常常会出现classnotfound异常,可使用mtj代替EclipseME,或使用低一些的Eclipse版本)
1、新建J2ME工程,导入MotionWelder的J2ME库(在该程序下载包里J2ME 的lib目录里的motionwelder.jar)
右键工程–>Build Path –>Add external archives… —>选择motionwelder.jar打开,即可导入完毕。
2、把导出的动作数据文件拷到工程的资源目录,导入动作数据文件
/*
spriteName 动作数据文件
splitImageClips 内存加载图片的方式,如果为false则加载完整的图片(图片没有切片),true则加载切片的图片
imageloader 加载动作所需图片的类
*/
MSpriteData animationData = MSpriteLoader.loadMSprite(java.lang.String spriteName, boolean splitImageClips, MSpriteImageLoader imageloader)
3、加载动作图片
interface MSpriteImageLoader:
splitImageClips = false - 加载完整的图片
Image[] loadImage(spriteName,imageId,orientationUsedInStudio);
splitImageClips = true – 加载图片切片
Image[] loadImageClip(String spriteName,int imageId,int x,int y,int w,int h,int orientationUsedInStudio);
-spriteName
– 动作数据文件的名字
-orientationUsedInStudio
-使用了的翻转类型,
MSprite.ORIENTATION_NONE – 无翻转
MSprite.ORIENTATION_FLIP_H - 水平翻转
MSprite.ORIENTATION_FLIP_V - 垂直翻转
MSprite.ORIENTATION_FLIP_BOTH_H_V – 水平和垂直翻转
- imageId
– 图片id,即动作所使用到的图片
-x,y,w,h
-切片在图片中的坐标(x,y,宽,高).
Image[3]
Image[0] =无翻转图片
Image[1] = 水平翻转图片 // 如果没有为null
Image[2] = 垂直翻转图片 // 如果没有为null
4、播放动作
/*动作列表*/
public static int ANIM_STAND = 0;
public static int ANIM_RUN = 1;
/* 创建动作播放器 */
MSimpleAnimationPlayer player = new MSimpleAnimationPlayer(MSpriteData spriteData, int spriteX, int spriteY);
或
MSpriteAnimationPlayer player = new MSpriteAnimationPlayer(MSpriteData spriteData, MSprite sprite);
两个的区别在于:正如名字一样MSpriteAnimationPlayer提供的一个简单的播放器,它在处理end of animation时是仅停止播放,不能更好地拓展。如果需要灵巧地控制各个动画的切换最好使用MSpriteAnimationPlayer。
/*设置当前的播放动作*/
player.setAnimation(ANIM_STAND);
player.setLoopOffset(-1); // 播放一次..
player.setLoopOffset(0); // 从第一帧到帧尾循环播放
player.setLoopOffset(2); // 从第二帧到帧尾循环播放
/* 循环调用这里,更新和绘制动作*/
player.update();
player.drawFrame(g);
例子:使用第一节的数据文件,当我们按数字键5或者中键的时候施放这个向下攻击的动作。主要代码如下:
主屏幕 GameScreen.java
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
public class GameScreen extends Canvas implements Runnable {
private GameSprite gameSprite;//游戏精灵
private static final int KEY_FIRE=-5;//键盘中键
public static boolean isHit = false;//是否发动攻击
public GameScreen() {
gameSprite = new GameSprite();//实例化游戏精灵
Thread t = new Thread(this);//创建线程
t.start();//启动线程
}
protected void paint(Graphics g) {
g.setColor(0xffffffff);
g.fillRect(0, 0, getWidth(), getHeight());//清屏
gameSprite.paint(g);//绘制精灵
}
public void run() {
try {
long time;
while (true) {
time = System.currentTimeMillis();
//重绘
repaint();
serviceRepaints();
if (isHit) {//如果发动攻击
gameSprite.update();//更新精灵
}
long timeTakenForPainting = System.currentTimeMillis() – time;
if (timeTakenForPainting < 100) {
Thread.sleep(100 – timeTakenForPainting);
}
}
} catch (Exception e) {
System.out.println(“Error ” + e);
}
}
protected void keyPressed(int key) {
if (key == Canvas.KEY_NUM5 || key == KEY_FIRE) {
isHit = true;//按数字键5或中键攻击
}
}
protected void keyReleased(int key) {
}
}
游戏精灵 GameSprite.java
import javax.microedition.lcdui.Graphics;
import com.studio.motionwelder.MPlayer;
import com.studio.motionwelder.MSprite;
import com.studio.motionwelder.MSpriteAnimationPlayer;
import com.studio.motionwelder.MSpriteData;
import com.studio.motionwelder.MSpriteLoader;
public class GameSprite implements MSprite {
private MSpriteData spriteData;
private MPlayer player;
private int animation;
private static final int DOWN_HIT = 0;
int spriteX = 100;//精灵坐标
int spriteY = 175;
public GameSprite() {
try {
loadResource();//加载资源
} catch (Exception e) {
e.printStackTrace();
}
player = new MSpriteAnimationPlayer(spriteData, this);//创建播放器
this.setAnimation(DOWN_HIT);//设置当前动画ID
}
private void setAnimation(int animation) {//设置动画ID
switch (animation) {
case DOWN_HIT:
player.setAnimation(DOWN_HIT);
break;
}
this.animation = animation;
}
private void loadResource() throws Exception {
spriteData = MSpriteLoader.loadMSprite(“/SwordSprite.anu”, true,
ResourceLoader.getInstance());//加载数据文件
}
public void update() {
switch (animation) {
case DOWN_HIT:
player.setLoopOffset(-1);//设置仅播放一次
break;
}
player.update();//下一帧
}
public void endOfAnimation() {//处理动画播放完后的方法,可以添加切换到另外的动画等等
switch (animation) {
case DOWN_HIT:
player.setFrame(0);//如果播放完则设置帧为第0帧
break;
}
GameScreen.isHit = false;//攻击动作完成
}
public int getSpriteDrawX() {//设置精灵的绘制坐标X
return spriteX;
}
public int getSpriteDrawY() {//设置精灵的绘制坐标Y
return spriteY;
}
public byte getSpriteOrientation() {//设置精灵的方向
return 0;
}
public void updateSpritePosition(int arg0, int arg1) {
//更新精灵的位置,比如跑动是X及Y的坐标变化
}
public void paint(Graphics g) {
player.drawFrame(g);//绘制动作的帧
}
}
资源加载 ResourceLoader.java
import java.io.IOException;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;
import com.studio.motionwelder.MSprite;
import com.studio.motionwelder.MSpriteImageLoader;
public class ResourceLoader implements MSpriteImageLoader {
private static ResourceLoader resLoader;// 单例
private ResourceLoader() {
}
public static ResourceLoader getInstance() {// 获取ResourceLoader的实例
if (resLoader == null)
resLoader = new ResourceLoader();
return resLoader;
}
public Image[] loadImage(String spriteName, int imageId,
int orientationUsedInStudio) {// 整图形式加载图片
return null;
}
public Image[] loadImageClip(String spriteName, int imageId, int x, int y,
int w, int h, int orientationUsedInStudio) {// 切片形式加载图片
boolean doYouNeedHFlippedSpriteInYourgame = false;
boolean doYouNeedVFlippedSpriteInYourgame = false; // 是否有旋转操作
Image baseImage = null;
if (imageId == 0) {
baseImage = loadImage(“/hero.png”);
doYouNeedHFlippedSpriteInYourgame = false;
doYouNeedVFlippedSpriteInYourgame = false;
}
Image img[] = new Image[3];
img[0] = Image.createImage(baseImage, x, y, w, h, Sprite.TRANS_NONE); // 保存无旋转的切片
/** 如果使用了Nokia的图像操作就不要这样用,关于Nokia的操作作者在库代码里把它注释掉了 */
if (orientationUsedInStudio == MSprite.ORIENTATION_FLIP_H
|| orientationUsedInStudio == MSprite.ORIENTATION_FLIP_BOTH_H_V
|| doYouNeedHFlippedSpriteInYourgame)
img[1] = Image.createImage(baseImage, x, y, w, h,
Sprite.TRANS_MIRROR); // 保存水平旋转的切片
/** 如果使用了Nokia的图像操作就不要这样用,关于Nokia的操作作者在库代码里把它注释掉了 */
if (orientationUsedInStudio == MSprite.ORIENTATION_FLIP_V
|| orientationUsedInStudio == MSprite.ORIENTATION_FLIP_BOTH_H_V
|| doYouNeedVFlippedSpriteInYourgame)
img[2] = Image.createImage(baseImage, x, y, w, h,
Sprite.TRANS_MIRROR_ROT180); // 保存垂直旋转的切片
return img;
}
private Image loadImage(String imagePath) {
try {
Image img = Image.createImage(imagePath);
return img;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}

最近评论