📄 piecesprite.java
字号:
package com.j2medev.chapter5;
/**
*修改日期 2006-4-8
*增加缩放比例
*
*
*/
import javax.microedition.lcdui.*;
//#if (NOKIA_S40_V1 ||NOKIA_S60_V1||NOKIA_S40_V2 ||NOKIA_S60_V2)
//# import com.nokia.mid.ui.*;
//#else
//#if ( NOKIA_S40_V1||SAMSUNG_E108)
//#
//#else
import javax.microedition.lcdui.game.*;
//#endif
//#endif
import java.io.*;
public class PieceSprite implements MyGameInterface
{
Image sprImage;
short[][][][] sprData;
//*/////////////////////////////////////////////////////////////
public static final int TRANS_NONE = 0;
public static final int TRANS_ROT90 = 5;
public static final int TRANS_ROT180 = 3;
public static final int TRANS_ROT270 = 6;
public static final int TRANS_MIRROR = 2;
public static final int TRANS_MIRROR_ROT90 = 7;
public static final int TRANS_MIRROR_ROT180 = 1;
public static final int TRANS_MIRROR_ROT270 = 4;
// following params is equal to Graphics's paramas ,so it is easy for porting
public static final int HCENTER = 1;
public static final int VCENTER = 2;
public static final int LEFT = 4;
public static final int RIGHT = 8;
public static final int TOP = 16;
public static final int BOTTOM = 32;
/**
* 当前动画数据
*/
short[][][] currentAnimation;
/**
* 当前帧数据
*/
short [][] currentFrame;
/**
* 当前帧时间
*/
short currentFrameTime;
/**
* 当前帧保留值
*/
short currentFrameValue;
/**
* 当前帧水平偏移
*/
short currentFrameGlobalX;
/**
* 当前帧垂直偏移
*/
short currentFrameGlobalY;
/**
* 当前帧碰撞起始点X
*/
short currentFrameCollisionX;
/**
* 当前帧碰撞机始点Y
*/
short currentFrameCollisionY;
/**
* 当前帧碰撞宽度
*/
short currentFrameCollisionW;
/**
* 当前帧碰撞高度
*/
short currentFrameCollisionH;
/**
* 当前帧帧号
*/
short currentFrameNr;
/**
* 是否连续播放
*/
boolean isAnimationRepeat;
/**
* 帧的起始时间
*/
long startFrameTime;
/**
* 是否是一次性载入标志
*/
boolean b_LoadedOnce;
/**
* 构造函数直接通过传入四维数组进行初始化
* @param spriteSheet Image
* @param spriteData short[][][][]
*/
public PieceSprite(Image spriteSheet, short[][][][] spriteData)
{
sprImage = spriteSheet;
sprData = spriteData;
}
/** 输入流*/
private InputStream is = null;
/** 数据输入流*/
private DataInputStream dis = null;
/**
*当前动画的长度
*/
short CurrentAnimationFrameLength;
/**
*数据文件名
*/
String m_strBinData;
short m_rate;
/**
* 该构造方法用于播放单一的、连续的、帧频数很多的动画对像
* @param spriteSheet Image
* @param binData String
* @param rate 缩放比例
* @param bLoadAll boolean 是否将数据一次全部载入到数组中
*/
public PieceSprite(Image spriteSheet, String binData,short rate,boolean bLoadAll)
{
m_rate=rate;
m_strBinData=binData;
sprImage = spriteSheet;
is = getClass().getResourceAsStream(binData);
dis= new DataInputStream(is);
b_LoadedOnce=bLoadAll;
try
{
//读取动画长度
short PlayerAnimationsLength=ReadShortFromBCC(dis);
if(bLoadAll)//如果是一次载入
{
sprData= new short[PlayerAnimationsLength][][][];
for(int i =0;i<PlayerAnimationsLength;i++)
{
sprData[i]= read_One_Animation();
}
dis.close();
}
else //如果是多次载入
{
CurrentAnimationFrameLength=ReadShortFromBCC(dis);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void TRACE(String str)
{
System.out.println(str);
}
/**
* 读取动画工程中的一个动画
* @return short[][][]
*/
public short[][][] read_One_Animation()
{
//读取该动画包含的Frame的长度
int CurrentAnimationFrameLength=ReadShortFromBCC(dis);
short animationData[][][]=new short[CurrentAnimationFrameLength][][];
for(int i=0;i<CurrentAnimationFrameLength;i++)
{
animationData[i]=read_One_Frame();
}
return animationData;
}
/**
* 读取动画中的一帧
* @return short[][]
*/
public short[][]read_One_Frame()
{
int globalOX=ReadShortFromBCC(dis);
int globalOY=ReadShortFromBCC(dis);
int time=ReadShortFromBCC(dis);
int value=ReadShortFromBCC(dis);
int rx=ReadShortFromBCC(dis);
int ry=ReadShortFromBCC(dis);
int rx2=ReadShortFromBCC(dis);
int ry2=ReadShortFromBCC(dis);
//读取该Frame的包含的零件的长度
int CurrentFramePieceLength=ReadShortFromBCC(dis);
short frameData[][]=new short[CurrentFramePieceLength+1][];
for(int k=0;k<CurrentFramePieceLength+1;k++)
{
if (k == 0) {
frameData[k] = new short[8];
frameData[0][0] = (short) value;
frameData[0][1] = (short) time;
frameData[0][2] = (short) globalOX;
frameData[0][3] = (short) globalOY;
frameData[0][4] = (short) rx;
frameData[0][5] = (short) ry;
frameData[0][6] = (short) (rx2 - rx);
frameData[0][7] = (short) (ry2 - ry);
// for(int kk=0;kk<8;kk++)
// System.out.print( " "+table[frameIndex][j][0][kk]);
// System.out.println();
}
else {
frameData[k] = new short[6];
int ox = ReadShortFromBCC(dis);
int oy = ReadShortFromBCC(dis);
rx = ReadShortFromBCC(dis);
ry = ReadShortFromBCC(dis);
rx2 = ReadShortFromBCC(dis);
ry2 = ReadShortFromBCC(dis);
frameData[k][0] = (short) rx;
frameData[k][1] = (short) ry;
frameData[k][2] = (short) (rx2 - rx);
frameData[k][3] = (short) (ry2 - ry);
frameData[k][4] = (short) ox;
frameData[k][5] = (short) oy;
// for(int kk=0;kk<6;kk++)
// System.out.print(" "+table[frameIndex][j][k][kk]);
// System.out.println();
//
}
}
return frameData;
}
/**
*从BorlandC++语言中读取 short数据
*/
public short ReadShortFromBCC(DataInputStream dataInputStream)
{
short data[]=new short[2];
try
{
for(int i =0;i<2;i++)
{
data[i]= (short)dataInputStream.readByte();
if(data[i]<0)data[i]=(short)(256+data[i]);
// System.out.println("read byte "+i+" "+data[i]);
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
// System.out.println("read int "+(data[0]+(int)(data[1]<<8)+(int)(data[2]<<16)+(int)(data[3]<<24)));
return (short)((short)(data[0])+(short)(data[1]<<8));
}
// RETURN FRAME VALUE
public int setAnimation(int nr, boolean repeat)
{
isAnimationRepeat = repeat;
if(!b_LoadedOnce) return -1;
currentAnimation = sprData[nr];
return setFrame((short)0);
}
// FRAME VALUE=0 TIME=100 GLOBAL_X=0 GLOBAL_Y=0 RX=0 RY=0 W=21 H=32
public int setFrame(short nr)
{
currentFrameNr = nr;
currentFrame = currentAnimation[nr];
currentFrameValue = currentFrame[0][0];
currentFrameTime = currentFrame[0][1];
currentFrameGlobalX = currentFrame[0][2];
currentFrameGlobalY = currentFrame[0][3];
currentFrameCollisionX = currentFrame[0][4];
currentFrameCollisionY = currentFrame[0][5];
currentFrameCollisionW = currentFrame[0][6];
currentFrameCollisionH = currentFrame[0][7];
startFrameTime = System.currentTimeMillis();
return currentFrameValue;
}
/**
* SETTING ANIMATION NEXT FRAME
* @return int - TRIGGER VALUE OR -1 IF FRAME NOT SWITCHED
*/
public int setNextFrame()
{
if(b_LoadedOnce)
{
// CHECK IF WE CAN SWITCH FOR NEXT FRAME (IS FINISHED FRAME TIME)
if (startFrameTime + currentFrameTime > System.currentTimeMillis())
{
return -1;
}
int aniLength = currentAnimation.length;
// CHECK IF ANIMATION IS OVER
if (currentFrameNr + 1 == aniLength) {
// IF REPEAT THEN SET FRAME 0
if (isAnimationRepeat)
return setFrame( (short) 0);
return -1;
}
return setFrame( (short) (currentFrameNr + 1));
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -