Skip to content

Commit

Permalink
Support for changing maps on GameScreen & Player
Browse files Browse the repository at this point in the history
  • Loading branch information
TheRealEmissions committed Mar 19, 2024
1 parent dd0d87f commit ccf8f8c
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 32 deletions.
31 changes: 31 additions & 0 deletions core/src/uk/ac/york/student/map/MapManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package uk.ac.york.student.map;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TmxMapLoader;
import lombok.Getter;
import lombok.experimental.UtilityClass;
import uk.ac.york.student.utils.MapOfSuppliers;

import java.io.File;
import java.util.HashMap;
import java.util.Objects;

@UtilityClass
public final class MapManager {
@Getter
private static final MapOfSuppliers<String, TiledMap> maps = new MapOfSuppliers<>();
static {
File mapFiles = Gdx.files.internal("map").file();
if (!mapFiles.isDirectory()) throw new RuntimeException("map directory not found");
TmxMapLoader.Parameters parameter = new TmxMapLoader.Parameters();
parameter.textureMinFilter = Texture.TextureFilter.Nearest;
parameter.textureMagFilter = Texture.TextureFilter.Nearest;
for (File file : Objects.requireNonNull(mapFiles.listFiles())) {
if (file.getName().endsWith(".tmx")) {
maps.put(file.getName().replace(".tmx", ""), () -> new TmxMapLoader().load("map/" + file.getName(), parameter));
}
}
}
}
37 changes: 24 additions & 13 deletions core/src/uk/ac/york/student/player/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.badlogic.gdx.math.collision.BoundingBox;
import com.badlogic.gdx.scenes.scene2d.Actor;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand All @@ -25,8 +26,8 @@
@Getter
public class Player extends Actor implements PlayerScore, InputProcessor {
private float mapScale;
private final Sprite sprite;
private final TiledMap map;
private Sprite sprite;
private TiledMap map;
private final TextureAtlas textureAtlas = new TextureAtlas("sprite-atlases/character-sprites.atlas");
public Player(@NotNull TiledMap map, @NotNull Vector2 startPosition) {
super();
Expand All @@ -44,6 +45,22 @@ public Player(@NotNull TiledMap map, @NotNull Vector2 startPosition) {
loadMapObjectBoundingBoxes();
}

public void setMap(@NotNull TiledMap map) {
this.map = map;
TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0);
final int maxHeight = layer.getHeight() * layer.getTileHeight();
final int maxWidth = layer.getWidth() * layer.getTileWidth();
mapScale = Math.max(Gdx.graphics.getWidth() / maxWidth, Gdx.graphics.getHeight() / maxHeight);
sprite = textureAtlas.createSprite("char3_left");
sprite.setAlpha(1);
// scale sprite
sprite.setSize(sprite.getWidth() * mapScale, sprite.getHeight() * mapScale);
setBounds(sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());
tileObjectBoundingBoxes.clear();
loadMapObjectBoundingBoxes();

}

@Getter
private enum Movement {
UP, DOWN, LEFT, RIGHT, BOOST;
Expand All @@ -55,17 +72,6 @@ void set(boolean is) {
}
}

/**
* todo: fix this
* @param scale the scale to resize the sprite to
*/
public void resize(float scale) {
sprite.setSize(sprite.getWidth() * scale, sprite.getHeight() * scale);
sprite.setPosition(sprite.getX() * scale, sprite.getY() * scale);
mapScale = scale;
setBounds(sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());
}

public void move() {
final TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0);
final int maxHeight = layer.getHeight() * layer.getTileHeight();
Expand Down Expand Up @@ -136,6 +142,11 @@ public void loadMapObjectBoundingBoxes() {
return null;
}

public void setPosition(Vector2 position) {
sprite.setPosition(position.x, position.y);
setPosition(position.x, position.y);
}

public @Nullable Transition isInTransitionTile() {
// if tile has property "isNewMap" or "isActivity" set to true, return true
MapObject tileObject = getCurrentMapObject();
Expand Down
105 changes: 86 additions & 19 deletions core/src/uk/ac/york/student/screens/GameScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,32 +21,36 @@
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import uk.ac.york.student.GdxGame;
import uk.ac.york.student.assets.skins.SkinManager;
import uk.ac.york.student.assets.skins.Skins;
import uk.ac.york.student.map.ActionMapObject;
import uk.ac.york.student.map.ActivityMapObject;
import uk.ac.york.student.map.MapManager;
import uk.ac.york.student.map.TransitionMapObject;
import uk.ac.york.student.player.Player;

import java.util.concurrent.atomic.AtomicReference;

public class GameScreen extends BaseScreen implements InputProcessor {
private static final int ACTION_KEY = Input.Keys.E;
@Getter
private final Stage processor;
private final Player player;
private final TiledMap map;
private TiledMap map = MapManager.getMaps().getResult("map");
private float mapScale;
private TiledMapRenderer renderer;
private final Skin craftacularSkin = SkinManager.getSkins().getResult(Skins.CRAFTACULAR);
private final int actionKey = Input.Keys.E;
private final Table table = new Table(craftacularSkin);
private Label actionLabel = new Label("ENG1 Project. Super cool. (You will never see this)", craftacularSkin);
private final Label actionLabel = new Label("ENG1 Project. Super cool. (You will never see this)", craftacularSkin);
public GameScreen(GdxGame game) {
super(game);

// Set up the tilemap
// Cannot extract into a method because class variables are set as final
//#region Load Tilemap
TmxMapLoader.Parameters parameter = new TmxMapLoader.Parameters();
parameter.textureMinFilter = Texture.TextureFilter.Nearest;
parameter.textureMagFilter = Texture.TextureFilter.Nearest;
map = new TmxMapLoader().load("map/map.tmx", parameter);
TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0);
int tileWidth = layer.getTileWidth();
int tileHeight = layer.getTileHeight();
Expand Down Expand Up @@ -89,6 +93,35 @@ public boolean keyUp(InputEvent event, int keycode) {
});
}

public void changeMap(String mapName) {
map.dispose();
map = MapManager.getMaps().getResult(mapName);
TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0);
int tileWidth = layer.getTileWidth();
int tileHeight = layer.getTileHeight();
mapScale = Math.max(Gdx.graphics.getWidth() / (layer.getWidth() * tileWidth), Gdx.graphics.getHeight() / (layer.getHeight() * tileHeight));
renderer = new OrthogonalTiledMapRenderer(map, mapScale);

Vector2 startingPoint = new Vector2(25, 25);
MapLayer gameObjectsLayer = map.getLayers().get("gameObjects");
MapObjects objects = gameObjectsLayer.getObjects();
for (MapObject object : objects) {
if (!object.getName().equals("startingPoint")) continue;
MapProperties properties = object.getProperties();
if (!properties.containsKey("spawnpoint")) continue;
Boolean spawnpoint = properties.get("spawnpoint", Boolean.class);
if (spawnpoint == null || Boolean.FALSE.equals(spawnpoint)) continue;
RectangleMapObject rectangleObject = (RectangleMapObject) object;
Rectangle rectangle = rectangleObject.getRectangle();
startingPoint = new Vector2(rectangle.getX() * mapScale, rectangle.getY() * mapScale);
break;
}

player.setPosition(startingPoint);
player.setMap(map);

}

@Override
public void show() {
float width = Gdx.graphics.getWidth();
Expand All @@ -108,6 +141,8 @@ public void show() {

}

private final AtomicReference<@Nullable ActionMapObject> currentActionMapObject = new AtomicReference<>(null);

@Override
public void render(float v) {
Gdx.gl.glClearColor(1, 0, 0, 1);
Expand Down Expand Up @@ -144,24 +179,40 @@ public void render(float v) {

Player.Transition transitionTile = player.isInTransitionTile();
if (transitionTile != null) {
MapObject tileObject = player.getCurrentMapObject();
assert tileObject != null;
String actionText = "Press " + Input.Keys.toString(actionKey) + " to ";
if (transitionTile.equals(Player.Transition.ACTIVITY)) {
actionText += tileObject.getProperties().get("activityStr", String.class);
} else if (transitionTile.equals(Player.Transition.NEW_MAP)) {
actionText += tileObject.getProperties().get("newMapStr", String.class);
}
ActionMapObject actionMapObject = getActionMapObject(transitionTile, player.getCurrentMapObject());
currentActionMapObject.set(actionMapObject);
String actionText = getActionText(actionMapObject);
actionLabel.setText(actionText);
table.add(actionLabel);
} else {
currentActionMapObject.set(null);
table.clearChildren();
}

processor.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f));
processor.draw();
}

@NotNull
private String getActionText(ActionMapObject actionMapObject) {
String actionText = "Press " + Input.Keys.toString(ACTION_KEY) + " to ";
actionText += actionMapObject.getStr();
return actionText;
}

@NotNull
private static ActionMapObject getActionMapObject(Player.@NotNull Transition transitionTile, MapObject tileObject) {
ActionMapObject actionMapObject;
if (transitionTile.equals(Player.Transition.ACTIVITY)) {
actionMapObject = new ActivityMapObject(tileObject);
} else if (transitionTile.equals(Player.Transition.NEW_MAP)) {
actionMapObject = new TransitionMapObject(tileObject);
} else {
throw new IllegalStateException("Unexpected value: " + transitionTile);
}
return actionMapObject;
}

@Override
public void resize(int screenWidth, int screenHeight) {
TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0);
Expand All @@ -171,8 +222,8 @@ public void resize(int screenWidth, int screenHeight) {
renderer = new OrthogonalTiledMapRenderer(map, mapScale);

OrthographicCamera camera = (OrthographicCamera) processor.getCamera();
camera.viewportWidth = width;
camera.viewportHeight = height;
camera.viewportWidth = screenWidth;
camera.viewportHeight = screenHeight;

processor.getViewport().update(screenWidth, screenHeight, true);

Expand All @@ -192,7 +243,7 @@ public void resize(int screenWidth, int screenHeight) {

renderer.setView(camera);

processor.getViewport().update(width, height, true);
processor.getViewport().update(screenWidth, screenHeight, true);
}

@Override
Expand All @@ -214,11 +265,27 @@ public void hide() {
public void dispose() {
map.dispose();
processor.dispose();
craftacularSkin.dispose();
player.dispose();
}

@Override
public boolean keyDown(int keycode) {
return player.keyDown(keycode);
boolean playerKeyDown = player.keyDown(keycode);
if (keycode == ACTION_KEY) {
ActionMapObject actionMapObject = currentActionMapObject.get();
if (actionMapObject != null) {
if (actionMapObject instanceof ActivityMapObject) {

Check warning on line 278 in core/src/uk/ac/york/student/screens/GameScreen.java

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Statement with empty body

`if` statement has empty body

} else if (actionMapObject instanceof TransitionMapObject) {
TransitionMapObject transitionMapObject = (TransitionMapObject) actionMapObject;
changeMap(transitionMapObject.getType());
} else {
throw new IllegalStateException("Unexpected value: " + actionMapObject);
}
}
}
return playerKeyDown;
}

@Override
Expand Down

0 comments on commit ccf8f8c

Please sign in to comment.