v0.3.2a: refactored how level-generated visuals work, more flexible and resolves bugs

This commit is contained in:
Evan Debenham 2015-11-06 18:45:41 -05:00 committed by Evan Debenham
parent b5176de721
commit e2a57a0e31
14 changed files with 90 additions and 82 deletions

View File

@ -23,7 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ToxicTrap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ToxicTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.watabou.noosa.Camera; import com.watabou.noosa.Camera;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
import com.watabou.noosa.audio.Sample; import com.watabou.noosa.audio.Sample;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Bones; import com.shatteredpixel.shatteredpixeldungeon.Bones;
@ -305,9 +305,11 @@ public class CavesBossLevel extends Level {
return super.tileDesc( tile ); return super.tileDesc( tile );
} }
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals() {
CavesLevel.addVisuals( this, scene ); super.addVisuals();
CavesLevel.addCavesVisuals(this, visuals);
return visuals;
} }
} }

View File

@ -23,7 +23,6 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*;
import com.watabou.noosa.Game; import com.watabou.noosa.Game;
import com.watabou.noosa.Group; import com.watabou.noosa.Group;
import com.watabou.noosa.Scene;
import com.watabou.noosa.particles.PixelParticle; import com.watabou.noosa.particles.PixelParticle;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -236,15 +235,16 @@ public class CavesLevel extends RegularLevel {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals() {
super.addVisuals( scene ); super.addVisuals();
addVisuals( this, scene ); addCavesVisuals( this, visuals );
return visuals;
} }
public static void addVisuals( Level level, Scene scene ) { public static void addCavesVisuals( Level level, Group group ) {
for (int i=0; i < LENGTH; i++) { for (int i=0; i < LENGTH; i++) {
if (level.map[i] == Terrain.WALL_DECO) { if (level.map[i] == Terrain.WALL_DECO) {
scene.add( new Vein( i ) ); group.add( new Vein( i ) );
} }
} }
} }

View File

@ -20,7 +20,7 @@
*/ */
package com.shatteredpixel.shatteredpixeldungeon.levels; package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
import com.watabou.noosa.tweeners.AlphaTweener; import com.watabou.noosa.tweeners.AlphaTweener;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Bones; import com.shatteredpixel.shatteredpixeldungeon.Bones;
@ -264,7 +264,9 @@ public class CityBossLevel extends Level {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals( ) {
CityLevel.addVisuals( this, scene ); super.addVisuals();
CityLevel.addCityVisuals(this, visuals);
return visuals;
} }
} }

View File

@ -21,7 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.levels; package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
import com.watabou.noosa.particles.Emitter; import com.watabou.noosa.particles.Emitter;
import com.watabou.noosa.particles.PixelParticle; import com.watabou.noosa.particles.PixelParticle;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -142,15 +142,16 @@ public class CityLevel extends RegularLevel {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals() {
super.addVisuals( scene ); super.addVisuals();
addVisuals( this, scene ); addCityVisuals( this, visuals );
return visuals;
} }
public static void addVisuals( Level level, Scene scene ) { public static void addCityVisuals( Level level, Group group ) {
for (int i=0; i < LENGTH; i++) { for (int i=0; i < LENGTH; i++) {
if (level.map[i] == Terrain.WALL_DECO) { if (level.map[i] == Terrain.WALL_DECO) {
scene.add( new Smoke( i ) ); group.add( new Smoke( i ) );
} }
} }
} }

View File

@ -20,7 +20,7 @@
*/ */
package com.shatteredpixel.shatteredpixeldungeon.levels; package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Bones; import com.shatteredpixel.shatteredpixeldungeon.Bones;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -255,7 +255,9 @@ public class HallsBossLevel extends Level {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals () {
HallsLevel.addVisuals( this, scene ); super.addVisuals();
HallsLevel.addHallsVisuals( this, visuals );
return visuals;
} }
} }

View File

@ -27,7 +27,6 @@ import android.opengl.GLES20;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*;
import com.watabou.noosa.Game; import com.watabou.noosa.Game;
import com.watabou.noosa.Group; import com.watabou.noosa.Group;
import com.watabou.noosa.Scene;
import com.watabou.noosa.particles.PixelParticle; import com.watabou.noosa.particles.PixelParticle;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -150,15 +149,16 @@ public class HallsLevel extends RegularLevel {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals() {
super.addVisuals( scene ); super.addVisuals();
addVisuals( this, scene ); addHallsVisuals( this, visuals );
return visuals;
} }
public static void addVisuals( Level level, Scene scene ) { public static void addHallsVisuals( Level level, Group group ) {
for (int i=0; i < LENGTH; i++) { for (int i=0; i < LENGTH; i++) {
if (level.map[i] == 63) { if (level.map[i] == Terrain.WATER) {
scene.add( new Stream( i ) ); group.add( new Stream( i ) );
} }
} }
} }

View File

@ -23,7 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import java.util.Arrays; import java.util.Arrays;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.items.Amulet; import com.shatteredpixel.shatteredpixeldungeon.items.Amulet;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
@ -169,9 +169,10 @@ public class LastLevel extends Level {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals () {
super.addVisuals( scene ); super.addVisuals();
HallsLevel.addVisuals( this, scene ); HallsLevel.addHallsVisuals(this, visuals);
return visuals;
} }
@Override @Override

View File

@ -27,7 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Imp;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.levels.Room.Type; import com.shatteredpixel.shatteredpixeldungeon.levels.Room.Type;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
import com.watabou.utils.Graph; import com.watabou.utils.Graph;
import com.watabou.utils.Random; import com.watabou.utils.Random;
@ -217,10 +217,11 @@ public class LastShopLevel extends RegularLevel {
protected boolean[] grass() { protected boolean[] grass() {
return Patch.generate( 0.30f, 3 ); return Patch.generate( 0.30f, 3 );
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals( ) {
super.addVisuals( scene ); super.addVisuals();
CityLevel.addVisuals( this, scene ); CityLevel.addCityVisuals(this, visuals);
return visuals;
} }
} }

View File

@ -75,7 +75,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.CustomTileVisual;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Game; import com.watabou.noosa.Game;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
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;
@ -162,6 +162,8 @@ public abstract class Level implements Bundlable {
public HashSet<CustomTileVisual> customTiles; public HashSet<CustomTileVisual> customTiles;
protected ArrayList<Item> itemsToSpawn = new ArrayList<>(); protected ArrayList<Item> itemsToSpawn = new ArrayList<>();
protected Group visuals = new Group();
public int color1 = 0x004400; public int color1 = 0x004400;
public int color2 = 0x88CC44; public int color2 = 0x88CC44;
@ -485,15 +487,17 @@ public abstract class Level implements Bundlable {
} }
} }
public void addVisuals( Scene scene ) { public Group addVisuals() {
visuals.clear();
for (int i=0; i < LENGTH; i++) { for (int i=0; i < LENGTH; i++) {
if (pit[i]) { if (pit[i]) {
scene.add( new WindParticle.Wind( i ) ); visuals.add( new WindParticle.Wind( i ) );
if (i >= WIDTH && water[i-WIDTH]) { if (i >= WIDTH && water[i-WIDTH]) {
scene.add( new FlowParticle.Flow( i - WIDTH ) ); visuals.add( new FlowParticle.Flow( i - WIDTH ) );
} }
} }
} }
return visuals;
} }
public int nMobs() { public int nMobs() {

View File

@ -35,7 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.ui.CustomTileVisual; import com.shatteredpixel.shatteredpixeldungeon.ui.CustomTileVisual;
import com.shatteredpixel.shatteredpixeldungeon.ui.HealthIndicator; import com.shatteredpixel.shatteredpixeldungeon.ui.HealthIndicator;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
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;
@ -63,9 +63,6 @@ public class PrisonBossLevel extends Level {
//keep track of that need to be removed as the level is changed. We dump 'em back into the level at the end. //keep track of that need to be removed as the level is changed. We dump 'em back into the level at the end.
private ArrayList<Item> storedItems = new ArrayList<>(); private ArrayList<Item> storedItems = new ArrayList<>();
//we keep track of torches so we can kill them as needed when layouts change.
private ArrayList<PrisonLevel.Torch> torches = new ArrayList<>();
@Override @Override
public String tilesTex() { public String tilesTex() {
@ -242,7 +239,7 @@ public class PrisonBossLevel extends Level {
exit = i; exit = i;
visited = mapped = new boolean[LENGTH]; visited = mapped = new boolean[LENGTH];
addVisuals(ShatteredPixelDungeon.scene()); addVisuals(); //this also resets existing visuals
resetTraps(); resetTraps();
Dungeon.observe(); Dungeon.observe();
@ -342,21 +339,10 @@ public class PrisonBossLevel extends Level {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals() {
super.addVisuals(scene); super.addVisuals();
//kill old torches before adding new ones PrisonLevel.addPrisonVisuals(this, visuals);
for (PrisonLevel.Torch t : torches.toArray(new PrisonLevel.Torch[torches.size()])){ return visuals;
t.kill();
torches.remove(t);
}
for (int i=0; i < LENGTH; i++) {
if (map[i] == Terrain.WALL_DECO) {
PrisonLevel.Torch t = new PrisonLevel.Torch( i );
torches.add(t);
scene.add( t );
}
}
} }
private static final int W = Terrain.WALL; private static final int W = Terrain.WALL;

View File

@ -21,7 +21,7 @@
package com.shatteredpixel.shatteredpixeldungeon.levels; package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
import com.watabou.noosa.particles.Emitter; import com.watabou.noosa.particles.Emitter;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -156,11 +156,16 @@ public class PrisonLevel extends RegularLevel {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals() {
super.addVisuals(scene); super.addVisuals();
addPrisonVisuals(this, visuals);
return visuals;
}
public static void addPrisonVisuals(Level level, Group group){
for (int i=0; i < LENGTH; i++) { for (int i=0; i < LENGTH; i++) {
if (map[i] == Terrain.WALL_DECO) { if (level.map[i] == Terrain.WALL_DECO) {
scene.add( new Torch( i ) ); group.add( new Torch( i ) );
} }
} }
} }

View File

@ -30,7 +30,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.levels.Room.Type; import com.shatteredpixel.shatteredpixeldungeon.levels.Room.Type;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
import com.watabou.utils.Graph; import com.watabou.utils.Graph;
import com.watabou.utils.Random; import com.watabou.utils.Random;
@ -203,11 +203,12 @@ public class SewerBossLevel extends RegularLevel {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals() {
SewerLevel.addVisuals( this, scene ); super.addVisuals();
SewerLevel.addSewerVisuals(this, visuals);
return visuals;
} }
@Override @Override
protected void createMobs() { protected void createMobs() {
Mob mob = Bestiary.mob( Dungeon.depth ); Mob mob = Bestiary.mob( Dungeon.depth );

View File

@ -22,7 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.*;
import com.watabou.noosa.Game; import com.watabou.noosa.Game;
import com.watabou.noosa.Scene; import com.watabou.noosa.Group;
import com.watabou.noosa.particles.Emitter; import com.watabou.noosa.particles.Emitter;
import com.watabou.noosa.particles.PixelParticle; import com.watabou.noosa.particles.PixelParticle;
import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Assets;
@ -139,15 +139,16 @@ public class SewerLevel extends RegularLevel {
} }
@Override @Override
public void addVisuals( Scene scene ) { public Group addVisuals() {
super.addVisuals( scene ); super.addVisuals();
addVisuals( this, scene ); addSewerVisuals(this, visuals);
return visuals;
} }
public static void addVisuals( Level level, Scene scene ) { public static void addSewerVisuals( Level level, Group group ) {
for (int i=0; i < LENGTH; i++) { for (int i=0; i < LENGTH; i++) {
if (level.map[i] == Terrain.WALL_DECO) { if (level.map[i] == Terrain.WALL_DECO) {
scene.add( new Sink( i ) ); group.add( new Sink( i ) );
} }
} }
} }

View File

@ -118,6 +118,7 @@ public class GameScene extends PixelScene {
private Group terrain; private Group terrain;
private Group customTiles; private Group customTiles;
private Group levelVisuals;
private Group ripples; private Group ripples;
private Group plants; private Group plants;
private Group traps; private Group traps;
@ -167,12 +168,13 @@ public class GameScene extends PixelScene {
customTiles = new Group(); customTiles = new Group();
terrain.add(customTiles); terrain.add(customTiles);
Dungeon.level.addVisuals(this);
for( CustomTileVisual visual : Dungeon.level.customTiles){ for( CustomTileVisual visual : Dungeon.level.customTiles){
addCustomTile(visual.create()); addCustomTile(visual.create());
} }
levelVisuals = Dungeon.level.addVisuals();
add(levelVisuals);
traps = new Group(); traps = new Group();
add(traps); add(traps);
@ -549,7 +551,7 @@ public class GameScene extends PixelScene {
} }
// ------------------------------------------------------- // -------------------------------------------------------
public static void add( Plant plant ) { public static void add( Plant plant ) {
if (scene != null) { if (scene != null) {
scene.addPlantSprite( plant ); scene.addPlantSprite( plant );