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

📄 change_transparent_canvas.java

📁 本光盘是《J2ME无线移动游戏开发》一书的配套光盘
💻 JAVA
字号:
package ch06;

import java.util.*;
import javax.microedition.lcdui.*;

public class Change_Transparent_Canvas
    extends Canvas {

  //声明一个存储前景图像数组的数组对象
  private int[] pixelArray;

  //声明一个代表图像数组大小的int型属性变量
  private int pixelArraySize;

  //声明一个代表图像宽度的int型属性变量
  private int displayWidth;

  //声明一个代表图像高度的int型属性变量
  private int displayHeight;

  //声明一个代表图像数组中每次被线程改变值的象素索引
  private int randomPixel;

  //声明一个代表背景图片的Image对象
  private Image image = null;

  //声明一个随机数
  private Random random;

  //声明一个控制绘制的Timer对象
  private Timer tm;

  //声明一个实现绘制的TimerTask对象
  private TimerTask tt;

  //声明一个代表初始化完成状态的标志
  private boolean initComplete = false;

  //声明一个代表主MIDlet类对象
  Change_Transparent_MIDlet midlet;

  /*
   2.构造器
   */
  public Change_Transparent_Canvas(Change_Transparent_MIDlet midlet) {
    this.midlet = midlet;
    //获取屏幕宽度和高度
    displayWidth = getWidth();
    displayHeight = getHeight();
    pixelArraySize = displayWidth * displayHeight;
    //获取一个随机对象
    random = new java.util.Random();
    //调用createBox()方法生成前景色图像数据
    createBox();

    //装载背景图片
    try {
      image = Image.createImage("/icons/background/boy02.png");
    }
    catch (Exception e) {
      System.out.println(e.getMessage());
    }
    //执行绘制线程
    tm = new Timer();
    tt = new DrawTask();
    tm.scheduleAtFixedRate(tt, 0, 1);
  }

  /*
   3.生成前景色图像数据
   */
  private void createBox() {
    int red, green, blue, alpha;
    long tmp;
    if (pixelArray == null) {
      pixelArray = new int[pixelArraySize];
      red = (random.nextInt() >>> 1) % 256;
      green = (random.nextInt() >>> 1) % 256;
      blue = (random.nextInt() >>> 1) % 256;
      alpha = 0xff; //不透明
      //合成ARGB格式
      tmp = (alpha << 24) | (red << 16) | (green << 8) | blue;
      for (int i = 0; i < pixelArraySize; i++) {
        pixelArray[i] = (int) tmp;
      }
    }
  }

  /*
   4.更新前景色
   */
  private void updateDisplay() {
    //获取被改变象素的起始象素索引
    randomPixel = (random.nextInt() >>> 1) % (pixelArraySize);
    //改变象素透明度
    for (int i = randomPixel, j = 0; j < 50 && i < (pixelArraySize); j++, i++) {
      pixelArray[i] = 0x00000000;
    }
  }

  /*
   5.绘制图像
   */
  public void paint(Graphics g) {
    if (initComplete == false) {
      //用白色填充背景色
      g.setColor(255, 255, 255);
      g.fillRect(0, 0, displayWidth, displayHeight);
      initComplete = true;
    }
    //绘制背景图片
    if (image != null) {
      g.drawImage(image, 0, 0, Graphics.LEFT | Graphics.TOP);
    }
    //绘制前景图像
    g.drawRGB(pixelArray, 0, displayWidth, 0, 0, displayWidth, displayHeight, true);
  }

  /*
   6.响应按键事件
   */
  protected void keyPressed(int keyCode) {
    tt.cancel();
    for (int i = 0; i < (pixelArraySize); i++) {
      pixelArray[i] = 0x00000000;
    }
    repaint();
  }

  /*
   7.声明一个TimerTask类
   */
  private class DrawTask
      extends TimerTask {
    public final void run() {
      updateDisplay();
      repaint();
    }
  }
}

⌨️ 快捷键说明

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