📄 tiledlayer.java
字号:
} return cellMatrix[row][col]; } /** * Fills a region cells with the specific tile. The cells may be filled * with a static tile index, an animated tile index, or they may be left * empty (index <code>0</code>). * * @param col the column of top-left cell in the region * @param row the row of top-left cell in the region * @param numCols the number of columns in the region * @param numRows the number of rows in the region * @param tileIndex the Index of the tile to place in all cells in the * specified region * @throws IndexOutOfBoundsException if the rectangular region * defined by the parameters extends beyond the bounds of the * <code>TiledLayer</code> grid * @throws IllegalArgumentException if <code>numCols</code> is less * than zero * @throws IllegalArgumentException if <code>numRows</code> is less * than zero * @throws IndexOutOfBoundsException if there is no tile with * index <code>tileIndex</code> * @see #setCell * @see #getCell */ public void fillCells(int col, int row, int numCols, int numRows, int tileIndex) { if (col < 0 || col >= this.columns || row < 0 || row >= this.rows || numCols < 0 || col + numCols > this.columns || numRows < 0 || row + numRows > this.rows) { throw new IndexOutOfBoundsException(); } if (tileIndex > 0) { // do checks for static tile if (tileIndex >= numberOfTiles) { throw new IndexOutOfBoundsException(); } } else if (tileIndex < 0) { // do animated tile index check if (anim_to_static == null || (-tileIndex) >= numOfAnimTiles) { throw new IndexOutOfBoundsException(); } } for (int rowCount = row; rowCount < row + numRows; rowCount++) { for (int columnCount = col; columnCount < col + numCols; columnCount++) { cellMatrix[rowCount][columnCount] = tileIndex; } } } /** * Gets the width of a single cell, in pixels. * @return the width in pixels of a single cell in the * <code>TiledLayer</code> grid */ public final int getCellWidth() { return cellWidth; } /** * Gets the height of a single cell, in pixels. * @return the height in pixels of a single cell in the * <code>TiledLayer</code> grid */ public final int getCellHeight() { return cellHeight; } /** * Gets the number of columns in the TiledLayer grid. * The overall width of the TiledLayer, in pixels, * may be obtained by calling {@link #getWidth}. * @return the width in columns of the * <code>TiledLayer</code> grid */ public final int getColumns() { return columns; } /** * Gets the number of rows in the TiledLayer grid. The overall * height of the TiledLayer, in pixels, may be obtained by * calling {@link #getHeight}. * @return the height in rows of the * <code>TiledLayer</code> grid */ public final int getRows() { return rows; } /** * Change the static tile set. <p> * * Replaces the current static tile set with a new static tile set. * See the constructor {@link #TiledLayer(int, int, Image, int, int)} * for information on how the tiles are created from the * image.<p> * * If the new static tile set has as many or more tiles than the * previous static tile set, * the the animated tiles and cell contents will be preserve. If * not, the contents of * the grid will be cleared (all cells will contain index 0) and * all animated tiles * will be deleted. * <P> * @param image the <code>Image</code> to use for creating the * static tile set * @param tileWidth the width in pixels of a single tile * @param tileHeight the height in pixels of a single tile * @throws NullPointerException if <code>image</code> is <code>null</code> * @throws IllegalArgumentException if <code>tileHeight</code> * or <code>tileWidth</code> is less than <code>1</code> * @throws IllegalArgumentException if the <code>image</code> * width is not an integer multiple of the <code>tileWidth</code> * @throws IllegalArgumentException if the <code>image</code> * height is not an integer multiple of the <code>tileHeight</code> */ public void setStaticTileSet(Image image, int tileWidth, int tileHeight) { // if img is null img.getWidth() will throw NullPointerException if (tileWidth < 1 || tileHeight < 1 || ((image.getWidth() % tileWidth) != 0) || ((image.getHeight() % tileHeight) != 0)) { throw new IllegalArgumentException(); } setWidthImpl(columns * tileWidth); setHeightImpl(rows * tileHeight); int noOfFrames = (image.getWidth() / tileWidth) * (image.getHeight() / tileHeight); // the zero th index is left empty for transparent tile // so it is passed in createStaticSet as noOfFrames + 1 if (noOfFrames >= (numberOfTiles - 1)) { // maintain static indices createStaticSet(image, noOfFrames + 1, tileWidth, tileHeight, true); } else { createStaticSet(image, noOfFrames + 1, tileWidth, tileHeight, false); } } /** * Draws the TiledLayer. * * The entire TiledLayer is rendered subject to the clip region of * the Graphics object. * The TiledLayer's upper left corner is rendered at the * TiledLayer's current * position relative to the origin of the Graphics object. The current * position of the TiledLayer's upper-left corner can be retrieved by * calling {@link #getX()} and {@link #getY()}. * The appropriate use of a clip region and/or translation allows * an arbitrary region * of the TiledLayer to be rendered. * <p> * If the TiledLayer's Image is mutable, the TiledLayer is rendered * using the current contents of the Image. * @param g the graphics object to draw the <code>TiledLayer</code> * @throws NullPointerException if <code>g</code> is <code>null</code> */ public final void paint(Graphics g) { if (g == null) { throw new NullPointerException(); } if (visible) { int tileIndex = 0; // y-coordinate int ty = this.y; for (int row = 0; row < cellMatrix.length; row++, ty += cellHeight) { // reset the x-coordinate at the beginning of every row // x-coordinate to draw tile into int tx = this.x; int totalCols = cellMatrix[row].length; for (int column = 0; column < totalCols; column++, tx += cellWidth) { tileIndex = cellMatrix[row][column]; // check the indices // if animated get the corresponding // static index from anim_to_static table if (tileIndex == 0) { // transparent tile continue; } else if (tileIndex < 0) { tileIndex = getAnimatedTile(tileIndex); } g.drawRegion(sourceImage, tileSetX[tileIndex], tileSetY[tileIndex], cellWidth, cellHeight, Sprite.TRANS_NONE, tx, ty, Graphics.TOP | Graphics.LEFT); } } } } // private implementationv /** * create the Image Array. * * @param image Image to use for creating the static tile set * @param noOfFrames total number of frames * @param tileWidth The width, in pixels, of a single tile * @param tileHeight The height, in pixels, of a single tile * @param maintainIndices */ private void createStaticSet(Image image, int noOfFrames, int tileWidth, int tileHeight, boolean maintainIndices) { cellWidth = tileWidth; cellHeight = tileHeight; int imageW = image.getWidth(); int imageH = image.getHeight(); sourceImage = image; numberOfTiles = noOfFrames; tileSetX = new int[numberOfTiles]; tileSetY = new int[numberOfTiles]; if (!maintainIndices) { // populate cell matrix, all the indices are 0 to begin with for (rows = 0; rows < cellMatrix.length; rows++) { int totalCols = cellMatrix[rows].length; for (columns = 0; columns < totalCols; columns++) { cellMatrix[rows][columns] = 0; } } // delete animated tiles anim_to_static = null; } int currentTile = 1; for (int y = 0; y < imageH; y += tileHeight) { for (int x = 0; x < imageW; x += tileWidth) { tileSetX[currentTile] = x; tileSetY[currentTile] = y; currentTile++; } } } /** * the overall height of the TiledLayer grid */ private int cellHeight; // = 0; /** * the overall cell width of the TiledLayer grid */ private int cellWidth; // = 0; /** * The num of rows of the TiledLayer grid. */ private int rows; // = 0; /** * the num of columns in the TiledLayer grid */ private int columns; // = 0; /** * int array for storing row and column of cell * * it contains the tile Index for both static and animated tiles */ private int[][] cellMatrix; // = null; /** * Source image for tiles */ // package access as it is used by Pixel level Collision // detection with a Sprite Image sourceImage; // = null; /** * no. of tiles */ private int numberOfTiles; // = 0; /** * X co-ordinate definitions for individual frames into the source image */ // package access as it is used by Pixel level Collision // detection with a Sprite int[] tileSetX; /** * Y co-ordinate definitions for individual frames into the source image */ // package access as it is used by Pixel level Collision // detection with a Sprite int[] tileSetY; /** * Table to map from animated Index to static Index * 0th location is unused. * anim --> static Index * -1 --> 21 * -2 --> 34 * -3 --> 45 * for now keep 0 the location of the table empty instead of computing * -index make index +ve and access this Table. * */ private int[] anim_to_static; // = null; /** * total number of animated tiles. This variable is also used as * index in the above table to add new entries to the anim_to_static table. * initialized to 1 when table is created. */ private int numOfAnimTiles; // = 0}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -