v0.7.3a: refactored custom tiled visuals. Now custom tilemaps

This commit is contained in:
Evan Debenham 2019-05-25 15:27:36 -04:00
parent 3864d5c21e
commit e06e4e1c85
14 changed files with 121 additions and 121 deletions

View File

@ -68,7 +68,7 @@ import com.shatteredpixel.shatteredpixeldungeon.plants.Plant;
import com.shatteredpixel.shatteredpixeldungeon.plants.Swiftthistle; import com.shatteredpixel.shatteredpixeldungeon.plants.Swiftthistle;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTiledVisual; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Game; import com.watabou.noosa.Game;
@ -136,8 +136,8 @@ public abstract class Level implements Bundlable {
public HashMap<Class<? extends Blob>,Blob> blobs; public HashMap<Class<? extends Blob>,Blob> blobs;
public SparseArray<Plant> plants; public SparseArray<Plant> plants;
public SparseArray<Trap> traps; public SparseArray<Trap> traps;
public HashSet<CustomTiledVisual> customTiles; public HashSet<CustomTilemap> customTiles;
public HashSet<CustomTiledVisual> customWalls; public HashSet<CustomTilemap> customWalls;
protected ArrayList<Item> itemsToSpawn = new ArrayList<>(); protected ArrayList<Item> itemsToSpawn = new ArrayList<>();
@ -348,13 +348,13 @@ public abstract class Level implements Bundlable {
collection = bundle.getCollection( CUSTOM_TILES ); collection = bundle.getCollection( CUSTOM_TILES );
for (Bundlable p : collection) { for (Bundlable p : collection) {
CustomTiledVisual vis = (CustomTiledVisual)p; CustomTilemap vis = (CustomTilemap)p;
customTiles.add(vis); customTiles.add(vis);
} }
collection = bundle.getCollection( CUSTOM_WALLS ); collection = bundle.getCollection( CUSTOM_WALLS );
for (Bundlable p : collection) { for (Bundlable p : collection) {
CustomTiledVisual vis = (CustomTiledVisual)p; CustomTilemap vis = (CustomTilemap)p;
customWalls.add(vis); customWalls.add(vis);
} }

View File

@ -41,10 +41,11 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; import com.shatteredpixel.shatteredpixeldungeon.plants.Plant;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTiledVisual; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
import com.shatteredpixel.shatteredpixeldungeon.ui.TargetHealthIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.TargetHealthIndicator;
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
import com.watabou.noosa.Group; import com.watabou.noosa.Group;
import com.watabou.noosa.Tilemap;
import com.watabou.noosa.audio.Sample; import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundlable; import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
@ -372,7 +373,7 @@ public class PrisonBossLevel extends Level {
case FIGHT_ARENA: case FIGHT_ARENA:
unseal(); unseal();
CustomTiledVisual vis = new exitVisual(); CustomTilemap vis = new exitVisual();
vis.pos(11, 8); vis.pos(11, 8);
customTiles.add(vis); customTiles.add(vis);
((GameScene)ShatteredPixelDungeon.scene()).addCustomTile(vis); ((GameScene)ShatteredPixelDungeon.scene()).addCustomTile(vis);
@ -582,7 +583,16 @@ public class PrisonBossLevel extends Level {
W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W}; W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W, W};
public static class exitVisual extends CustomTiledVisual { public static class exitVisual extends CustomTilemap {
{
texture = Assets.PRISON_EXIT;
tileW = 12;
tileH = 14;
}
final int TEX_WIDTH = 256;
private static short[] render = new short[]{ private static short[] render = new short[]{
0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
@ -601,25 +611,32 @@ public class PrisonBossLevel extends Level {
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
}; };
public exitVisual() { @Override
super(Assets.PRISON_EXIT); public Tilemap create() {
Tilemap v = super.create();
int[] data = mapSimpleImage(0, 0, TEX_WIDTH);
for (int i = 0; i < data.length; i++){
if (render[i] == 0) data[i] = -1;
}
v.map(data, tileW);
return v;
} }
@Override
public CustomTiledVisual create() {
tileW = 12;
tileH = 14;
mapSimpleImage(0, 0);
return super.create();
}
@Override
protected boolean needsRender(int pos) {
return render[pos] != 0;
}
} }
public static class exitVisualWalls extends CustomTiledVisual { public static class exitVisualWalls extends CustomTilemap {
{
texture = Assets.PRISON_EXIT;
tileW = 12;
tileH = 14;
}
final int TEX_WIDTH = 256;
private static short[] render = new short[]{ private static short[] render = new short[]{
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
@ -637,21 +654,19 @@ public class PrisonBossLevel extends Level {
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
}; };
public exitVisualWalls() { @Override
super(Assets.PRISON_EXIT); public Tilemap create() {
Tilemap v = super.create();
int[] data = mapSimpleImage(4, 0, TEX_WIDTH);
for (int i = 0; i < data.length; i++){
if (render[i] == 0) data[i] = -1;
}
v.map(data, tileW);
return v;
} }
@Override
public CustomTiledVisual create() {
tileW = 12;
tileH = 14;
mapSimpleImage(4, 0);
return super.create();
}
@Override
protected boolean needsRender(int pos) {
return render[pos] != 0;
}
} }
} }

View File

@ -33,8 +33,9 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTiledVisual; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
import com.watabou.noosa.Image; import com.watabou.noosa.Image;
import com.watabou.noosa.Tilemap;
import com.watabou.utils.Random; import com.watabou.utils.Random;
import java.util.ArrayList; import java.util.ArrayList;
@ -94,24 +95,25 @@ public class MassGraveRoom extends SpecialRoom {
} }
} }
public static class Bones extends CustomTiledVisual { public static class Bones extends CustomTilemap {
private static final int WALL_OVERLAP = 3; private static final int WALL_OVERLAP = 3;
private static final int FLOOR = 7; private static final int FLOOR = 7;
public Bones(){ {
super(Assets.PRISON_QUEST); texture = Assets.PRISON_QUEST;
} }
@Override @Override
public CustomTiledVisual create() { public Tilemap create() {
int data[] = new int[tileW*tileH]; Tilemap v = super.create();
int[] data = new int[tileW*tileH];
for (int i = 0; i < data.length; i++){ for (int i = 0; i < data.length; i++){
if (i < tileW) data[i] = WALL_OVERLAP; if (i < tileW) data[i] = WALL_OVERLAP;
else data[i] = FLOOR; else data[i] = FLOOR;
} }
map( data, tileW ); v.map( data, tileW );
return super.create(); return v;
} }
@Override @Override

View File

@ -27,7 +27,8 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTiledVisual; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
import com.watabou.noosa.Tilemap;
import com.watabou.utils.Point; import com.watabou.utils.Point;
import com.watabou.utils.Random; import com.watabou.utils.Random;
@ -66,22 +67,23 @@ public class WeakFloorRoom extends SpecialRoom {
} }
Painter.set(level, well, Terrain.CHASM); Painter.set(level, well, Terrain.CHASM);
CustomTiledVisual vis = new HiddenWell(); CustomTilemap vis = new HiddenWell();
vis.pos(well.x, well.y); vis.pos(well.x, well.y);
level.customTiles.add(vis); level.customTiles.add(vis);
} }
public static class HiddenWell extends CustomTiledVisual { public static class HiddenWell extends CustomTilemap {
public HiddenWell(){ {
super(Assets.WEAK_FLOOR); texture = Assets.WEAK_FLOOR;
tileW = tileH = 1;
} }
@Override @Override
public CustomTiledVisual create() { public Tilemap create() {
tileW = tileH = 1; Tilemap v = super.create();
map( new int[]{Dungeon.depth/5}, 1); v.map( new int[]{Dungeon.depth/5}, 1);
return super.create(); return v;
} }
@Override @Override

View File

@ -27,7 +27,8 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTiledVisual; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
import com.watabou.noosa.Tilemap;
import com.watabou.utils.Point; import com.watabou.utils.Point;
public class RitualSiteRoom extends StandardRoom { public class RitualSiteRoom extends StandardRoom {
@ -67,17 +68,21 @@ public class RitualSiteRoom extends StandardRoom {
CeremonialCandle.ritualPos = c.x + (level.width() * c.y); CeremonialCandle.ritualPos = c.x + (level.width() * c.y);
} }
public static class RitualMarker extends CustomTiledVisual { public static class RitualMarker extends CustomTilemap {
public RitualMarker(){ {
super( Assets.PRISON_QUEST ); texture = Assets.PRISON_QUEST;
tileW = tileH = 3;
} }
final int TEX_WIDTH = 64;
@Override @Override
public CustomTiledVisual create() { public Tilemap create() {
tileH = tileW = 3; Tilemap v = super.create();
mapSimpleImage(0, 0); v.map(mapSimpleImage(0, 0, TEX_WIDTH), 3);
return super.create(); return v;
} }
@Override @Override

View File

@ -56,7 +56,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.DiscardedItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.DiscardedItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTiledVisual; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTerrainTilemap; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTerrainTilemap;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTileSheet; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTileSheet;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
@ -211,7 +211,7 @@ public class GameScene extends PixelScene {
customTiles = new Group(); customTiles = new Group();
terrain.add(customTiles); terrain.add(customTiles);
for( CustomTiledVisual visual : Dungeon.level.customTiles){ for( CustomTilemap visual : Dungeon.level.customTiles){
addCustomTile(visual); addCustomTile(visual);
} }
@ -256,7 +256,7 @@ public class GameScene extends PixelScene {
customWalls = new Group(); customWalls = new Group();
add(customWalls); add(customWalls);
for( CustomTiledVisual visual : Dungeon.level.customWalls){ for( CustomTilemap visual : Dungeon.level.customWalls){
addCustomWall(visual); addCustomWall(visual);
} }
@ -611,11 +611,11 @@ public class GameScene extends PixelScene {
} }
} }
public void addCustomTile( CustomTiledVisual visual){ public void addCustomTile( CustomTilemap visual){
customTiles.add( visual.create() ); customTiles.add( visual.create() );
} }
public void addCustomWall( CustomTiledVisual visual){ public void addCustomWall( CustomTilemap visual){
customWalls.add( visual.create() ); customWalls.add( visual.create() );
} }

View File

@ -28,16 +28,15 @@ import com.watabou.noosa.Tilemap;
import com.watabou.utils.Bundlable; import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
public abstract class CustomTiledVisual extends Tilemap implements Bundlable { public abstract class CustomTilemap implements Bundlable {
protected static final int SIZE = DungeonTilemap.SIZE; protected static final int SIZE = DungeonTilemap.SIZE;
public int tileX, tileY; //x and y coords for texture within a level public int tileX, tileY; //x and y coords for texture within a level
public int tileW = 1, tileH = 1; //width and height in tiles public int tileW = 1, tileH = 1; //width and height in tiles
public CustomTiledVisual(Object tx) { protected Object texture;
super(tx, new TextureFilm( tx, SIZE, SIZE ) ); private Tilemap vis = null;
}
public void pos(int pos) { public void pos(int pos) {
pos( pos%Dungeon.level.width(), pos/Dungeon.level.width() ); pos( pos%Dungeon.level.width(), pos/Dungeon.level.width() );
@ -63,17 +62,11 @@ public abstract class CustomTiledVisual extends Tilemap implements Bundlable {
this.tileH = tileH; this.tileH = tileH;
} }
public CustomTiledVisual create(){ //utility method for getting data for a simple image
camera = null; //assumes tileW and tileH have already been set
x = tileX*SIZE; protected int[] mapSimpleImage(int txX, int txY, int texW){
y = tileY*SIZE; int[] data = new int[tileW * tileH];
return this; int texTileWidth = texW/SIZE;
}
//assumes that width and height are already set.
protected void mapSimpleImage(int txX, int txY){
int data[] = new int[tileW * tileH];
int texTileWidth = texture.width/SIZE;
int x = txX, y = txY; int x = txX, y = txY;
for (int i = 0; i < data.length; i++){ for (int i = 0; i < data.length; i++){
data[i] = x + (texTileWidth*y); data[i] = x + (texTileWidth*y);
@ -84,18 +77,23 @@ public abstract class CustomTiledVisual extends Tilemap implements Bundlable {
y++; y++;
} }
} }
return data;
}
map(data, tileW); public Tilemap create(){
if (vis != null && vis.alive) vis.killAndErase();
vis = new Tilemap(texture, new TextureFilm( texture, SIZE, SIZE ));
vis.x = tileX*SIZE;
vis.y = tileY*SIZE;
return vis;
} }
//x and y here are the coordinates tapped within the tile visual //x and y here are the coordinates tapped within the tile visual
public Image image(int tileX, int tileY){ public Image image(int tileX, int tileY){
if (!needsRender(tileX + mapWidth*tileY)){ if (vis == null){
return null; return null;
} else { } else {
Image img = new Image(texture); return vis.image(tileX, tileY);
img.frame(tileset.get(data[tileX + mapWidth * tileY]));
return img;
} }
} }

View File

@ -103,6 +103,6 @@ public class DungeonTerrainTilemap extends DungeonTilemap {
@Override @Override
protected boolean needsRender(int pos) { protected boolean needsRender(int pos) {
return data[pos] >= 0 && data[pos] != DungeonTileSheet.WATER; return super.needsRender(pos) && data[pos] != DungeonTileSheet.WATER;
} }
} }

View File

@ -98,8 +98,4 @@ public class DungeonWallsTilemap extends DungeonTilemap {
return true; return true;
} }
@Override
protected boolean needsRender(int pos) {
return data[pos] != -1;
}
} }

View File

@ -60,9 +60,4 @@ public class GridTileMap extends DungeonTilemap {
} }
} }
@Override
protected boolean needsRender(int pos) {
return data[pos] != -1;
}
} }

View File

@ -49,9 +49,4 @@ public class RaisedTerrainTilemap extends DungeonTilemap {
return -1; return -1;
} }
@Override
protected boolean needsRender(int pos) {
return data[pos] != -1;
}
} }

View File

@ -108,8 +108,4 @@ public class TerrainFeaturesTilemap extends DungeonTilemap {
} ); } );
} }
@Override
protected boolean needsRender(int pos) {
return data[pos] != -1;
}
} }

View File

@ -216,8 +216,4 @@ public class WallBlockingTilemap extends Tilemap {
} }
} }
@Override
protected boolean needsRender(int pos) {
return data[pos] > BLOCK_NONE;
}
} }

View File

@ -26,7 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTiledVisual; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTerrainTilemap; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTerrainTilemap;
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextMultiline; import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextMultiline;
@ -50,11 +50,11 @@ public class WndInfoCell extends Window {
tile = Terrain.CHASM; tile = Terrain.CHASM;
} }
CustomTiledVisual customTile = null; CustomTilemap customTile = null;
Image customImage = null; Image customImage = null;
int x = cell % Dungeon.level.width(); int x = cell % Dungeon.level.width();
int y = cell / Dungeon.level.width(); int y = cell / Dungeon.level.width();
for (CustomTiledVisual i : Dungeon.level.customTiles){ for (CustomTilemap i : Dungeon.level.customTiles){
if ((x >= i.tileX && x < i.tileX+i.tileW) && if ((x >= i.tileX && x < i.tileX+i.tileW) &&
(y >= i.tileY && y < i.tileY+i.tileH)){ (y >= i.tileY && y < i.tileY+i.tileH)){
if ((customImage = i.image(x - i.tileX, y - i.tileY)) != null) { if ((customImage = i.image(x - i.tileX, y - i.tileY)) != null) {