首页 > j2me, 游戏 > 手机游戏动作编辑器MotionWelder–编写程序

手机游戏动作编辑器MotionWelder–编写程序

2010年7月8日
82 views 评论 发表评论

开发环境: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;
}
}

纯净水 j2me, 游戏 , ,

  1. 目前还没有任何评论.
  1. 目前还没有任何 trackbacks 和 pingbacks.