Create GameRunner API scaffolding

This commit is contained in:
2021-03-01 19:30:32 +01:00
parent c20bf208ac
commit a4fe85e87c
9 changed files with 116 additions and 11 deletions

View File

@@ -0,0 +1,5 @@
package com.bartlomiejpluta.base.api.context;
public interface Context {
void openMap(String mapUid);
}

View File

@@ -0,0 +1,7 @@
package com.bartlomiejpluta.base.api.runner;
import com.bartlomiejpluta.base.api.context.Context;
public interface GameRunner {
void init(Context context);
}

View File

@@ -1,5 +1,12 @@
package ${package}; package ${package};
public class ${className} { import com.bartlomiejpluta.base.api.runner.GameRunner;
import com.bartlomiejpluta.base.api.context.Context;
public class ${className} implements GameRunner {
@Override
public void init(Context context) {
throw new RuntimeException("Not implemented yet");
}
} }

View File

@@ -1,6 +1,6 @@
package com.bartlomiejpluta.base.game.logic; package com.bartlomiejpluta.base.game.logic;
import com.bartlomiejpluta.base.core.error.AppException; import com.bartlomiejpluta.base.api.runner.GameRunner;
import com.bartlomiejpluta.base.core.gl.object.texture.TextureManager; import com.bartlomiejpluta.base.core.gl.object.texture.TextureManager;
import com.bartlomiejpluta.base.core.gl.render.Renderer; import com.bartlomiejpluta.base.core.gl.render.Renderer;
import com.bartlomiejpluta.base.core.logic.GameLogic; import com.bartlomiejpluta.base.core.logic.GameLogic;
@@ -11,11 +11,14 @@ import com.bartlomiejpluta.base.core.util.mesh.MeshManager;
import com.bartlomiejpluta.base.core.world.camera.Camera; import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.game.image.manager.ImageManager; import com.bartlomiejpluta.base.game.image.manager.ImageManager;
import com.bartlomiejpluta.base.game.map.manager.MapManager; import com.bartlomiejpluta.base.game.map.manager.MapManager;
import com.bartlomiejpluta.base.game.map.model.GameMap; import com.bartlomiejpluta.base.game.project.loader.ClassLoader;
import com.bartlomiejpluta.base.game.project.loader.ProjectLoader; import com.bartlomiejpluta.base.game.project.loader.ProjectLoader;
import com.bartlomiejpluta.base.game.project.model.Project;
import com.bartlomiejpluta.base.game.project.model.RenderableContext;
import com.bartlomiejpluta.base.game.tileset.manager.TileSetManager; import com.bartlomiejpluta.base.game.tileset.manager.TileSetManager;
import com.bartlomiejpluta.base.game.world.entity.manager.EntityManager; import com.bartlomiejpluta.base.game.world.entity.manager.EntityManager;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -34,21 +37,26 @@ public class DefaultGameLogic implements GameLogic {
private final FPSMonitor fpsMonitor; private final FPSMonitor fpsMonitor;
private final MapManager mapManager; private final MapManager mapManager;
private final ProjectLoader projectLoader; private final ProjectLoader projectLoader;
private final ClassLoader classLoader;
private final RenderableContext context;
private final Camera camera = new Camera(); private final Camera camera = new Camera();
private GameMap map; private Project project;
private GameRunner runner;
@SneakyThrows
@Override @Override
public void init(Window window) { public void init(Window window) {
log.info("Initializing game logic"); log.info("Initializing game logic");
renderer.init(); renderer.init();
// Loading is not available right now, because no project is located in the resources project = projectLoader.loadProject();
// projectLoader.loadProject(); var runnerClass = classLoader.<GameRunner>loadClass(project.getRunner());
// map = mapManager.getTheStartMapFromSomewhere() ... runner = runnerClass.getConstructor().newInstance();
throw new AppException("TODO: Everything seems to be working fine. The game engine logic is not implemented yet though..."); runner.init(context);
} }
@Override @Override
@@ -63,7 +71,7 @@ public class DefaultGameLogic implements GameLogic {
@Override @Override
public void render(Window window) { public void render(Window window) {
renderer.render(window, camera, map); renderer.render(window, camera, context);
} }
@Override @Override

View File

@@ -0,0 +1,5 @@
package com.bartlomiejpluta.base.game.project.loader;
public interface ClassLoader {
<T> Class<T> loadClass(String className);
}

View File

@@ -0,0 +1,18 @@
package com.bartlomiejpluta.base.game.project.loader;
import com.bartlomiejpluta.base.core.error.AppException;
import org.springframework.stereotype.Component;
@Component
public class DefaultClassLoader implements ClassLoader {
@Override
@SuppressWarnings("unchecked")
public <T> Class<T> loadClass(String className) {
try {
return (Class<T>) getClass().getClassLoader().loadClass(className);
} catch (ClassNotFoundException e) {
throw new AppException(e);
}
}
}

View File

@@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.game.project.loader;
import com.bartlomiejpluta.base.game.image.manager.ImageManager; import com.bartlomiejpluta.base.game.image.manager.ImageManager;
import com.bartlomiejpluta.base.game.map.manager.MapManager; import com.bartlomiejpluta.base.game.map.manager.MapManager;
import com.bartlomiejpluta.base.game.project.config.ProjectConfiguration; import com.bartlomiejpluta.base.game.project.config.ProjectConfiguration;
import com.bartlomiejpluta.base.game.project.model.Project;
import com.bartlomiejpluta.base.game.project.serial.ProjectDeserializer; import com.bartlomiejpluta.base.game.project.serial.ProjectDeserializer;
import com.bartlomiejpluta.base.game.tileset.manager.TileSetManager; import com.bartlomiejpluta.base.game.tileset.manager.TileSetManager;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -19,11 +20,13 @@ public class DefaultProjectLoader implements ProjectLoader {
private final ImageManager imageManager; private final ImageManager imageManager;
@Override @Override
public void loadProject() { public Project loadProject() {
var resource = DefaultProjectLoader.class.getResourceAsStream(configuration.projectFile(configuration.getMainFile())); var resource = DefaultProjectLoader.class.getResourceAsStream(configuration.projectFile(configuration.getMainFile()));
var project = projectDeserializer.deserialize(resource); var project = projectDeserializer.deserialize(resource);
project.getTileSetAssets().forEach(tileSetManager::registerAsset); project.getTileSetAssets().forEach(tileSetManager::registerAsset);
project.getMapAssets().forEach(mapManager::registerAsset); project.getMapAssets().forEach(mapManager::registerAsset);
project.getImageAssets().forEach(imageManager::registerAsset); project.getImageAssets().forEach(imageManager::registerAsset);
return project;
} }
} }

View File

@@ -1,5 +1,7 @@
package com.bartlomiejpluta.base.game.project.loader; package com.bartlomiejpluta.base.game.project.loader;
import com.bartlomiejpluta.base.game.project.model.Project;
public interface ProjectLoader { public interface ProjectLoader {
void loadProject(); Project loadProject();
} }

View File

@@ -0,0 +1,50 @@
package com.bartlomiejpluta.base.game.project.model;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.core.gl.object.texture.TextureManager;
import com.bartlomiejpluta.base.core.gl.render.Renderable;
import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager;
import com.bartlomiejpluta.base.core.logic.Updatable;
import com.bartlomiejpluta.base.core.ui.Window;
import com.bartlomiejpluta.base.core.util.mesh.MeshManager;
import com.bartlomiejpluta.base.core.world.camera.Camera;
import com.bartlomiejpluta.base.game.image.manager.ImageManager;
import com.bartlomiejpluta.base.game.map.manager.MapManager;
import com.bartlomiejpluta.base.game.map.model.GameMap;
import com.bartlomiejpluta.base.game.tileset.manager.TileSetManager;
import com.bartlomiejpluta.base.game.world.entity.manager.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RenderableContext implements Context, Updatable, Renderable {
private final TileSetManager tileSetManager;
private final MeshManager meshManager;
private final TextureManager textureManager;
private final EntityManager entityManager;
private final ImageManager imageManager;
private final MapManager mapManager;
private GameMap map;
@Override
public void openMap(String mapUid) {
map = mapManager.loadMap(mapUid);
}
@Override
public void update(float dt) {
if (map != null) {
map.update(dt);
}
}
@Override
public void render(Window window, Camera camera, ShaderManager shaderManager) {
if (map != null) {
map.render(window, camera, shaderManager);
}
}
}