Legger til nødvendig logikk for å kunne tegne partikler

This commit is contained in:
Kristian Knarvik 2020-03-23 13:41:39 +01:00
parent 2887187190
commit 1a17473d89
2 changed files with 84 additions and 1 deletions

View File

@ -6,6 +6,7 @@ import inf112.fiasko.roborally.element_properties.Position;
import inf112.fiasko.roborally.objects.IDrawableGame;
import inf112.fiasko.roborally.objects.DrawableObject;
import inf112.fiasko.roborally.objects.IDrawableObject;
import inf112.fiasko.roborally.objects.Particle;
import inf112.fiasko.roborally.objects.Robot;
import inf112.fiasko.roborally.objects.Tile;
import inf112.fiasko.roborally.objects.Wall;
@ -27,11 +28,13 @@ public final class IOUtil {
List<IDrawableObject> drawableObjects = new ArrayList<>();
List<Tile> tilesToDraw = game.getTilesToDraw();
List<Wall> wallsToDraw = game.getWallsToDraw();
List<Particle> particlesToDraw = game.getParticlesToDraw();
List<Robot> robotsToDraw = game.getRobotsToDraw();
int gameWidth = game.getWidth();
int gameHeight = game.getHeight();
drawableObjects.addAll(getDrawableObjectsFromElementList(tilesToDraw, gameWidth, tileWidth, tileHeight));
drawableObjects.addAll(getDrawableObjectsFromElementList(wallsToDraw, gameWidth, tileWidth, tileHeight));
drawableObjects.addAll(getDrawableObjectsFromElementList(particlesToDraw, gameWidth, tileWidth, tileHeight));
drawableObjects.addAll(getDrawableRobots(robotsToDraw, gameHeight, tileWidth, tileHeight));
return drawableObjects;
}
@ -86,6 +89,9 @@ public final class IOUtil {
} else if (currentElement.getClass().isAssignableFrom(Wall.class)) {
Wall wall = (Wall) currentElement;
region = TextureConverterUtil.convertElement(wall);
} else if (currentElement.getClass().isAssignableFrom(Particle.class)) {
Particle particle = (Particle) currentElement;
region = TextureConverterUtil.convertElement(particle);
} else {
throw new IllegalArgumentException("Unknown element type passed to function.");
}
@ -118,6 +124,10 @@ public final class IOUtil {
Wall wall = (Wall) element;
hasRotatedTexture = true;
direction = wall.getDirection();
} else if (element.getClass().isAssignableFrom(Particle.class)) {
Particle particle = (Particle) element;
hasRotatedTexture = true;
direction = particle.getDirection();
} else {
throw new IllegalArgumentException("Unknown element type passed to function.");
}

View File

@ -5,9 +5,11 @@ import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Disposable;
import inf112.fiasko.roborally.element_properties.Direction;
import inf112.fiasko.roborally.element_properties.ParticleType;
import inf112.fiasko.roborally.element_properties.RobotID;
import inf112.fiasko.roborally.element_properties.TileType;
import inf112.fiasko.roborally.element_properties.WallType;
import inf112.fiasko.roborally.objects.Particle;
import inf112.fiasko.roborally.objects.Robot;
import inf112.fiasko.roborally.objects.Tile;
import inf112.fiasko.roborally.objects.Wall;
@ -29,6 +31,8 @@ public final class TextureConverterUtil {
private static final Texture robotsTexture = new Texture(Gdx.files.internal("assets/robots.png"));
private static Map<TileType, TextureConverterContainer> tileSheetTileTextureMappings;
private static Map<TileType, Boolean> tileSheetTileHasRotatedTextureMappings;
private static Map<ParticleType, TextureConverterContainer> tileSheetParticleTextureMappings;
private static Map<ParticleType, Boolean> tileSheetParticleHasRotatedTextureMappings;
private static Map<WallType, TextureConverterContainer> tileSheetWallTextureMappings;
private TextureConverterUtil() {}
@ -68,6 +72,30 @@ public final class TextureConverterUtil {
throw new IllegalArgumentException("Invalid or unimplemented tile type encountered");
}
/**
* Gets the texture representing the particle
* @param particle The particle to draw
* @return The texture to draw
*/
public static TextureRegion convertElement(Particle particle) {
if (tileSheetParticleTextureMappings == null) {
try {
loadParticleMappings();
} catch (IOException e) {
e.printStackTrace();
}
}
Direction direction = particle.getDirection();
TextureConverterContainer converterContainer = tileSheetParticleTextureMappings.get(particle.getParticleType());
if (converterContainer != null) {
return getDirectionalTextureRegion(direction, converterContainer.getXNorth(),
converterContainer.getYNorth(), converterContainer.getXEast(), converterContainer.getYEast(),
converterContainer.getXSouth(), converterContainer.getYSouth(), converterContainer.getXWest(),
converterContainer.getYWest());
}
throw new IllegalArgumentException("Invalid or unimplemented particle type encountered");
}
/**
* Gets the texture representing the tile
* @param wall The wall to draw
@ -95,8 +123,12 @@ public final class TextureConverterUtil {
throw new IllegalArgumentException("Invalid or unimplemented tile type encountered");
}
/**
* Gets the texture representing the robot
* @param robot The robot to draw
* @return The texture to draw
*/
public static TextureRegion convertElement(Robot robot) {
if (robot.getRobotId() == RobotID.ROBOT_1) {
return new TextureRegion(robotsTexture, 0, 0, 64, 64);
} else if (robot.getRobotId() == RobotID.ROBOT_2) {
@ -136,6 +168,25 @@ public final class TextureConverterUtil {
return tileSheetTileHasRotatedTextureMappings.get(tile.getTileType());
}
/**
* Checks whether a particle has textures for different rotations
*
* For a particle without a rotated texture, the texture needs to be rotated when rendering.
*
* @param particle The particle to check
* @return True if rotated versions of the texture exists. False otherwise
*/
public static boolean hasRotatedTexture(Particle particle) {
if (tileSheetTileTextureMappings == null) {
try {
loadParticleMappings();
} catch (IOException e) {
e.printStackTrace();
}
}
return tileSheetParticleHasRotatedTextureMappings.get(particle.getParticleType());
}
/**
* Loads mappings between a tile and texture
*
@ -158,6 +209,28 @@ public final class TextureConverterUtil {
}
}
/**
* Loads mappings between a particle and a texture
*
* Loads both information about mapping from a particle to a texture converter container and information about
* mapping from a particle to whether the particle has a rotated version of each texture
*
* @throws IOException If the mapping file can't be properly read
*/
private static synchronized void loadParticleMappings() throws IOException {
tileSheetParticleTextureMappings = new HashMap<>();
tileSheetParticleHasRotatedTextureMappings = new HashMap<>();
InputStream fileStream = ResourceUtil.getResourceAsInputStream("texture_sheet_particle_mapping.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fileStream));
String line;
while ((line = reader.readLine()) != null) {
String[] parameters = line.split(" ");
ParticleType type = ParticleType.valueOf(parameters[0]);
storeTextMappingInMap(parameters, type, tileSheetParticleTextureMappings,
tileSheetParticleHasRotatedTextureMappings);
}
}
/**
* Loads mappings between a wall and texture
*