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

📄 imageset.java

📁 一款运行于手机的Java游戏神灯传奇源代码
💻 JAVA
字号:
package com.thinkenjoy.tools;

import java.io.IOException;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

//#if NOK_7260 || NOK_7210 || NOK_6101 || NOK_6230i || NOK_7370 || NOK_QD
//# import com.nokia.mid.ui.DirectUtils;
//#endif

/**
 *
 * 图片帧的容器
 * 此类主要是负责一些图片处理方面的事务
 */
public class ImageSet {
  private int totalStates; // 只被addState方法调用

  private Image[][] stateFrames;

  private int[] stateAnimTime, stateFrameWidth, stateFrameHeight;

  /**
   * 构造函数,初始化相应数组
   *
   * @param numStates
   */
  public ImageSet(int numStates) {
    stateAnimTime = new int[numStates];
    stateFrameWidth = new int[numStates];
    stateFrameHeight = new int[numStates];

    stateFrames = new Image[numStates][];
  }

  /**
   * 添加新的图片序列状态,
   * @param frames
   * 图片帧数组
   * @param animTime
   * 整个图片帧数组的显示时间
   */
  public final void addState(Image frames[], int animTime) {
    int state = totalStates++;

    if (state >= stateFrames.length) {
      // 扩大状态的数量
      stateAnimTime = Tools.expandArray(stateAnimTime, 1);
      stateFrameWidth = Tools.expandArray(stateFrameWidth, 1);
      stateFrameHeight = Tools.expandArray(stateFrameHeight, 1);
      stateFrames = Tools.expandArray(stateFrames, 1);
    }
    stateAnimTime[state] = animTime;
    stateFrameWidth[state] = frames[0].getWidth();
    stateFrameHeight[state] = frames[0].getHeight();
    stateFrames[state] = frames;
  }

  /**
   * 获得指定状态下的图片帧数量
   *
   * @param state
   * 某一状态
   * @return 指定状态下的图片帧数量
   */
  public final int getTotalFrames(int state) {
    return stateFrames[state].length;
  }

  /**
   * 获得相应状态的持续总时间 注:并不是每帧的延迟时间
   *
   * @param state
   *            相应状态
   * @return 持续总时间
   */
  public final int getAnimTime(int state) {
    return stateAnimTime[state];
  }

  /**
   * 获得每帧的延迟时间
   *
   * @param state
   *            相应状态
   * @return 每帧的延迟时间
   */
  public final int getAnimTimePerFrame(int state) {
    return stateAnimTime[state] / stateFrames[state].length;
  }

  /**
   * 在画布上画相应状态的相应帧
   *
   * @param target
   *            相应画布
   * @param state
   *            相应状态
   * @param frame
   *            相应帧
   * @param targetX
   *            绘制帧的相应X坐标
   * @param targetY
   *            绘制帧的相应Y坐标
   */
  public final void draw(Graphics target, int state, int frame, int targetX,
                         int targetY) {
    if (stateFrames[state][frame] != null) {
      target.drawImage(stateFrames[state][frame], targetX, targetY,
                       Tools.GRAPHICS_TOP_LEFT);
    }
  }

  /**
   * 提取出相应状态相应帧的图片
   *
   * @param state
   *            相应状态
   * @param frame
   *            相应帧
   * @return
   */
  public final Image getFrame(int state, int frame) {
    return stateFrames[state][frame];
  }

  /**
   * 得到一张图片的相应裁剪区域
   *
   * @param filename
   *            图片文件的名字
   * @param originX
   *            裁剪区域的起始X坐标
   * @param originY
   *            裁剪区域的起始Y坐标
   * @param width
   *            裁剪区域的宽度
   * @param height
   *            裁剪区域的高度
   * @return 裁剪区域的图片
   */
  public final static Image loadClippedImage(String filename, int originX,
                                             int originY, int width, int height) {
    try {
      // 载入整张图片
      Image fileImage = Image.createImage(filename);
      // 用getImageRegion方法用以提取出想要的图片
      return getImageRegion(fileImage, originX, originY, width, height);
    }

    catch (IOException ioe) {
      System.out.println("can't load file: " + filename);
      return null;
    }
  }

  /**
   * 得到一张图片的相应裁剪区域(从相应的位置起裁剪原始图片的剩余部分)
   *
   * @param filename
   *            图片文件的名字
   * @param originX
   *            裁剪区域的起始X坐标
   * @param originY
   *            裁剪区域的起始Y坐标
   * @return 裁剪区域的图片
   */
  public final static Image loadClippedImage(String filename, int originX,
                                             int originY) {
    try {
      // 载入整张图片
      Image fileImage = Image.createImage(filename);

      // 如果只是完整地载入一张图片
      if (originX == 0 && originY == 0)
        return fileImage;

      // 得到我们想要的图片区域
      return getImageRegion(fileImage, originX, originY, fileImage
                            .getWidth(), fileImage.getHeight());
    }

    catch (IOException ioe) {
      System.out.println("can't load file: " + filename);
      return null;
    }
  }

  /**
   * 在原始图片上剪切出一张新图片
   *
   * @param source 原始图片
   * @param x
   *            新图片在原始图片上的起始X坐标
   * @param y
   *            新图片在原始图片上的起始Y坐标
   * @param width
   *            新图片的宽度
   * @param height
   *            新图片的高度
   * @return 仅仅包含原始图片部分的新图片
   */
  public final static Image getImageRegion(Image source, int x, int y,
                                           int width, int height) {
    //#ifdef debug
    //# if (x + width > source.getWidth() || y + height > source.getHeight())
    //# System.out.println("Warning: attempting extract using (" + x + ","
    //# + y + "," + width + "," + height + ") when image is " + "("
    //# + source.getWidth() + "," + source.getHeight() + ")");
    //#endif
    // 为新图片创建一张空白图片

    //#if NOK_7260 || NOK_7210 || NOK_6101 || NOK_6230i || NOK_7370
    //# Image result = DirectUtils.createImage(width, height, 0);
    //# // 在空白图片上根据相应位置绘制
    //# result.getGraphics().drawImage(source, -x, -y, Tools.GRAPHICS_TOP_LEFT);
    //#else
    Image result = Image.createImage(source, x, y, width, height, 0x00000000);
    //#endif

    return result;
  }

  /**
   * 分离帧
   *
   * @param sourceImage
   *            原始合并图片
   * @param sourceX
   *            原始图片的分离起始X坐标
   * @param sourceY
   *            原始图片的分离起始Y坐标
   * @param framesWide
   *            横向的分离数量
   * @param framesHigh
   *            纵向的分离数量
   * @param frameWidth
   *            每帧的宽度
   * @param frameHeight
   *            每帧的高度
   * @return 存储每帧图片的数组
   */
  public final static Image[] extractFrames(Image sourceImage, int sourceX,
                                            int sourceY, int framesWide,
                                            int framesHigh, int frameWidth,
                                            int frameHeight) {
    // 存储每帧图片的数组
    Image[] frames = new Image[framesWide * framesHigh];
    int frameCount = 0;

    for (int fy = 0; fy < framesHigh; fy++)
      for (int fx = 0; fx < framesWide; fx++)
        frames[frameCount++] = getImageRegion(sourceImage,
                                              sourceX + (fx * frameWidth),
                                              sourceY + (fy * frameHeight),
                                              frameWidth, frameHeight);
    return frames;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -