📄 sprite.java
字号:
//#condition (polish.midp1 || polish.usePolishGameApi == true) || (polish.blackberry && polish.usePolishGui) || (polish.doja && polish.usePolishGui)
// generated by de.enough.doc2java.Doc2Java (www.enough.de) on Sat Dec 06 15:06:44 CET 2003
/*
* Copyright (c) 2004-2005 Robert Virkus / Enough Software
*
* This file is part of J2ME Polish.
*
* J2ME Polish is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* J2ME Polish is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with J2ME Polish; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Commercial licenses are also available, please
* refer to the accompanying LICENSE.txt or visit
* http://www.j2mepolish.org for details.
*/
package de.enough.polish.ui.game;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
//#ifdef polish.api.siemens-color-game-api
//# import com.siemens.mp.color_game.TiledLayer;
//#endif
//#ifdef polish.api.nokia-ui
//# import com.nokia.mid.ui.DirectGraphics;
//# import com.nokia.mid.ui.DirectUtils;
//#endif
/**
* A Sprite is a basic visual element that can be rendered with one of
* several frames stored in an Image; different frames can be shown to
* animate the Sprite. Several transforms such as flipping and rotation
* can also be applied to a Sprite to further vary its appearance. As with
* all Layer subclasses, a Sprite's location can be changed and it can also
* be made visible or invisible.
* <h3>Sprite Frames</h3>
* The raw frames used to render a Sprite are provided in a single Image
* object, which may be mutable or immutable. If more than one frame is used,
* the Image is broken up into a series of equally-sized frames of a specified
* width and height. As shown in the figure below, the same set of frames may
* be stored in several different arrangements depending on what is the most
* convenient for the game developer.
* <br>
* <center><img src="doc-files/frames.gif" width=777 height=402
* ALT="Sprite Frames"></center>
* <br>
* <p>
* Each frame is assigned a unique index number. The frame located in the
* upper-left corner of the Image is assigned an index of 0. The remaining
* frames are then numbered consecutively in row-major order (indices are
* assigned across the first row, then the second row, and so on). The method
* <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#getRawFrameCount()"><CODE>getRawFrameCount()</CODE></A> returns the total number of raw frames.
* <h3>Frame Sequence</h3>
* A Sprite's frame sequence defines an ordered list of frames to be displayed.
* The default frame sequence mirrors the list of available frames, so
* there is a direct mapping between the sequence index and the corresponding
* frame index. This also means that the length of the default frame sequence
* is equal to the number of raw frames. For example, if a Sprite has 4
* frames, its default frame sequence is {0, 1, 2, 3}.
* <center><img src="doc-files/defaultSequence.gif" width=182 height=269
* ALT="Default Frame Sequence"></center>
* The developer must manually switch the current frame in the frame sequence.
* This may be accomplished by calling <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#setFrame(int)"><CODE>setFrame(int)</CODE></A>,
* <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#prevFrame()"><CODE>prevFrame()</CODE></A>, or <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#nextFrame()"><CODE>nextFrame()</CODE></A>. Note that these methods
* always operate on the sequence index, they do not operate on frame indices;
* however, if the default frame sequence is used, then the sequence indices
* and the frame indices are interchangeable.
* If desired, an arbitrary frame sequence may be defined for a Sprite.
* The frame sequence must contain at least one element, and each element must
* reference a valid frame index. By defining a new frame sequence, the
* developer can conveniently display the Sprite's frames in any order
* desired; frames may be repeated, omitted, shown in reverse order, etc.
* For example, the diagram below shows how a special frame sequence might be
* used to animate a mosquito. The frame sequence is designed so that the
* mosquito flaps its wings three times and then pauses for a moment before
* the cycle is repeated.
* <center><img src="doc-files/specialSequence.gif" width=346 height=510
* ALT="Special Frame Sequence"></center>
* By calling <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#nextFrame()"><CODE>nextFrame()</CODE></A> each time the display is updated, the
* resulting animation would like this:
* <br>
* <center><img src="doc-files/sequenceDemo.gif" width=96 height=36></center>
* <h3>Reference Pixel</h3>
* Being a subclass of Layer, Sprite inherits various methods for setting and
* retrieving its location such as <A HREF="../../../../javax/microedition/lcdui/game/Layer.html#setPosition(int, int)"><CODE>setPosition(x,y)</CODE></A>,
* <A HREF="../../../../javax/microedition/lcdui/game/Layer.html#getX()"><CODE>getX()</CODE></A>, and <A HREF="../../../../javax/microedition/lcdui/game/Layer.html#getY()"><CODE>getY()</CODE></A>. These methods all define
* position in terms of the upper-left corner of the Sprite's visual bounds;
* however, in some cases, it is more convenient to define the Sprite's position
* in terms of an arbitrary pixel within its frame, especially if transforms
* are applied to the Sprite.
* Therefore, Sprite includes the concept of a <em>reference pixel</em>.
* The reference pixel is defined by specifying its location in the
* Sprite's untransformed frame using
* <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#defineReferencePixel(int, int)"><CODE>defineReferencePixel(x,y)</CODE></A>.
* By default, the reference pixel is defined to be the pixel at (0,0)
* in the frame. If desired, the reference pixel may be defined outside
* of the frame's bounds.
* <p>
* In this example, the reference pixel is defined to be the pixel that
* the monkey appears to be hanging from:
* <p>
* <center><img src="doc-files/refpixel.gif" width=304 height=199
* ALT="Defining The Reference Pixel"></center>
* <p>
* <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#getRefPixelX()"><CODE>getRefPixelX()</CODE></A> and <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#getRefPixelY()"><CODE>getRefPixelY()</CODE></A>
* can be used to query the location of the reference pixel in the painter's
* coordinate system. The developer can also use
* <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#setRefPixelPosition(int, int)"><CODE>setRefPixelPosition(x,y)</CODE></A> to position the Sprite
* so that reference pixel appears at a specific location in the painter's
* coordinate system. These methods automatically account for any transforms
* applied to the Sprite.
* <p>
* In this example, the reference pixel's position is set to a point at the end
* of a tree branch; the Sprite's location changes so that the reference pixel
* appears at this point and the monkey appears to be hanging from the branch:
* <p>
* <center><img src="doc-files/setrefposition.gif" width=332 height=350
* ALT="Setting The Reference Pixel Position"></center>
* <p>
* <a name="transforms"></a>
* <h3>Sprite Transforms</h3>
* Various transforms can be applied to a Sprite. The available transforms
* include rotations in multiples of 90 degrees, and mirrored (about
* the vertical axis) versions of each of the rotations. A Sprite's transform
* is set by calling <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#setTransform(int)"><CODE>setTransform(transform)</CODE></A>.
* <p>
* <center><img src="doc-files/transforms.gif" width=355 height=575
* ALT="Transforms"></center>
* <br>
* When a transform is applied, the Sprite is automatically repositioned
* such that the reference pixel appears stationary in the painter's
* coordinate system. Thus, the reference pixel effectively becomes the
* center of the transform operation. Since the reference pixel does not
* move, the values returned by <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#getRefPixelX()"><CODE>getRefPixelX()</CODE></A> and
* <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#getRefPixelY()"><CODE>getRefPixelY()</CODE></A> remain the same; however, the values returned by
* <A HREF="../../../../javax/microedition/lcdui/game/Layer.html#getX()"><CODE>getX()</CODE></A> and <A HREF="../../../../javax/microedition/lcdui/game/Layer.html#getY()"><CODE>getY()</CODE></A> may change to reflect the
* movement of the Sprite's upper-left corner.
* <p>
* Referring to the monkey example once again, the position of the
* reference pixel remains at (48, 22) when a 90 degree rotation
* is applied, thereby making it appear as if the monkey is swinging
* from the branch:
* <p>
* <center><img src="doc-files/transcenter.gif" width=333 height=350
* ALT="Transform Center"></center>
* <p>
* <h3>Sprite Drawing</h3>
* Sprites can be drawn at any time using the <A HREF="../../../../javax/microedition/lcdui/game/Sprite.html#paint(javax.microedition.lcdui.Graphics)"><CODE>paint(Graphics)</CODE></A> method.
* The Sprite will be drawn on the Graphics object according to the current
* state information maintained by the Sprite (i.e. position, frame,
* visibility). Erasing the Sprite is always the responsibility of code
* outside the Sprite class.<p>
* <p>
* Sprites can be implemented using whatever techniques a manufacturers
* wishes to use (e.g hardware acceleration may be used for all Sprites, for
* certain sizes of Sprites, or not at all).
* <p>
* For some platforms, certain Sprite sizes may be more efficient than others;
* manufacturers may choose to provide developers with information about
* device-specific characteristics such as these.
* <p>
*
* @author Robert Virkus (original implementation)
* @author Thomas Boyer (optimizations)
*/
public class Sprite
//#ifdef polish.api.siemens-color-game-api
//# extends com.siemens.mp.color_game.Sprite
//#else
extends Layer
//#endif
{
/**
* No transform is applied to the Sprite.
* This constant has a value of <code>0</code>.
*/
public static final int TRANS_NONE = 0;
/**
* Causes the Sprite to appear rotated clockwise by 90 degrees.
* This constant has a value of <code>5</code>.
*/
public static final int TRANS_ROT90 = 5;
/**
* Causes the Sprite to appear rotated clockwise by 180 degrees.
* This constant has a value of <code>3</code>.
*/
public static final int TRANS_ROT180 = 3;
/**
* Causes the Sprite to appear rotated clockwise by 270 degrees.
* This constant has a value of <code>6</code>.
*/
public static final int TRANS_ROT270 = 6;
/**
* Causes the Sprite to appear reflected about its vertical
* center.
* This constant has a value of <code>2</code>.
*/
public static final int TRANS_MIRROR = 2;
/**
* Causes the Sprite to appear reflected about its vertical
* center and then rotated clockwise by 90 degrees.
* This constant has a value of <code>7</code>.
*/
public static final int TRANS_MIRROR_ROT90 = 7;
/**
* Causes the Sprite to appear reflected about its vertical
* center and then rotated clockwise by 180 degrees.
* This constant has a value of <code>1</code>.
*/
public static final int TRANS_MIRROR_ROT180 = 1;
/**
* Causes the Sprite to appear reflected about its vertical
* center and then rotated clockwise by 270 degrees.
* This constant has a value of <code>4</code>.
*/
public static final int TRANS_MIRROR_ROT270 = 4;
private Image image;
private int refPixelX;
private int refPixelY;
private int frameSequenceIndex;
private int[] frameSequence;
private int transform;
//#ifdef polish.api.nokia-ui
//# private static final int[] NOKIA_TRANSFORM_LOOKUP = {
//# 0,
//# DirectGraphics.FLIP_VERTICAL,
//# DirectGraphics.FLIP_HORIZONTAL,
//# DirectGraphics.ROTATE_180,
//# DirectGraphics.ROTATE_90 | DirectGraphics.FLIP_VERTICAL,
//# DirectGraphics.ROTATE_270,
//# DirectGraphics.ROTATE_90,
//# DirectGraphics.ROTATE_90 | DirectGraphics.FLIP_HORIZONTAL
//# };
//# private int nokiaTransform;
//# private Image nokiaFrame;
//# private Image[] nokiaFrames;
//#endif
private int collisionX;
private int collisionY;
private int collisionWidth;
private int collisionHeight;
private int transformedCollisionX;
private int transformedCollisionY;
private int transformedCollisionWidth;
private int transformedCollisionHeight;
private int frameHeight;
private int frameWidth;
private int rawFrameCount;
private boolean isSingleFrame;
private int transformedRefX;
private int transformedRefY;
private int numberOfColumns;
private int column;
private int row;
//#ifdef polish.api.siemens-color-game-api
//# protected int xPosition;
//# protected int yPosition;
//# protected int width;
//# protected int height;
//# protected boolean isVisible = true;
//#endif
/**
* Creates a new non-animated Sprite using the provided Image.
* This constructor is functionally equivalent to calling
* <code>new Sprite(image, image.getWidth(), image.getHeight())</code>
* <p>
* By default, the Sprite is visible and its upper-left
* corner is positioned at (0,0) in the painter's coordinate system.
* <br>
*
* @param image the Image to use as the single frame for the Sprite
* @throws NullPointerException if img is null
*/
public Sprite( Image image)
{
//#ifdef polish.api.siemens-color-game-api
//# super( image );
//#else
setImage( image, image.getWidth(), image.getHeight() );
//#endif
}
/**
* Creates a new animated Sprite using frames contained in
* the provided Image. The frames must be equally sized, with the
* dimensions specified by <code>frameWidth</code> and
* <code>frameHeight</code>. They may be laid out in the image
* horizontally, vertically, or as a grid. The width of the source
* image must be an integer multiple of the frame width, and the height
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -