From 6299f8a2c8a60582d2e61cdec033ac395f5fa47e Mon Sep 17 00:00:00 2001 From: josua Date: Sun, 25 Aug 2019 08:57:01 +1000 Subject: [PATCH] Added bullets, chunks, extra blocks, the world. --- src/shootergame/Main.java | 27 ++- src/shootergame/display/Camera.java | 9 +- src/shootergame/display/DisplayRender.java | 47 ++--- .../display/DisplayStatsEventHandler.java | 29 +++ src/shootergame/display/DisplayWindow.java | 2 + src/shootergame/entity/Entity.java | 33 ++- src/shootergame/entity/EntityBullet.java | 83 ++++++++ .../entity/EntityEventHandler.java | 11 +- src/shootergame/entity/EntityVertical.java | 18 +- src/shootergame/entity/EntityZombie.java | 39 ++++ .../entity/player/EntityPlayer.java | 39 ++-- src/shootergame/init/Textures.java | 125 ++++++++++-- src/shootergame/init/Tiles.java | 12 ++ src/shootergame/input/JoystickCallback.java | 189 ++++++++++++++++++ .../mainloop/MainloopEventHandler.java | 3 +- .../resources/mono_crash.d4716fb0.0.json | 76 +++++++ .../resources/mono_crash.d4716fb0.1.json | 76 +++++++ src/shootergame/resources/texmap.png | Bin 8234 -> 54485 bytes src/shootergame/resources/texmap.xcf | Bin 0 -> 94855 bytes src/shootergame/text/Text.java | 176 ++++++++++++++++ src/shootergame/tiles/Tile.java | 4 +- src/shootergame/tiles/TileFlat.java | 2 +- src/shootergame/tiles/TileLava.java | 25 +++ src/shootergame/tiles/TileLavaFlow.java | 23 +++ src/shootergame/tiles/TileRock.java | 16 ++ src/shootergame/tiles/TileTree.java | 1 + src/shootergame/tiles/TileVertical.java | 2 +- src/shootergame/tiles/TileVoid.java | 13 ++ src/shootergame/tiles/TileWater.java | 25 +++ src/shootergame/tiles/TileWaterFlow.java | 23 +++ src/shootergame/util/gl/VerticalRender.java | 6 +- .../util/gl/texture/AnimationReference.java | 3 +- .../util/gl/texture/TextureMap.java | 6 +- src/shootergame/util/math/MathHelpers.java | 8 + src/shootergame/util/math/map/Map2D.java | 20 +- src/shootergame/util/math/vec/Vec2d.java | 4 + src/shootergame/util/math/vec/Vec2i.java | 8 +- src/shootergame/util/math/vec/Vec3d.java | 4 + src/shootergame/util/math/vec/Vec3i.java | 10 +- src/shootergame/world/World.java | 52 +++++ src/shootergame/world/chunk/Chunk.java | 180 +++++++++++++++++ src/shootergame/world/chunk/ChunkEmpty.java | 42 ++++ .../world/chunk/ChunkEventHandler.java | 71 +++++++ src/shootergame/world/layer/Layer.java | 143 +++++++++++++ .../world/layer/layergen/LayerGen.java | 19 ++ .../world/layer/layergen/LayerGenEarth.java | 80 ++++++++ 46 files changed, 1689 insertions(+), 95 deletions(-) create mode 100644 src/shootergame/display/DisplayStatsEventHandler.java create mode 100644 src/shootergame/entity/EntityBullet.java create mode 100644 src/shootergame/entity/EntityZombie.java create mode 100644 src/shootergame/input/JoystickCallback.java create mode 100644 src/shootergame/resources/mono_crash.d4716fb0.0.json create mode 100644 src/shootergame/resources/mono_crash.d4716fb0.1.json create mode 100644 src/shootergame/resources/texmap.xcf create mode 100644 src/shootergame/text/Text.java create mode 100644 src/shootergame/tiles/TileLava.java create mode 100644 src/shootergame/tiles/TileLavaFlow.java create mode 100644 src/shootergame/tiles/TileRock.java create mode 100644 src/shootergame/tiles/TileVoid.java create mode 100644 src/shootergame/tiles/TileWater.java create mode 100644 src/shootergame/tiles/TileWaterFlow.java create mode 100644 src/shootergame/world/World.java create mode 100644 src/shootergame/world/chunk/Chunk.java create mode 100644 src/shootergame/world/chunk/ChunkEmpty.java create mode 100644 src/shootergame/world/chunk/ChunkEventHandler.java create mode 100644 src/shootergame/world/layer/Layer.java create mode 100644 src/shootergame/world/layer/layergen/LayerGen.java create mode 100644 src/shootergame/world/layer/layergen/LayerGenEarth.java diff --git a/src/shootergame/Main.java b/src/shootergame/Main.java index 5de9ec0..0755b18 100644 --- a/src/shootergame/Main.java +++ b/src/shootergame/Main.java @@ -1,23 +1,40 @@ package shootergame; +import java.util.Random; + +import javax.swing.text.html.parser.Entity; + import mainloop.manager.MainloopManager; +import shootergame.display.DisplayStatsEventHandler; import shootergame.display.DisplayWindow; import shootergame.entity.EntityEventHandler; -import shootergame.entity.player.Player; +import shootergame.entity.EntityZombie; +import shootergame.entity.player.EntityPlayer; +import shootergame.init.Entities; import shootergame.init.Textures; +import shootergame.input.JoystickCallback; import shootergame.mainloop.MainloopEventHandler; +import shootergame.util.math.MathHelpers; +import shootergame.util.math.vec.Vec2i; +import shootergame.world.World; +import shootergame.world.chunk.ChunkEventHandler; +import shootergame.world.layer.layergen.LayerGenEarth; public class Main { public static MainloopManager mainloop; public static DisplayWindow window; - public static Player player = new Player(); + public static EntityPlayer player = new EntityPlayer(); + public static World world; public static void main(String[] args) { // Create the mainloop mainloop = new MainloopManager(MainloopEventHandler.MAINLOOP_EVENT_HANDLER); mainloop.register(MainloopEventHandler.MAINLOOP_EVENT_HANDLER); + mainloop.register(ChunkEventHandler.CHUNK_EVENT_HANDLER); + mainloop.register(DisplayStatsEventHandler.DISPLAY_STATS_EVENT_HANDLER); + mainloop.register(JoystickCallback.JOYSTICK_CALLBACK); // Create the display window = new DisplayWindow("ShooterGame"); @@ -26,6 +43,12 @@ public class Main // Initialise the textures Textures.initTextures(window); + // Initialize the gamepad + JoystickCallback.JOYSTICK_CALLBACK.init(); + + // Create the world + world = new World(new Random(), new LayerGenEarth()); + // Initialise the entities mainloop.register(EntityEventHandler.ENTITY_EVENT_HANDLER); diff --git a/src/shootergame/display/Camera.java b/src/shootergame/display/Camera.java index 2134b99..3f82d1b 100644 --- a/src/shootergame/display/Camera.java +++ b/src/shootergame/display/Camera.java @@ -8,12 +8,15 @@ public class Camera { public Vec3d pos; public Vec2d angle; + public int renderDistance; + public double cameraDistance; - public Camera(Vec3d pos, Vec2d angle, double distance) + public Camera(Vec3d pos, Vec2d angle, double cameraDistance, int renderDistance) { - Vec3d p = new Vec3d(pos.x, pos.y+5, pos.z); this.angle = new Vec2d(angle.x, -angle.y); this.pos = pos.subtract(MathHelpers.moveTowards3( - 10, new Vec2d(Math.toRadians(angle.x), Math.toRadians(-angle.y)))); + cameraDistance, new Vec2d(Math.toRadians(angle.x), Math.toRadians(-angle.y)))); + this.cameraDistance = cameraDistance; + this.renderDistance = renderDistance; } } diff --git a/src/shootergame/display/DisplayRender.java b/src/shootergame/display/DisplayRender.java index 6b0de6c..5c597c1 100644 --- a/src/shootergame/display/DisplayRender.java +++ b/src/shootergame/display/DisplayRender.java @@ -6,22 +6,19 @@ import org.joml.Matrix4f; import org.lwjgl.opengl.GL; import org.lwjgl.system.MemoryStack; -import mainloop.task.MainloopTask; import shootergame.Main; import shootergame.display.transparent.TransparentObjects; -import shootergame.entity.Entity; -import shootergame.entity.player.Player; -import shootergame.init.Entities; +import shootergame.entity.player.EntityPlayer; import shootergame.init.Textures; -import shootergame.init.Tiles; +import shootergame.text.Text; import shootergame.util.gl.GlHelpers; -import shootergame.util.math.MathHelpers; import shootergame.util.math.vec.Vec2d; -import shootergame.util.math.vec.Vec2i; import shootergame.util.math.vec.Vec3d; public class DisplayRender { + public static int fps = 0; + public static void render(int w, int h) { // Setup GL and clear the colour @@ -34,9 +31,9 @@ public class DisplayRender // Enable some stuff GlHelpers.enableTexture2d(); + GlHelpers.enableDepthTest(); GlHelpers.enableBlend(); GlHelpers.enableAlpha(); - GlHelpers.enableDepthTest(); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Set the colour to white @@ -70,37 +67,33 @@ public class DisplayRender 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); - Player player = Main.player; - Camera camera = new Camera(new Vec3d(player.pos.x, player.pos.y, 0), new Vec2d(player.angle, 45), 0); + EntityPlayer player = Main.player; + Camera camera = new Camera(new Vec3d(player.pos.x, player.pos.y, 0), new Vec2d(player.angle, 45), 10, 2); //GlHelpers.translate(0, 0, -5); GlHelpers.rotate(camera.angle.y, 1, 0, 0); GlHelpers.rotate(camera.angle.x, 0, 0, 1); GlHelpers.translate(-camera.pos.x, -camera.pos.y, -camera.pos.z); - int c = 20; - for(int x=-c;x 1000; + } + + @Override + public boolean MainLoopRepeat() { + return true; + } + + @Override + public void MainLoopUpdate() + { + // Set the fps from mspf every second + long mspf = MainloopEventHandler.MAINLOOP_EVENT_HANDLER.mspf; + DisplayRender.fps = (int)(1000 / mspf); + } + + +} diff --git a/src/shootergame/display/DisplayWindow.java b/src/shootergame/display/DisplayWindow.java index 1e36241..0610986 100644 --- a/src/shootergame/display/DisplayWindow.java +++ b/src/shootergame/display/DisplayWindow.java @@ -9,6 +9,7 @@ import mainloop.task.IMainloopTask; import shootergame.Main; import shootergame.input.CursorEnterCallback; import shootergame.input.CursorPosCallback; +import shootergame.input.JoystickCallback; import shootergame.input.KeyCallback; import shootergame.input.KeyCharCallback; import shootergame.input.MouseButtonCallback; @@ -67,6 +68,7 @@ public class DisplayWindow implements IMainloopTask GLFW.glfwSetCursorEnterCallback(this.window, new CursorEnterCallback()); GLFW.glfwSetMouseButtonCallback(this.window, new MouseButtonCallback()); GLFW.glfwSetKeyCallback(this.window, new KeyCallback()); + GLFW.glfwSetJoystickCallback(JoystickCallback.JOYSTICK_CALLBACK); // Show the window GLFW.glfwShowWindow(this.window); diff --git a/src/shootergame/entity/Entity.java b/src/shootergame/entity/Entity.java index a981bc5..4d4433a 100644 --- a/src/shootergame/entity/Entity.java +++ b/src/shootergame/entity/Entity.java @@ -1,10 +1,16 @@ package shootergame.entity; +import shootergame.Main; import shootergame.display.Camera; import shootergame.display.transparent.ITransparentObject; import shootergame.display.transparent.TransparentObjects; import shootergame.init.Entities; +import shootergame.tiles.Tile; +import shootergame.util.math.MathHelpers; import shootergame.util.math.vec.Vec2d; +import shootergame.util.math.vec.Vec2i; +import shootergame.world.chunk.Chunk; +import shootergame.world.layer.Layer; public class Entity implements ITransparentObject { @@ -26,7 +32,7 @@ public class Entity implements ITransparentObject this(new Vec2d(0, 0), 0); } - public void tick() { + public void tick(Chunk chunk, Layer layer) { } @Override @@ -48,4 +54,29 @@ public class Entity implements ITransparentObject public boolean isOpaqueTile() { return this.opaqueTile; } + + public void moveForward(double speed) { + Vec2d pos = this.pos.add(MathHelpers.moveTowards2(speed, Math.toRadians(this.angle))); + if(this.moveIsLegal(new Vec2d(this.pos.x, pos.y))) this.pos.y = pos.y; + if(this.moveIsLegal(new Vec2d(pos.x, this.pos.y))) this.pos.x = pos.x; + } + + public void moveBackward(double speed) { + Vec2d pos = this.pos.add(MathHelpers.moveTowards2(-speed, Math.toRadians(this.angle))); + if(this.moveIsLegal(new Vec2d(this.pos.x, pos.y))) this.pos.y = pos.y; + if(this.moveIsLegal(new Vec2d(pos.x, this.pos.y))) this.pos.x = pos.x; + } + + public void moveForward() { + this.moveForward(0.1); + } + + public void moveBackward() { + this.moveBackward(0.1); + } + + public boolean moveIsLegal(Vec2d pos) + { + return true; + } } diff --git a/src/shootergame/entity/EntityBullet.java b/src/shootergame/entity/EntityBullet.java new file mode 100644 index 0000000..4669767 --- /dev/null +++ b/src/shootergame/entity/EntityBullet.java @@ -0,0 +1,83 @@ +package shootergame.entity; + +import shootergame.display.Camera; +import shootergame.util.gl.GlHelpers; +import shootergame.util.math.vec.Vec2d; +import shootergame.world.chunk.Chunk; +import shootergame.world.layer.Layer; + +public class EntityBullet extends Entity +{ + private int time = 0; + + public EntityBullet() + { + // Set some settings + this.opaqueTile = false; + } + + @Override + public void tick(Chunk chunk, Layer layer) { + super.tick(chunk, layer); + + // Move forward in the bullets angle, very quickly + this.moveForward(0.1); + + // Loop over the nearby entities + for(Entity e : chunk.getNearbyEntities(pos, 2)) + { + // Is this a zombie + if(e instanceof EntityZombie) + { + System.out.println("Found Zombie"); + + chunk.killEntity(this); + return; + } + } + + // Increase time + time++; + + if(time > 40) { + chunk.killEntity(this); + } + } + + @Override + public void render(Vec2d pos, Camera camera) + { + // Call super + super.render(pos, camera); + + // Push the matrix, disable textures, colour, and translate the bullet + GlHelpers.pushMatrix(); + GlHelpers.color3(1, 1, 0); + GlHelpers.translate(pos.x, pos.y, 0.4); + GlHelpers.disableTexture2d(); + + // Get the angle between the camera and the bullet + double angle_r = camera.angle.x; + + // Make the bullet upright + GlHelpers.translate(0.1, 0, 0); + GlHelpers.translate(pos.x, pos.y, 0); + GlHelpers.rotate(-angle_r, 0, 0, 1); + GlHelpers.translate(-0.1, 0, 0); + + // Draw the bullet + GlHelpers.begin(); + { + GlHelpers.vertex3(0.0f, 0, 0.0f); + GlHelpers.vertex3(0.2f, 0, 0.0f); + GlHelpers.vertex3(0.2f, 0, 0.2f); + GlHelpers.vertex3(0.0f, 0, 0.2f); + } + GlHelpers.end(); + + // Pop the matrix, remove the colour, and enable textures + GlHelpers.popMatrix(); + GlHelpers.enableTexture2d(); + GlHelpers.color3(1, 1, 1); + } +} diff --git a/src/shootergame/entity/EntityEventHandler.java b/src/shootergame/entity/EntityEventHandler.java index 3fc7e96..82e5392 100644 --- a/src/shootergame/entity/EntityEventHandler.java +++ b/src/shootergame/entity/EntityEventHandler.java @@ -3,6 +3,7 @@ package shootergame.entity; import java.util.ArrayList; import mainloop.task.IMainloopTask; +import shootergame.Main; import shootergame.init.Entities; public class EntityEventHandler implements IMainloopTask @@ -22,9 +23,11 @@ public class EntityEventHandler implements IMainloopTask @Override public void MainLoopUpdate() { - // Update each entity - for(Entity e : Entities.entities) { - e.tick(); - } + // Update the world and spawn random entities + Main.world.tickEntities(); + Main.world.spawnRandomEntities(); + Main.player.tick(null, Main.world.getLayer()); + + } } diff --git a/src/shootergame/entity/EntityVertical.java b/src/shootergame/entity/EntityVertical.java index 1177aea..8932cce 100644 --- a/src/shootergame/entity/EntityVertical.java +++ b/src/shootergame/entity/EntityVertical.java @@ -1,9 +1,6 @@ package shootergame.entity; -import shootergame.Main; import shootergame.display.Camera; -import shootergame.entity.player.Player; -import shootergame.util.gl.GlHelpers; import shootergame.util.gl.VerticalRender; import shootergame.util.gl.texture.TextureReference; import shootergame.util.math.vec.Vec2d; @@ -11,16 +8,23 @@ import shootergame.util.math.vec.Vec2d; public class EntityVertical extends Entity { private TextureReference tex; - private double h; + private double height; + + public EntityVertical() { + } public EntityVertical(TextureReference tex, double height) { + this.height = height; this.tex = tex; - this.h = height; + } + + public void render(Vec2d pos, Camera camera, TextureReference tex, double height) { + super.render(pos, camera); + VerticalRender.render(pos, camera, tex, height); } @Override public void render(Vec2d pos, Camera camera) { - super.render(pos, camera); - VerticalRender.render(pos, camera, tex, h); + this.render(pos, camera, tex, height); } } diff --git a/src/shootergame/entity/EntityZombie.java b/src/shootergame/entity/EntityZombie.java new file mode 100644 index 0000000..2aca487 --- /dev/null +++ b/src/shootergame/entity/EntityZombie.java @@ -0,0 +1,39 @@ +package shootergame.entity; + +import java.util.Random; + +import shootergame.Main; +import shootergame.display.Camera; +import shootergame.init.Textures; +import shootergame.util.math.random.OpenSimplexNoise; +import shootergame.util.math.vec.Vec2d; +import shootergame.world.chunk.Chunk; +import shootergame.world.layer.Layer; + +public class EntityZombie extends EntityVertical +{ + private Random rand; + private OpenSimplexNoise noise; + private double time; + + public EntityZombie() { + super(Textures.ENTITY_ZOMBIE, 1); + rand = new Random(); + noise = new OpenSimplexNoise(rand.nextLong()); + time = 0; + } + + @Override + public void tick(Chunk chunk, Layer layer) { + super.tick(chunk, layer); + + double angle = Math.atan2(pos.x - Main.player.pos.x, pos.y - Main.player.pos.y); + + this.angle = Math.toDegrees(angle) + 180; + this.angle += noise.eval(time, 0)*60; + time += 0.001; + + this.moveForward(0.05); + } + +} diff --git a/src/shootergame/entity/player/EntityPlayer.java b/src/shootergame/entity/player/EntityPlayer.java index 4a2108f..002ecba 100644 --- a/src/shootergame/entity/player/EntityPlayer.java +++ b/src/shootergame/entity/player/EntityPlayer.java @@ -1,5 +1,6 @@ package shootergame.entity.player; +import shootergame.display.Camera; import shootergame.entity.Entity; import shootergame.entity.EntityVertical; import shootergame.init.Textures; @@ -7,46 +8,58 @@ import shootergame.util.gl.texture.TextureReference; import shootergame.util.math.MathHelpers; import shootergame.util.math.vec.Vec2d; import shootergame.util.math.vec.Vec2i; +import shootergame.world.chunk.Chunk; +import shootergame.world.layer.Layer; -public class Player extends EntityVertical +public class EntityPlayer extends EntityVertical { - public Player() { - super(Textures.ENTITY_PLAYER, 1); - } - public boolean MOVE_FORWARD = false; public boolean MOVE_BACKWARD = false; public boolean MOVE_LEFT = false; public boolean MOVE_RIGHT = false; + public boolean moving = false; + + public EntityPlayer() { + this.pos = new Vec2d(0, 0); + } @Override - public void tick() + public void tick(Chunk chunk, Layer layer) { // Call super - super.tick(); + super.tick(chunk, layer); // Rotate left if(MOVE_LEFT) { this.angle -= 1; - this.angle %= 360; + this.angle = MathHelpers.mod(this.angle, 360); } // Rotate right if(MOVE_RIGHT) { this.angle += 1; - this.angle %= 360; + this.angle = MathHelpers.mod(this.angle, 360); } // Move forward if(MOVE_FORWARD) { - Vec2d t = MathHelpers.moveTowards2(0.1, Math.toRadians(angle)); - pos = new Vec2d(t.x+pos.x, t.y+pos.y); + this.moveForward(); } // Move backward if(MOVE_BACKWARD) { - Vec2d t = MathHelpers.moveTowards2(-0.1, Math.toRadians(angle)); - pos = new Vec2d(t.x+pos.x, t.y+pos.y); + this.moveBackward(); } } + + @Override + public void render(Vec2d pos, Camera camera) + { + // Moving + if(MOVE_BACKWARD || MOVE_FORWARD || moving) + super.render(pos, camera, Textures.ENTITY_PLAYER_MOVING, 1); + + // Standing still + else super.render(pos, camera, Textures.ENTITY_PLAYER_STILL, 1); + } } diff --git a/src/shootergame/init/Textures.java b/src/shootergame/init/Textures.java index 70b21f6..b5fc683 100644 --- a/src/shootergame/init/Textures.java +++ b/src/shootergame/init/Textures.java @@ -23,39 +23,120 @@ public class Textures public static final ArrayList animations = new ArrayList(); - public static final TextureMap texmap = new TextureMap( + public static final TextureMap texmap = new TextureMap(16, "/home/josua/eclipse-workspace/ShooterGame/src/shootergame/resources/texmap.png"); - public static final TextureReference TILE_GRASS = texmap.getTextureReference(0, 16, 0, 16); - public static final TextureReference TILE_SAND = texmap.getTextureReference(16, 32, 0, 16); - public static final TextureReference TILE_STONE = texmap.getTextureReference(32, 48, 0, 16); - public static final TextureReference TILE_DIRT = texmap.getTextureReference(48, 64, 0, 16); - public static final TextureReference TILE_TREE = texmap.getTextureReference(64, 80, 0, 64); + public static final TextureReference TILE_GRASS = texmap.getTextureReference(0, 1, 0, 1); + public static final TextureReference TILE_SAND = texmap.getTextureReference(1, 2, 0, 1); + public static final TextureReference TILE_STONE = texmap.getTextureReference(2, 3, 0, 1); + public static final TextureReference TILE_DIRT = texmap.getTextureReference(3, 4, 0, 1); + public static final TextureReference TILE_TREE = texmap.getTextureReference(4, 5, 0, 4); + public static final TextureReference TILE_ROCK = texmap.getTextureReference(4, 5, 4, 5); // Fire - public static final TextureReference TILE_FIRE_0 = texmap.getTextureReference(0, 16, 16, 32); - public static final TextureReference TILE_FIRE_1 = texmap.getTextureReference(16, 32, 16, 32); - public static final TextureReference TILE_FIRE_2 = texmap.getTextureReference(32, 48, 16, 32); - public static final TextureReference TILE_FIRE_3 = texmap.getTextureReference(48, 64, 16, 32); + public static final TextureReference TILE_FIRE_0 = texmap.getTextureReference(0, 1, 1, 2); + public static final TextureReference TILE_FIRE_1 = texmap.getTextureReference(1, 2, 1, 2); + public static final TextureReference TILE_FIRE_2 = texmap.getTextureReference(2, 3, 1, 2); + public static final TextureReference TILE_FIRE_3 = texmap.getTextureReference(3, 4, 1, 2); public static final TextureReference TILE_FIRE = new AnimationReference( 8, TILE_FIRE_0, TILE_FIRE_1, TILE_FIRE_2, TILE_FIRE_3); // Player - public static final TextureReference ENTITY_PLAYER_0 = texmap.getTextureReference(0, 16, 32, 48); - public static final TextureReference ENTITY_PLAYER_1 = texmap.getTextureReference(16, 32, 32, 48); - public static final TextureReference ENTITY_PLAYER_2 = texmap.getTextureReference(32, 48, 32, 48); - public static final TextureReference ENTITY_PLAYER_3 = texmap.getTextureReference(48, 64, 32, 48); - public static final TextureReference ENTITY_PLAYER = new AnimationReference( - 10, ENTITY_PLAYER_0, ENTITY_PLAYER_1, ENTITY_PLAYER_2, ENTITY_PLAYER_3); + public static final TextureReference ENTITY_PLAYER_STILL = texmap.getTextureReference(0, 1, 2, 3); + public static final TextureReference ENTITY_PLAYER_MOVING = new AnimationReference(10, + texmap.getTextureReference(0, 1, 2, 3), + texmap.getTextureReference(1, 2, 2, 3), + texmap.getTextureReference(2, 3, 2, 3), + texmap.getTextureReference(3, 4, 2, 3) + ); // Zombie - public static final TextureReference ENTITY_ZOMBIE_0 = texmap.getTextureReference(0, 16, 48, 64); - public static final TextureReference ENTITY_ZOMBIE_1 = texmap.getTextureReference(16, 32, 48, 64); - public static final TextureReference ENTITY_ZOMBIE_2 = texmap.getTextureReference(32, 48, 48, 64); - public static final TextureReference ENTITY_ZOMBIE_3 = texmap.getTextureReference(48, 64, 48, 64); - public static final TextureReference ENTITY_ZOMBIE = new AnimationReference( - 10, ENTITY_ZOMBIE_0, ENTITY_ZOMBIE_1, ENTITY_ZOMBIE_2, ENTITY_ZOMBIE_3); + public static final TextureReference ENTITY_ZOMBIE = new AnimationReference(10, + texmap.getTextureReference(0, 1, 3, 4), + texmap.getTextureReference(1, 2, 3, 4), + texmap.getTextureReference(2, 3, 3, 4), + texmap.getTextureReference(3, 4, 3, 4) + ); + // Water + public static final TextureReference TILE_WATER = new AnimationReference(20, + texmap.getTextureReference(0, 1, 8, 9), + texmap.getTextureReference(1, 2, 8, 9), + texmap.getTextureReference(2, 3, 8, 9), + texmap.getTextureReference(3, 4, 8, 9), + texmap.getTextureReference(4, 5, 8, 9), + texmap.getTextureReference(5, 6, 8, 9), + texmap.getTextureReference(6, 7, 8, 9), + texmap.getTextureReference(7, 8, 8, 9), + texmap.getTextureReference(8, 9, 8, 9), + texmap.getTextureReference(9, 10, 8, 9), + texmap.getTextureReference(10, 11, 8, 9), + texmap.getTextureReference(11, 12, 8, 9), + texmap.getTextureReference(12, 13, 8, 9), + texmap.getTextureReference(13, 14, 8, 9), + texmap.getTextureReference(14, 15, 8, 9), + texmap.getTextureReference(15, 16, 8, 9) + ); + + // Lava + public static final TextureReference TILE_LAVA = new AnimationReference(10, + texmap.getTextureReference(0, 1, 6, 7), + texmap.getTextureReference(1, 2, 6, 7), + texmap.getTextureReference(2, 3, 6, 7), + texmap.getTextureReference(3, 4, 6, 7), + texmap.getTextureReference(4, 5, 6, 7), + texmap.getTextureReference(5, 6, 6, 7), + texmap.getTextureReference(6, 7, 6, 7), + texmap.getTextureReference(7, 8, 6, 7), + texmap.getTextureReference(8, 9, 6, 7), + texmap.getTextureReference(9, 10, 6, 7), + texmap.getTextureReference(10, 11, 6, 7), + texmap.getTextureReference(11, 12, 6, 7), + texmap.getTextureReference(12, 13, 6, 7), + texmap.getTextureReference(13, 14, 6, 7), + texmap.getTextureReference(14, 15, 6, 7), + texmap.getTextureReference(15, 16, 6, 7) + ); + + // Water flow + public static final TextureReference TILE_WATER_FLOW = new AnimationReference(20, + texmap.getTextureReference(0, 1, 9, 10), + texmap.getTextureReference(1, 2, 9, 10), + texmap.getTextureReference(2, 3, 9, 10), + texmap.getTextureReference(3, 4, 9, 10), + texmap.getTextureReference(4, 5, 9, 10), + texmap.getTextureReference(5, 6, 9, 10), + texmap.getTextureReference(6, 7, 9, 10), + texmap.getTextureReference(7, 8, 9, 10), + texmap.getTextureReference(8, 9, 9, 10), + texmap.getTextureReference(9, 10, 9, 10), + texmap.getTextureReference(10, 11, 9, 10), + texmap.getTextureReference(11, 12, 9, 10), + texmap.getTextureReference(12, 13, 9, 10), + texmap.getTextureReference(13, 14, 9, 10), + texmap.getTextureReference(14, 15, 9, 10), + texmap.getTextureReference(15, 16, 9, 10) + ); + + // Lava flow + public static final TextureReference TILE_LAVA_FLOW = new AnimationReference(10, + texmap.getTextureReference(0, 1, 7, 8), + texmap.getTextureReference(1, 2, 7, 8), + texmap.getTextureReference(2, 3, 7, 8), + texmap.getTextureReference(3, 4, 7, 8), + texmap.getTextureReference(4, 5, 7, 8), + texmap.getTextureReference(5, 6, 7, 8), + texmap.getTextureReference(6, 7, 7, 8), + texmap.getTextureReference(7, 8, 7, 8), + texmap.getTextureReference(8, 9, 7, 8), + texmap.getTextureReference(9, 10, 7, 8), + texmap.getTextureReference(10, 11, 7, 8), + texmap.getTextureReference(11, 12, 7, 8), + texmap.getTextureReference(12, 13, 7, 8), + texmap.getTextureReference(13, 14, 7, 8), + texmap.getTextureReference(14, 15, 7, 8), + texmap.getTextureReference(15, 16, 7, 8) + ); } diff --git a/src/shootergame/init/Tiles.java b/src/shootergame/init/Tiles.java index 9cf53bd..06f0586 100644 --- a/src/shootergame/init/Tiles.java +++ b/src/shootergame/init/Tiles.java @@ -4,9 +4,15 @@ import shootergame.tiles.Tile; import shootergame.tiles.TileDirt; import shootergame.tiles.TileFire; import shootergame.tiles.TileGrass; +import shootergame.tiles.TileLava; +import shootergame.tiles.TileLavaFlow; +import shootergame.tiles.TileRock; import shootergame.tiles.TileSand; import shootergame.tiles.TileStone; import shootergame.tiles.TileTree; +import shootergame.tiles.TileVoid; +import shootergame.tiles.TileWater; +import shootergame.tiles.TileWaterFlow; public class Tiles { @@ -16,4 +22,10 @@ public class Tiles public static final Tile STONE = new TileStone("stone"); public static final Tile DIRT = new TileDirt("dirt"); public static final Tile TREE = new TileTree("tree"); + public static final Tile VOID = new TileVoid("void"); + public static final Tile ROCK = new TileRock("rock"); + public static final Tile LAVA = new TileLava("lava"); + public static final Tile WATER = new TileWater("water"); + public static final Tile LAVA_FLOW = new TileLavaFlow("lava_flow"); + public static final Tile WATER_FLOW = new TileWaterFlow("water_flow"); } diff --git a/src/shootergame/input/JoystickCallback.java b/src/shootergame/input/JoystickCallback.java new file mode 100644 index 0000000..4f2abba --- /dev/null +++ b/src/shootergame/input/JoystickCallback.java @@ -0,0 +1,189 @@ +package shootergame.input; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.FloatBuffer; +import java.util.ArrayList; + +import org.lwjgl.glfw.GLFW; +import org.lwjgl.glfw.GLFWGamepadState; +import org.lwjgl.glfw.GLFWJoystickCallbackI; + +import mainloop.task.IMainloopTask; +import shootergame.Main; +import shootergame.entity.Entity; +import shootergame.entity.EntityBullet; +import shootergame.util.math.MathHelpers; +import shootergame.util.math.vec.Vec2d; + +public class JoystickCallback implements GLFWJoystickCallbackI, IMainloopTask +{ + public static final JoystickCallback JOYSTICK_CALLBACK = new JoystickCallback(); + private ArrayList connections = new ArrayList(); + + @Override + public void invoke(int jid, int event) + { + // Gamepad connect + if(event == GLFW.GLFW_CONNECTED) + { + // Log the event and add the connection + System.out.println("Gamepad "+jid+" connected"); + connections.add(jid); + } + + // Gamepad disconnect + else if(event == GLFW.GLFW_DISCONNECTED) + { + // Log the event + System.out.println("Gamepad "+jid+" disconnected"); + + // Loop over the connections + for(int i=0;i 10; + } + + @Override + public boolean MainLoopRepeat() { + return true; + } + + private float combineJoystickAxis(float a, float b) + { + if(b > 0.2 || b < -0.2) a += b; + return a; + } + + @Override + public void MainLoopUpdate() + { + + + // Gamepad properties + float left_x = 0; + float left_y = 0; + float left_trigger = 0; + float right_x = 0; + float right_y = 0; + float right_trigger = 0; + boolean left_stick_button = false; + boolean right_stick_button = false; + boolean button_a = false; + boolean button_b = false; + boolean button_x = false; + boolean button_y = false; + boolean button_start = false; + boolean button_back = false; + boolean button_home = false; + boolean dpad_up = false; + boolean dpad_down = false; + boolean dpad_left = false; + boolean dpad_right = false; + boolean shoulder_left = false; + boolean shoulder_right = false; + + // Loop over all the connected gamepads + for(int jid : connections) + { + // Get all the axes + FloatBuffer axes = GLFW.glfwGetJoystickAxes(jid); + + // Store all the axes data + left_x = combineJoystickAxis(left_x, axes.get(0)); + left_y = combineJoystickAxis(left_y, axes.get(1)); + right_x = combineJoystickAxis(right_x, axes.get(3)); + right_y = combineJoystickAxis(right_y, axes.get(4)); + left_trigger = combineJoystickAxis(left_trigger, axes.get(2)); + right_trigger = combineJoystickAxis(right_trigger, axes.get(5)); + + // Get all the buttons + ByteBuffer buttons = GLFW.glfwGetJoystickButtons(jid); + + // Store all the button data + button_a = buttons.get(0) == 1 || button_a; + button_b = buttons.get(1) == 1 || button_b; + button_x = buttons.get(2) == 1 || button_x; + button_y = buttons.get(3) == 1 || button_y; + shoulder_left = buttons.get(4) == 1 || shoulder_left; + shoulder_right = buttons.get(5) == 1 || shoulder_right; + button_back = buttons.get(6) == 1 || button_back; + button_start = buttons.get(7) == 1 || button_start; + button_home = buttons.get(8) == 1 || button_home; + left_stick_button = buttons.get(9) == 1 || left_stick_button; + right_stick_button = buttons.get(10) == 1 || right_stick_button; + dpad_left = buttons.get(11) == 1 || buttons.get(18) == 1 || dpad_left; + dpad_right = buttons.get(12) == 1 || buttons.get(16) == 1 || dpad_right; + dpad_up = buttons.get(13) == 1 || buttons.get(15) == 1 || dpad_up; + dpad_down = buttons.get(14) == 1 || buttons.get(17) == 1 || dpad_down; + } + + // Is the left stick moved into a position (movement stick) + if(left_x > 0.3 || left_x < -0.3 || left_y > 0.3 || left_y < -0.3) + { + // Get the the angle + double angle = Math.toDegrees(Math.atan2(left_y, left_x)) + 90; + + // Move the player in the left sticks angle + Main.player.angle += angle; + Main.player.moveForward(); + Main.player.angle -= angle; + + // Set the players moving to true + Main.player.moving = true; + } + + // Set the players moving to false + else Main.player.moving = false; + + // Is the right stick moved into a position (gun stick) + if(right_x > 0.3 || right_x < -0.3 || right_y > 0.3 || right_y < -0.3) + { + // Get the the angle + double angle = Math.toDegrees(Math.atan2(right_y, right_x)) + 90; + + // Summon bullets at this angle relative to the player + Entity bullet = new EntityBullet(); + bullet.angle = angle + Main.player.angle; + bullet.pos = new Vec2d(Main.player.pos.x / 2, Main.player.pos.y / 2); + Main.world.getLayer().spawnEntity(bullet); + } + + if(shoulder_left) { + Main.player.angle -= 1; + } + + if(shoulder_right) { + Main.player.angle += 1; + } + } + +} diff --git a/src/shootergame/mainloop/MainloopEventHandler.java b/src/shootergame/mainloop/MainloopEventHandler.java index 7d5ace8..5d5234a 100644 --- a/src/shootergame/mainloop/MainloopEventHandler.java +++ b/src/shootergame/mainloop/MainloopEventHandler.java @@ -9,6 +9,7 @@ public class MainloopEventHandler implements IMainloopEvent, IMainloopTask public static final MainloopEventHandler MAINLOOP_EVENT_HANDLER = new MainloopEventHandler(); public long mspf = 1000/60; + private long max_mspf = 1; @Override public void onClose() { @@ -18,7 +19,7 @@ public class MainloopEventHandler implements IMainloopEvent, IMainloopTask @Override public void onEarly() { mspf -= 1; - if(mspf < 1) mspf = 1; + if(mspf < max_mspf) mspf = 1; } @Override diff --git a/src/shootergame/resources/mono_crash.d4716fb0.0.json b/src/shootergame/resources/mono_crash.d4716fb0.0.json new file mode 100644 index 0000000..2273c0b --- /dev/null +++ b/src/shootergame/resources/mono_crash.d4716fb0.0.json @@ -0,0 +1,76 @@ +{ + "protocol_version" : "0.0.2", + "configuration" : { + "version" : "5.18.0.240 (Debian 5.18.0.240+dfsg-2ubuntu2 Wed Apr 17 23:39:09 UTC 2019)", + "tlc" : "__thread", + "sigsgev" : "altstack", + "notifications" : "epoll", + "architecture" : "amd64", + "disabled_features" : "none", + "smallconfig" : "disabled", + "bigarrays" : "disabled", + "softdebug" : "enabled", + "interpreter" : "enabled", + "llvm_support" : "disabled", + "suspend" : "preemptive" + }, + "memory" : { + "minor_gc_time" : "378907", + "major_gc_time" : "34891", + "minor_gc_count" : "24", + "major_gc_count" : "1", + "major_gc_time_concurrent" : "29295" + }, + "threads" : [ + { + "is_managed" : false, + "crashed" : true, + "managed_thread_ptr" : "0x0", + "native_thread_id" : "0x7fee3d843700", + "thread_info_addr" : "0x0", + "thread_name" : "Finalizer", + "ctx" : { + "IP" : "0x7fee40fd8ed7", + "SP" : "0x7fee3d842690", + "BP" : "0x7fee3d8429e0" + }, + "managed_frames" : [ + { + "native_address" : "unregistered" + } + + ], + "unmanaged_frames" : [ + { + "native_address" : "unregistered" + } + + ] +}, +{ + "is_managed" : false, + "crashed" : false, + "managed_thread_ptr" : "0x0", + "native_thread_id" : "0x7fee40f90780", + "thread_info_addr" : "0x0", + "thread_name" : "mono", + "ctx" : { + "IP" : "0x7fee410a6729", + "SP" : "0x7ffe255e5640", + "BP" : "0x3" + }, + "managed_frames" : [ + { + "native_address" : "unregistered" + } + + ], +"unmanaged_frames" : [ +{ + "native_address" : "unregistered" + } + +] +} +] +} \ No newline at end of file diff --git a/src/shootergame/resources/mono_crash.d4716fb0.1.json b/src/shootergame/resources/mono_crash.d4716fb0.1.json new file mode 100644 index 0000000..cd25f68 --- /dev/null +++ b/src/shootergame/resources/mono_crash.d4716fb0.1.json @@ -0,0 +1,76 @@ +{ + "protocol_version" : "0.0.2", + "configuration" : { + "version" : "5.18.0.240 (Debian 5.18.0.240+dfsg-2ubuntu2 Wed Apr 17 23:39:09 UTC 2019)", + "tlc" : "__thread", + "sigsgev" : "altstack", + "notifications" : "epoll", + "architecture" : "amd64", + "disabled_features" : "none", + "smallconfig" : "disabled", + "bigarrays" : "disabled", + "softdebug" : "enabled", + "interpreter" : "enabled", + "llvm_support" : "disabled", + "suspend" : "preemptive" + }, + "memory" : { + "minor_gc_time" : "41590", + "major_gc_time" : "0", + "minor_gc_count" : "2", + "major_gc_count" : "0", + "major_gc_time_concurrent" : "0" + }, + "threads" : [ + { + "is_managed" : false, + "crashed" : false, + "managed_thread_ptr" : "0x0", + "native_thread_id" : "0x7fa2fae57780", + "thread_info_addr" : "0x0", + "thread_name" : "mono", + "ctx" : { + "IP" : "0x7fa2faef4be9", + "SP" : "0x7ffee36a8db0", + "BP" : "0x100" + }, + "managed_frames" : [ + { + "native_address" : "unregistered" + } + + ], + "unmanaged_frames" : [ + { + "native_address" : "unregistered" + } + + ] +}, +{ + "is_managed" : false, + "crashed" : true, + "managed_thread_ptr" : "0x0", + "native_thread_id" : "0x7fa2f753d700", + "thread_info_addr" : "0x0", + "thread_name" : "Finalizer", + "ctx" : { + "IP" : "0x7fa2fae9fed7", + "SP" : "0x7fa2f753c690", + "BP" : "0x7fa2f753c9e0" + }, + "managed_frames" : [ + { + "native_address" : "unregistered" + } + + ], +"unmanaged_frames" : [ +{ + "native_address" : "unregistered" + } + +] +} +] +} \ No newline at end of file diff --git a/src/shootergame/resources/texmap.png b/src/shootergame/resources/texmap.png index dcc3f83b1c8985fde59ad7b6bcd90f4ff55d1428..962f35fdfa38fffae507a4e110bf2b505e998e93 100644 GIT binary patch literal 54485 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𑰌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 literal 8234 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

^m? B?AQPR diff --git a/src/shootergame/resources/texmap.xcf b/src/shootergame/resources/texmap.xcf new file mode 100644 index 0000000000000000000000000000000000000000..cb1632a7ee394738b4ef06c2d1d382242e1b4c77 GIT binary patch literal 94855 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 literal 0 HcmV?d00001 diff --git a/src/shootergame/text/Text.java b/src/shootergame/text/Text.java new file mode 100644 index 0000000..bce9d2c --- /dev/null +++ b/src/shootergame/text/Text.java @@ -0,0 +1,176 @@ +package shootergame.text; + +import shootergame.init.Textures; +import shootergame.util.gl.GlHelpers; +import shootergame.util.gl.texture.TextureReference; +import shootergame.util.math.vec.Vec2d; + +public class Text +{ + public static final TextureReference CHAR_A = Textures.texmap.getTextureReference(5, 6, 0, 1); + public static final TextureReference CHAR_B = Textures.texmap.getTextureReference(6, 7, 0, 1); + public static final TextureReference CHAR_C = Textures.texmap.getTextureReference(7, 8, 0, 1); + public static final TextureReference CHAR_D = Textures.texmap.getTextureReference(8, 9, 0, 1); + public static final TextureReference CHAR_E = Textures.texmap.getTextureReference(9, 10, 0, 1); + public static final TextureReference CHAR_F = Textures.texmap.getTextureReference(10, 11, 0, 1); + public static final TextureReference CHAR_G = Textures.texmap.getTextureReference(11, 12, 0, 1); + public static final TextureReference CHAR_H = Textures.texmap.getTextureReference(12, 13, 0, 1); + public static final TextureReference CHAR_I = Textures.texmap.getTextureReference(13, 14, 0, 1); + public static final TextureReference CHAR_J = Textures.texmap.getTextureReference(14, 15, 0, 1); + public static final TextureReference CHAR_K = Textures.texmap.getTextureReference(15, 16, 0, 1); + public static final TextureReference CHAR_L = Textures.texmap.getTextureReference(5, 6, 1, 2); + public static final TextureReference CHAR_M = Textures.texmap.getTextureReference(6, 7, 1, 2); + public static final TextureReference CHAR_N = Textures.texmap.getTextureReference(7, 8, 1, 2); + public static final TextureReference CHAR_O = Textures.texmap.getTextureReference(8, 9, 1, 2); + public static final TextureReference CHAR_P = Textures.texmap.getTextureReference(9, 10, 1, 2); + public static final TextureReference CHAR_Q = Textures.texmap.getTextureReference(10, 11, 1, 2); + public static final TextureReference CHAR_R = Textures.texmap.getTextureReference(11, 12, 1, 2); + public static final TextureReference CHAR_S = Textures.texmap.getTextureReference(12, 13, 1, 2); + public static final TextureReference CHAR_T = Textures.texmap.getTextureReference(13, 14, 1, 2); + public static final TextureReference CHAR_U = Textures.texmap.getTextureReference(14, 15, 1, 2); + public static final TextureReference CHAR_V = Textures.texmap.getTextureReference(15, 16, 1, 2); + public static final TextureReference CHAR_W = Textures.texmap.getTextureReference(5, 6, 2, 3); + public static final TextureReference CHAR_X = Textures.texmap.getTextureReference(6, 7, 2, 3); + public static final TextureReference CHAR_Y = Textures.texmap.getTextureReference(7, 8, 2, 3); + public static final TextureReference CHAR_Z = Textures.texmap.getTextureReference(8, 9, 2, 3); + public static final TextureReference CHAR_a = Textures.texmap.getTextureReference(9, 10, 2, 3); + public static final TextureReference CHAR_b = Textures.texmap.getTextureReference(10, 11, 2, 3); + public static final TextureReference CHAR_c = Textures.texmap.getTextureReference(11, 12, 2, 3); + public static final TextureReference CHAR_d = Textures.texmap.getTextureReference(12, 13, 2, 3); + public static final TextureReference CHAR_e = Textures.texmap.getTextureReference(13, 14, 2, 3); + public static final TextureReference CHAR_f = Textures.texmap.getTextureReference(14, 15, 2, 3); + public static final TextureReference CHAR_g = Textures.texmap.getTextureReference(15, 16, 2, 3); + public static final TextureReference CHAR_h = Textures.texmap.getTextureReference(5, 6, 3, 4); + public static final TextureReference CHAR_i = Textures.texmap.getTextureReference(6, 7, 3, 4); + public static final TextureReference CHAR_j = Textures.texmap.getTextureReference(7, 8, 3, 4); + public static final TextureReference CHAR_k = Textures.texmap.getTextureReference(8, 9, 3, 4); + public static final TextureReference CHAR_l = Textures.texmap.getTextureReference(9, 10, 3, 4); + public static final TextureReference CHAR_m = Textures.texmap.getTextureReference(10, 11, 3, 4); + public static final TextureReference CHAR_n = Textures.texmap.getTextureReference(11, 12, 3, 4); + public static final TextureReference CHAR_o = Textures.texmap.getTextureReference(12, 13, 3, 4); + public static final TextureReference CHAR_p = Textures.texmap.getTextureReference(13, 14, 3, 4); + public static final TextureReference CHAR_q = Textures.texmap.getTextureReference(14, 15, 3, 4); + public static final TextureReference CHAR_r = Textures.texmap.getTextureReference(15, 16, 3, 4); + public static final TextureReference CHAR_s = Textures.texmap.getTextureReference(5, 6, 4, 5); + public static final TextureReference CHAR_t = Textures.texmap.getTextureReference(6, 7, 4, 5); + public static final TextureReference CHAR_u = Textures.texmap.getTextureReference(7, 8, 4, 5); + public static final TextureReference CHAR_v = Textures.texmap.getTextureReference(8, 9, 4, 5); + public static final TextureReference CHAR_w = Textures.texmap.getTextureReference(9, 10, 4, 5); + public static final TextureReference CHAR_x = Textures.texmap.getTextureReference(10, 11, 4, 5); + public static final TextureReference CHAR_y = Textures.texmap.getTextureReference(11, 12, 4, 5); + public static final TextureReference CHAR_z = Textures.texmap.getTextureReference(12, 13, 4, 5); + public static final TextureReference CHAR_0 = Textures.texmap.getTextureReference(13, 14, 4, 5); + public static final TextureReference CHAR_1 = Textures.texmap.getTextureReference(14, 15, 4, 5); + public static final TextureReference CHAR_2 = Textures.texmap.getTextureReference(15, 16, 4, 5); + public static final TextureReference CHAR_3 = Textures.texmap.getTextureReference(5, 6, 5, 6); + public static final TextureReference CHAR_4 = Textures.texmap.getTextureReference(6, 7, 5, 6); + public static final TextureReference CHAR_5 = Textures.texmap.getTextureReference(7, 8, 5, 6); + public static final TextureReference CHAR_6 = Textures.texmap.getTextureReference(8, 9, 5, 6); + public static final TextureReference CHAR_7 = Textures.texmap.getTextureReference(9, 10, 5, 6); + public static final TextureReference CHAR_8 = Textures.texmap.getTextureReference(10, 11, 5, 6); + public static final TextureReference CHAR_9 = Textures.texmap.getTextureReference(11, 12, 5, 6); + public static final TextureReference CHAR_PEROID = Textures.texmap.getTextureReference(12, 13, 5, 6); + public static final TextureReference CHAR_COLON = Textures.texmap.getTextureReference(13, 14, 5, 6); + public static final TextureReference CHAR_COMMA = Textures.texmap.getTextureReference(14, 15, 5, 6); + public static final TextureReference CHAR_EXMARK = Textures.texmap.getTextureReference(15, 16, 5, 6); + + public static void render(String text, Vec2d size) + { + // Get the bytes from the string + byte[] text_b = text.getBytes(); + + double sx = size.x; + double sy = size.y; + + // Begin quads + GlHelpers.begin(); + + // Loop over the bytes + for(int i=0;i implements Iterable> } } - // Send back an empty (unloaded) chunk + // Send back an empty object return this.map2d_i.getEmpty(pos); } @@ -64,6 +64,24 @@ public class Map2D implements Iterable> } } } + + public boolean contains(Vec2i pos) + { + // Loop over the elements + for(int i=0;i e = this.elements.get(i); + + // Return true if the position is the same + if(e.pos.equal(pos)) { + return true; + } + } + + // Return false if nothing was found + return false; + } @Override public Iterator> iterator() { diff --git a/src/shootergame/util/math/vec/Vec2d.java b/src/shootergame/util/math/vec/Vec2d.java index 9ec875a..6bd3581 100644 --- a/src/shootergame/util/math/vec/Vec2d.java +++ b/src/shootergame/util/math/vec/Vec2d.java @@ -40,4 +40,8 @@ public class Vec2d public Vec2d divide(Vec2d other) { return new Vec2d(this.x / other.x, this.y / other.y); } + + public Vec2d copy() { + return new Vec2d(x, y); + } } diff --git a/src/shootergame/util/math/vec/Vec2i.java b/src/shootergame/util/math/vec/Vec2i.java index c1bfeea..a4fb59c 100644 --- a/src/shootergame/util/math/vec/Vec2i.java +++ b/src/shootergame/util/math/vec/Vec2i.java @@ -36,10 +36,10 @@ public class Vec2i public static Vec2i fromId(Range2i range, int id) { - int x = id % range.mx; + int x = MathHelpers.mod(id, range.mx); id -= x; id /= range.mx; - int y = id % range.my; + int y = MathHelpers.mod(id, range.my); return new Vec2i(x, y); } @@ -63,4 +63,8 @@ public class Vec2i public Vec2i divide(Vec2i other) { return new Vec2i(this.x / other.x, this.y / other.y); } + + public Vec2i copy() { + return new Vec2i(x, y); + } } diff --git a/src/shootergame/util/math/vec/Vec3d.java b/src/shootergame/util/math/vec/Vec3d.java index 29c3936..4516563 100644 --- a/src/shootergame/util/math/vec/Vec3d.java +++ b/src/shootergame/util/math/vec/Vec3d.java @@ -42,4 +42,8 @@ public class Vec3d public Vec3d divide(Vec3d other) { return new Vec3d(this.x / other.x, this.y / other.y, this.z / other.z); } + + public Vec3d copy() { + return new Vec3d(x, y, z); + } } diff --git a/src/shootergame/util/math/vec/Vec3i.java b/src/shootergame/util/math/vec/Vec3i.java index c87e414..48eecef 100644 --- a/src/shootergame/util/math/vec/Vec3i.java +++ b/src/shootergame/util/math/vec/Vec3i.java @@ -40,13 +40,13 @@ public class Vec3i public static Vec3i fromId(Range3i range, int id) { - int x = id % range.mx; + int x = MathHelpers.mod(id, range.mx); id -= x; id /= range.mx; - int y = id % range.my; + int y = MathHelpers.mod(id, range.my); id -= y; id /= range.my; - int z = id % range.mz; + int z = MathHelpers.mod(id, range.mz); return new Vec3i(x, y, z); } @@ -70,4 +70,8 @@ public class Vec3i public Vec3i divide(Vec3i other) { return new Vec3i(this.x / other.x, this.y / other.y, this.z / other.z); } + + public Vec3i copy() { + return new Vec3i(x, y, z); + } } diff --git a/src/shootergame/world/World.java b/src/shootergame/world/World.java new file mode 100644 index 0000000..aae786f --- /dev/null +++ b/src/shootergame/world/World.java @@ -0,0 +1,52 @@ +package shootergame.world; + +import java.util.ArrayList; +import java.util.Random; + +import shootergame.display.Camera; +import shootergame.world.layer.Layer; +import shootergame.world.layer.layergen.LayerGen; + +public class World +{ + private ArrayList layers = new ArrayList(); + private int layer_id = 0; + private Layer layer; + + public World(Random rand, LayerGen ... layergen) + { + // Loop over the layer generators + for(LayerGen lg : layergen) + { + // Create new layers + layers.add(new Layer(rand, lg)); + } + + // Set the current layer + layer = layers.get(layer_id); + } + + public void render(Camera camera) { + layer.render(camera); + } + + public void tickEntities() { + layer.tickEntities(); + } + + public void spawnRandomEntities() { + layer.spawnRandomEntities(); + } + + public int getLayerID() { + return layer_id; + } + + public void setLayerID(int id) { + layer_id = id; + } + + public Layer getLayer() { + return layer; + } +} diff --git a/src/shootergame/world/chunk/Chunk.java b/src/shootergame/world/chunk/Chunk.java new file mode 100644 index 0000000..d57383e --- /dev/null +++ b/src/shootergame/world/chunk/Chunk.java @@ -0,0 +1,180 @@ +package shootergame.world.chunk; + +import java.util.ArrayList; +import java.util.Random; + +import shootergame.display.Camera; +import shootergame.entity.Entity; +import shootergame.init.Tiles; +import shootergame.tiles.Tile; +import shootergame.util.math.MathHelpers; +import shootergame.util.math.range.Range2i; +import shootergame.util.math.vec.Vec2d; +import shootergame.util.math.vec.Vec2i; +import shootergame.world.layer.Layer; + +public class Chunk +{ + public static final Range2i CHUNK_SIZE = new Range2i(16, 16); + public static final Chunk CHUNK_EMPTY = new ChunkEmpty(); + public static final int CHUNK_INDEX = CHUNK_SIZE.mx * CHUNK_SIZE.my; + public static final int SIMULATION_DISTANCE = 5; + + private Tile tiles_back[] = new Tile[CHUNK_INDEX]; + private Tile tiles_front[] = new Tile[CHUNK_INDEX]; + private ArrayList entities = new ArrayList(); + private Random rand; + private Layer layer; + private Vec2i c_pos; + + public Chunk(Layer layer, Vec2i c_pos, Random rand) + { + // Set some specified values + this.rand = rand; + this.layer = layer; + this.c_pos = c_pos; + + // Loop over all the tiles in the chunk + for(int i=0;i getNearbyEntities(Vec2d pos, double distance) + { + // Get the list of entities to send back + ArrayList nearby_entities = new ArrayList(); + + // Loop over the entities + for(Entity e : entities) + { + if( + e.pos.x + distance < pos.x && + e.pos.x - distance > pos.x && + e.pos.y + distance < pos.y && + e.pos.y - distance > pos.y + ) { + nearby_entities.add(e); + } + } + + // Send back the entities + return nearby_entities; + } + +} diff --git a/src/shootergame/world/chunk/ChunkEmpty.java b/src/shootergame/world/chunk/ChunkEmpty.java new file mode 100644 index 0000000..d0a3c15 --- /dev/null +++ b/src/shootergame/world/chunk/ChunkEmpty.java @@ -0,0 +1,42 @@ +package shootergame.world.chunk; + +import shootergame.display.Camera; +import shootergame.entity.Entity; +import shootergame.init.Tiles; +import shootergame.tiles.Tile; +import shootergame.util.math.vec.Vec2i; + +public class ChunkEmpty extends Chunk +{ + + + public ChunkEmpty() { + super(null, null, null); + } + + @Override + public void render(Camera camera) {} + + @Override + public void tickEntities() {} + + @Override + public void spawnEntity(Entity e) {} + + @Override + public Tile getBackTile(Vec2i pos) { + return Tiles.VOID; + } + + @Override + public Tile getFrontTile(Vec2i pos) { + return Tiles.VOID; + } + + @Override + public void setBackTile(Tile tile, Vec2i pos) {} + + @Override + public void setFrontTile(Tile tile, Vec2i pos) {} + +} diff --git a/src/shootergame/world/chunk/ChunkEventHandler.java b/src/shootergame/world/chunk/ChunkEventHandler.java new file mode 100644 index 0000000..6b41041 --- /dev/null +++ b/src/shootergame/world/chunk/ChunkEventHandler.java @@ -0,0 +1,71 @@ +package shootergame.world.chunk; + +import java.util.Random; + +import mainloop.task.IMainloopTask; +import shootergame.Main; +import shootergame.util.math.map.Map2DElement; +import shootergame.util.math.random.RandomHelpers; +import shootergame.util.math.vec.Vec2d; +import shootergame.util.math.vec.Vec2i; +import shootergame.world.layer.Layer; + +public class ChunkEventHandler implements IMainloopTask +{ + public static final ChunkEventHandler CHUNK_EVENT_HANDLER = new ChunkEventHandler(); + + @Override + public boolean MainLoopDelay(long millis) { + return millis > 100; + } + + @Override + public boolean MainLoopRepeat() { + return true; + } + + @Override + public void MainLoopUpdate() + { + // Get the layer + Layer layer = Main.world.getLayer(); + + // Loop over all the chunks in this layer + for(Map2DElement ce : layer.chunks) + { + // Convert the player pos to x and y + int px = (int)Main.player.pos.x / 16; + int py = (int)Main.player.pos.y / 16; + + if( + // Is this chunk beyond the simulation distance + px > ce.pos.x + Chunk.SIMULATION_DISTANCE || + px < ce.pos.x - Chunk.SIMULATION_DISTANCE || + py > ce.pos.y + Chunk.SIMULATION_DISTANCE || + py < ce.pos.y - Chunk.SIMULATION_DISTANCE + ) { + // Unload the chunk + layer.unloadChunk(ce.pos); + } + } + + // Loop over the simulation distance + for(int x=-Chunk.SIMULATION_DISTANCE;x chunks; + private LayerGen layergen; + private Random rand; + private long seed; + + public Layer(Random rand, LayerGen layergen) + { + // Create the array of tiles + this.layergen = layergen; + this.seed = rand.nextLong(); + this.rand = new Random(); + this.chunks = new Map2D(layergen); + } + + public void render(Camera camera) + { + // Render every chunk in the players render distance + for(int x=-camera.renderDistance;x e : chunks) { + e.o.tickEntities(); + } + + // Move every entitiy in every loaded chunk + for(Map2DElement e : chunks) { + e.o.moveEntities(); + } + } + + public void spawnRandomEntities() { + this.layergen.spawnEntities(this, rand); + } + + public void setBackTile(Tile tile, Vec2i pos) + { + // Get the chunk pos + Vec2i c_pos = new Vec2i(pos.x / Chunk.CHUNK_SIZE.my, pos.y / Chunk.CHUNK_SIZE.my); + + // Set the chunks back tile + chunks.get(c_pos).setBackTile(tile, pos); + } + + public void setFrontTile(Tile tile, Vec2i pos) + { + // Get the chunk pos + Vec2i c_pos = new Vec2i(pos.x / Chunk.CHUNK_SIZE.my, pos.y / Chunk.CHUNK_SIZE.my); + + // Set the chunks front tile + chunks.get(c_pos).setFrontTile(tile, pos); + } + + public Tile getBackTile(Vec2i pos) + { + // Get the chunk pos + Vec2i c_pos = new Vec2i(pos.x / Chunk.CHUNK_SIZE.my, pos.y / Chunk.CHUNK_SIZE.my); + + // Get the chunks back tile + return chunks.get(c_pos).getBackTile(pos); + } + + public Tile getFrontTile(Vec2i pos) + { + // Get the chunk pos + Vec2i c_pos = new Vec2i(pos.x / Chunk.CHUNK_SIZE.my, pos.y / Chunk.CHUNK_SIZE.my); + + // Get the chunks front tile + return chunks.get(c_pos).getFrontTile(pos); + } + + public void spawnEntity(Entity entity) + { + // Get the chunk pos + Vec2i c_pos = new Vec2i((int)entity.pos.x / Chunk.CHUNK_SIZE.mx, (int)entity.pos.y / Chunk.CHUNK_SIZE.my); + + // Spawn the entity in the specified chunk + chunks.get(c_pos).spawnEntity(entity); + } + + public void loadChunk(Vec2i pos) { + chunks.set(pos, layergen.generateChunk(this, new Random(seed), pos)); + } + + public void unloadChunk(Vec2i pos) { + chunks.remove(pos); + } + + public boolean chunkLoaded(Vec2i pos) { + return chunks.contains(pos); + } + + public ArrayList getNearbyEntities(Vec2d pos, double distance) + { + // Create the list of nearby entities + ArrayList entities = new ArrayList(); + + Vec2i cpos = new Vec2i((int)pos.x / Chunk.CHUNK_SIZE.mx, (int)pos.y / Chunk.CHUNK_SIZE.my); + + for(int x=-1;x<=1;x++) { + for(int y=-1;y<=1;y++) + { + for(Entity e : chunks.get(new Vec2i(x+cpos.x, y+cpos.y)).getNearbyEntities(pos, distance)) { + entities.add(e); + } + } + } + + // Send back the list of nearby entities + return entities; + } +} diff --git a/src/shootergame/world/layer/layergen/LayerGen.java b/src/shootergame/world/layer/layergen/LayerGen.java new file mode 100644 index 0000000..9044318 --- /dev/null +++ b/src/shootergame/world/layer/layergen/LayerGen.java @@ -0,0 +1,19 @@ +package shootergame.world.layer.layergen; + +import java.util.Random; + +import shootergame.util.math.map.IMap2D; +import shootergame.util.math.vec.Vec2i; +import shootergame.world.chunk.Chunk; +import shootergame.world.layer.Layer; + +public abstract class LayerGen implements IMap2D +{ + public abstract Chunk generateChunk(Layer layer, Random rand, Vec2i pos); + public abstract void spawnEntities(Layer layer, Random rand); + + @Override + public Chunk getEmpty(Vec2i pos) { + return Chunk.CHUNK_EMPTY; + } +} diff --git a/src/shootergame/world/layer/layergen/LayerGenEarth.java b/src/shootergame/world/layer/layergen/LayerGenEarth.java new file mode 100644 index 0000000..561dfcd --- /dev/null +++ b/src/shootergame/world/layer/layergen/LayerGenEarth.java @@ -0,0 +1,80 @@ +package shootergame.world.layer.layergen; + +import java.util.Random; + +import shootergame.Main; +import shootergame.entity.Entity; +import shootergame.entity.EntityBullet; +import shootergame.entity.EntityZombie; +import shootergame.init.Tiles; +import shootergame.tiles.Tile; +import shootergame.util.math.random.OpenSimplexNoise; +import shootergame.util.math.random.RandomHelpers; +import shootergame.util.math.range.Range2i; +import shootergame.util.math.vec.Vec2d; +import shootergame.util.math.vec.Vec2i; +import shootergame.world.chunk.Chunk; +import shootergame.world.layer.Layer; + +public class LayerGenEarth extends LayerGen +{ + + @Override + public Chunk generateChunk(Layer layer, Random rand, Vec2i c_pos) + { + // Create the new chunk + Chunk chunk = new Chunk(layer, c_pos, rand); + + // Get the noise generator + OpenSimplexNoise noisegen_n = new OpenSimplexNoise(rand.nextLong()); + + // Loop over the layer dimensions and create land + for(int x=0;x 0.9) chunk.setFrontTile(Tiles.TREE, pos); + else if(rand.nextDouble() > 0.99) chunk.setFrontTile(Tiles.ROCK, pos); + else chunk.setFrontTile(Tiles.VOID, pos); + + // Terrain generation + if(noise_n < 20) { + chunk.setFrontTile(Tiles.WATER, pos); + chunk.setBackTile(Tiles.DIRT, pos); + } + else if(noise_n < 60) chunk.setBackTile(Tiles.GRASS, pos); + else if(noise_n < 80) chunk.setBackTile(Tiles.DIRT, pos); + else chunk.setBackTile(Tiles.STONE, pos); + } + } + + // Send back the new chunk + return chunk; + } + + @Override + public void spawnEntities(Layer layer, Random rand) + { + if(rand.nextDouble() > 0.99) + { + Entity zombie = new EntityZombie(); + zombie.pos = new Vec2d( + RandomHelpers.randrange(rand, (int)Main.player.pos.x - 100, (int)Main.player.pos.x + 100), + RandomHelpers.randrange(rand, (int)Main.player.pos.y - 100, (int)Main.player.pos.y + 100)); + layer.spawnEntity(zombie); + } + } +}