Started on platforms. Updated player movement.
BIN
LudumDare46 (Slab).zip
Normal file
Before Width: | Height: | Size: 418 KiB After Width: | Height: | Size: 21 KiB |
BIN
res/img/player/player_effect.png
Normal file
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 341 KiB |
Before Width: | Height: | Size: 289 KiB After Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 470 KiB After Width: | Height: | Size: 25 KiB |
|
@ -1,19 +0,0 @@
|
||||||
#version 330 core
|
|
||||||
|
|
||||||
uniform sampler2D layer0;
|
|
||||||
uniform sampler2D layer1;
|
|
||||||
|
|
||||||
uniform float offset0 = 1;
|
|
||||||
uniform float offset1 = 1;
|
|
||||||
|
|
||||||
in vec2 texCoords;
|
|
||||||
|
|
||||||
out vec4 color;
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
vec4 color0 = texture(layer0, texCoords + vec2(0, offset0));
|
|
||||||
vec4 color1 = texture(layer1, texCoords + vec2(0, offset1));
|
|
||||||
color = mix(color0, color1, 1 - color0.a);
|
|
||||||
if (color.a == 0)
|
|
||||||
discard;
|
|
||||||
}
|
|
13
res/shaders/s2e/frag.gls
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#version 330 core
|
||||||
|
|
||||||
|
uniform sampler2D sampler;
|
||||||
|
|
||||||
|
in vec2 texCoords;
|
||||||
|
|
||||||
|
out vec4 color;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
color = texture(sampler, texCoords);
|
||||||
|
if (color.a == 0)
|
||||||
|
discard;
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
#version 330 core
|
#version 330 core
|
||||||
|
|
||||||
|
uniform vec4 subtexture = vec4(0, 0, 1, 1);
|
||||||
uniform mat4 mvp;
|
uniform mat4 mvp;
|
||||||
|
|
||||||
layout (location = 0) in vec3 vertices;
|
layout (location = 0) in vec3 vertices;
|
||||||
|
@ -8,6 +9,6 @@ layout (location = 1) in vec2 itexCoords;
|
||||||
out vec2 texCoords;
|
out vec2 texCoords;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
texCoords = itexCoords;
|
texCoords = itexCoords * subtexture.zw + subtexture.xy;
|
||||||
gl_Position = mvp * vec4(vertices, 1);
|
gl_Position = mvp * vec4(vertices, 1);
|
||||||
}
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
#version 330 core
|
#version 330 core
|
||||||
|
|
||||||
|
uniform vec4 subtexture = vec4(0, 0, 1, 1);
|
||||||
uniform mat4 mvp;
|
uniform mat4 mvp;
|
||||||
|
|
||||||
layout (location = 0) in vec3 vertices;
|
layout (location = 0) in vec3 vertices;
|
||||||
|
@ -8,6 +9,6 @@ layout (location = 1) in vec2 itexCoords;
|
||||||
out vec2 texCoords;
|
out vec2 texCoords;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
texCoords = itexCoords;
|
texCoords = itexCoords * subtexture.zw + subtexture.xy;
|
||||||
gl_Position = mvp * vec4(vertices, 1);
|
gl_Position = mvp * vec4(vertices, 1);
|
||||||
}
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
Manifest-Version: 1.0
|
Manifest-Version: 1.0
|
||||||
Main-Class: com.gnarwhal.ld46.game.Main
|
Main-Class: com.gnarwhal.ld46.game.Main
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -122,7 +122,7 @@ public class Window {
|
||||||
|
|
||||||
glEnable(GL_MULTISAMPLE);
|
glEnable(GL_MULTISAMPLE);
|
||||||
|
|
||||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
//glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
||||||
|
|
||||||
int[] awidth = new int[1], aheight = new int[1];
|
int[] awidth = new int[1], aheight = new int[1];
|
||||||
glfwGetWindowSize(window, awidth, aheight);
|
glfwGetWindowSize(window, awidth, aheight);
|
||||||
|
|
|
@ -13,7 +13,6 @@ public abstract class Shader {
|
||||||
|
|
||||||
public static Shader2c SHADER2C;
|
public static Shader2c SHADER2C;
|
||||||
public static Shader2t SHADER2T;
|
public static Shader2t SHADER2T;
|
||||||
public static Shader2b SHADER2B;
|
|
||||||
|
|
||||||
protected int program;
|
protected int program;
|
||||||
|
|
||||||
|
@ -80,6 +79,5 @@ public abstract class Shader {
|
||||||
public static void init() {
|
public static void init() {
|
||||||
SHADER2C = new Shader2c();
|
SHADER2C = new Shader2c();
|
||||||
SHADER2T = new Shader2t();
|
SHADER2T = new Shader2t();
|
||||||
SHADER2B = new Shader2b();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
package com.gnarwhal.ld46.engine.shaders;
|
|
||||||
|
|
||||||
import static org.lwjgl.opengl.GL20.*;
|
|
||||||
|
|
||||||
public class Shader2b extends Shader {
|
|
||||||
|
|
||||||
private int offset0Loc;
|
|
||||||
private int offset1Loc;
|
|
||||||
|
|
||||||
protected Shader2b() {
|
|
||||||
super("res/shaders/s2b/vert.gls", "res/shaders/s2b/frag.gls");
|
|
||||||
getUniforms();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOffset(float offset0, float offset1) {
|
|
||||||
glUniform1f(offset0Loc, offset0);
|
|
||||||
glUniform1f(offset1Loc, offset1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void getUniforms() {
|
|
||||||
offset0Loc = glGetUniformLocation(program, "offset0");
|
|
||||||
offset1Loc = glGetUniformLocation(program, "offset1");
|
|
||||||
|
|
||||||
int layer0 = glGetUniformLocation(program, "layer0");
|
|
||||||
int layer1 = glGetUniformLocation(program, "layer1");
|
|
||||||
|
|
||||||
enable();
|
|
||||||
glUniform1i(layer0, 0);
|
|
||||||
glUniform1i(layer1, 1);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,7 +5,7 @@ import static org.lwjgl.opengl.GL20.glUniform4f;
|
||||||
|
|
||||||
public class Shader2c extends Shader {
|
public class Shader2c extends Shader {
|
||||||
|
|
||||||
int colorLoc;
|
private int colorLoc;
|
||||||
|
|
||||||
protected Shader2c(String vert, String frag) {
|
protected Shader2c(String vert, String frag) {
|
||||||
super(vert, frag);
|
super(vert, frag);
|
||||||
|
|
25
src/com/gnarwhal/ld46/engine/shaders/Shader2e.java
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
package com.gnarwhal.ld46.engine.shaders;
|
||||||
|
|
||||||
|
import org.joml.Vector2f;
|
||||||
|
|
||||||
|
import static org.lwjgl.opengl.GL20.glGetUniformLocation;
|
||||||
|
import static org.lwjgl.opengl.GL20.glUniform4f;
|
||||||
|
|
||||||
|
public class Shader2t extends Shader {
|
||||||
|
|
||||||
|
private int subtextureLoc;
|
||||||
|
|
||||||
|
public Shader2t() {
|
||||||
|
super("res/shaders/s2t/vert.gls", "res/shaders/s2t/frag.gls");
|
||||||
|
getUniforms();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void getUniforms() {
|
||||||
|
subtextureLoc = glGetUniformLocation(program, "subtexture");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubtexture(Vector2f position, Vector2f dimensions) {
|
||||||
|
glUniform4f(subtextureLoc, position.x, position.y, dimensions.x, dimensions.y);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,25 @@
|
||||||
package com.gnarwhal.ld46.engine.shaders;
|
package com.gnarwhal.ld46.engine.shaders;
|
||||||
|
|
||||||
|
import org.joml.Vector2f;
|
||||||
|
|
||||||
|
import static org.lwjgl.opengl.GL20.glGetUniformLocation;
|
||||||
|
import static org.lwjgl.opengl.GL20.glUniform4f;
|
||||||
|
|
||||||
public class Shader2t extends Shader {
|
public class Shader2t extends Shader {
|
||||||
|
|
||||||
protected Shader2t() {
|
private int subtextureLoc;
|
||||||
|
|
||||||
|
public Shader2t() {
|
||||||
super("res/shaders/s2t/vert.gls", "res/shaders/s2t/frag.gls");
|
super("res/shaders/s2t/vert.gls", "res/shaders/s2t/frag.gls");
|
||||||
getUniforms();
|
getUniforms();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void getUniforms() {}
|
protected void getUniforms() {
|
||||||
|
subtextureLoc = glGetUniformLocation(program, "subtexture");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubtexture(Vector2f position, Vector2f dimensions) {
|
||||||
|
glUniform4f(subtextureLoc, position.x, position.y, dimensions.x, dimensions.y);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -8,16 +8,20 @@ public class GamePanel {
|
||||||
private Window window;
|
private Window window;
|
||||||
private Camera camera;
|
private Camera camera;
|
||||||
|
|
||||||
|
private Player player;
|
||||||
|
|
||||||
public GamePanel(Window window, Camera camera) {
|
public GamePanel(Window window, Camera camera) {
|
||||||
this.window = window;
|
this.window = window;
|
||||||
this.camera = camera;
|
this.camera = camera;
|
||||||
|
|
||||||
|
player = new Player(window, camera);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
|
player.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void render() {
|
public void render() {
|
||||||
|
player.render();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,9 +51,9 @@ public class Main {
|
||||||
private void init() {
|
private void init() {
|
||||||
al = new ALManagement();
|
al = new ALManagement();
|
||||||
|
|
||||||
final int WIN_WIDTH = 768, WIN_HEIGHT = 432;
|
final int WIN_WIDTH = 1920, WIN_HEIGHT = 1080;
|
||||||
window = new Window("Ludum Dare 46", true);
|
//window = new Window("Ludum Dare 46", true);
|
||||||
//window = new Window(WIN_WIDTH, WIN_HEIGHT, "Ludum Dare 46", true, true, true);
|
window = new Window(WIN_WIDTH * 3/4, WIN_HEIGHT * 3/4, "Ludum Dare 46", true, true, true);
|
||||||
camera = new Camera(WIN_WIDTH, WIN_HEIGHT);
|
camera = new Camera(WIN_WIDTH, WIN_HEIGHT);
|
||||||
Shader.init();
|
Shader.init();
|
||||||
|
|
||||||
|
|
4
src/com/gnarwhal/ld46/game/Platform.java
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
package com.gnarwhal.ld46.game;
|
||||||
|
|
||||||
|
public class Platform {
|
||||||
|
}
|
207
src/com/gnarwhal/ld46/game/Player.java
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
package com.gnarwhal.ld46.game;
|
||||||
|
|
||||||
|
import com.gnarwhal.ld46.engine.display.Camera;
|
||||||
|
import com.gnarwhal.ld46.engine.display.Window;
|
||||||
|
import com.gnarwhal.ld46.engine.model.Rect;
|
||||||
|
import com.gnarwhal.ld46.engine.shaders.Shader2t;
|
||||||
|
import com.gnarwhal.ld46.engine.texture.Texture;
|
||||||
|
import jdk.jfr.Percentage;
|
||||||
|
import org.joml.Vector2f;
|
||||||
|
import org.joml.Vector3d;
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
|
import static com.gnarwhal.ld46.engine.display.Window.BUTTON_PRESSED;
|
||||||
|
import static com.gnarwhal.ld46.game.Main.dtime;
|
||||||
|
import static org.lwjgl.glfw.GLFW.*;
|
||||||
|
|
||||||
|
public class Player extends Rect {
|
||||||
|
|
||||||
|
private Texture[] textures;
|
||||||
|
private Shader2t shader;
|
||||||
|
|
||||||
|
private Window window;
|
||||||
|
|
||||||
|
private Vector3f[] positions;
|
||||||
|
private Vector3f offset;
|
||||||
|
private float idleTime;
|
||||||
|
|
||||||
|
private Vector3f velocity;
|
||||||
|
|
||||||
|
private boolean grounded = false;
|
||||||
|
|
||||||
|
public Player(Window window, Camera camera) {
|
||||||
|
super(camera, 0, 0, -0.1f, 200, 200, 0, false);
|
||||||
|
this.window = window;
|
||||||
|
|
||||||
|
textures = new Texture[] {
|
||||||
|
new Texture("res/img/player/player_legs.png"),
|
||||||
|
new Texture("res/img/player/player_head.png"),
|
||||||
|
new Texture("res/img/player/player_arms.png"),
|
||||||
|
new Texture("res/img/player/player_effect.png"),
|
||||||
|
};
|
||||||
|
|
||||||
|
positions = new Vector3f[] {
|
||||||
|
new Vector3f(),
|
||||||
|
new Vector3f(),
|
||||||
|
new Vector3f()
|
||||||
|
};
|
||||||
|
offset = new Vector3f();
|
||||||
|
idleTime = 0;
|
||||||
|
|
||||||
|
shader = new Shader2t();
|
||||||
|
|
||||||
|
velocity = new Vector3f();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update() {
|
||||||
|
|
||||||
|
final float JUMP_SPEED = 812;
|
||||||
|
final float DECELERATION = 1762;
|
||||||
|
final float HIGH_SPEED_DECELERATION = 2048;
|
||||||
|
final float TERMINAL_VELOCITY = 1762;
|
||||||
|
final float GRAVITY = 1762;
|
||||||
|
|
||||||
|
final float speed = 768;
|
||||||
|
|
||||||
|
float friction = 0;
|
||||||
|
float floor = 0;
|
||||||
|
Vector3f acceleration = new Vector3f(0, GRAVITY, 0);
|
||||||
|
|
||||||
|
if (window.keyPressed(GLFW_KEY_A) >= BUTTON_PRESSED) {
|
||||||
|
floor = -speed;
|
||||||
|
if (velocity.x > -speed)
|
||||||
|
velocity.x = -speed;
|
||||||
|
else
|
||||||
|
friction = HIGH_SPEED_DECELERATION;
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (window.keyPressed(GLFW_KEY_D) >= BUTTON_PRESSED) {
|
||||||
|
floor = speed;
|
||||||
|
if (velocity.x < speed) {
|
||||||
|
velocity.x = speed;
|
||||||
|
} else {
|
||||||
|
friction = -HIGH_SPEED_DECELERATION;
|
||||||
|
}
|
||||||
|
} else if (velocity.x != 0) {
|
||||||
|
float absVelX = Math.abs(velocity.x);
|
||||||
|
if (absVelX > speed) {
|
||||||
|
friction = -HIGH_SPEED_DECELERATION * (velocity.x / absVelX);
|
||||||
|
} else {
|
||||||
|
friction = -DECELERATION * (velocity.x / absVelX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window.keyPressed(GLFW_KEY_S) == BUTTON_PRESSED && velocity.y >= 0) {
|
||||||
|
velocity.y = TERMINAL_VELOCITY;
|
||||||
|
} else {
|
||||||
|
float absVelocityY = Math.abs(velocity.y());
|
||||||
|
if (absVelocityY > TERMINAL_VELOCITY) {
|
||||||
|
velocity.y = (velocity.y / absVelocityY) * TERMINAL_VELOCITY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((window.keyPressed(GLFW_KEY_W) == BUTTON_PRESSED
|
||||||
|
|| window.keyPressed(GLFW_KEY_SPACE) == BUTTON_PRESSED)) {
|
||||||
|
velocity.y = -JUMP_SPEED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (velocity.x == 0 && grounded) {
|
||||||
|
final float SCALE = 10;
|
||||||
|
final float RATE = (float) (2 * Math.PI / 2.5); // Last number is seconds per loop
|
||||||
|
offset.y = (float) (SCALE * Math.sin(RATE * idleTime));
|
||||||
|
idleTime += dtime;
|
||||||
|
} else {
|
||||||
|
idleTime = 0;
|
||||||
|
offset.y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
grounded = false;
|
||||||
|
velocity.add(acceleration.mul((float) dtime, new Vector3f()));
|
||||||
|
float degradedVelocity = velocity.x() + friction * (float) dtime;
|
||||||
|
// If the acceleration due to friction would accelerate it past the speed floor set it to the speed floor
|
||||||
|
if ((degradedVelocity - floor) * (velocity.x() - floor) < 0) {
|
||||||
|
velocity.x = floor;
|
||||||
|
// otherwise just apply the friction
|
||||||
|
} else {
|
||||||
|
velocity.x = degradedVelocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
position.add(velocity.mul((float) dtime, new Vector3f()));
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (state == STATE_GROUNDED) {
|
||||||
|
final float MAX_HORZ_VELOCITY = 1024;
|
||||||
|
final float HORZ_ACCELERATION = 4096;
|
||||||
|
if (window.keyPressed(GLFW_KEY_A) >= BUTTON_PRESSED) {
|
||||||
|
velocity.x -= HORZ_ACCELERATION * dtime;
|
||||||
|
if (velocity.x < -MAX_HORZ_VELOCITY) {
|
||||||
|
velocity.x = -MAX_HORZ_VELOCITY;
|
||||||
|
}
|
||||||
|
} else if (window.keyPressed(GLFW_KEY_D) >= BUTTON_PRESSED) {
|
||||||
|
velocity.x += HORZ_ACCELERATION * dtime;
|
||||||
|
if (velocity.x > MAX_HORZ_VELOCITY) {
|
||||||
|
velocity.x = MAX_HORZ_VELOCITY;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
velocity.x *=
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
velocity.y += (float) (GRAVITY * dtime);
|
||||||
|
if (velocity.y > TERMINAL_VELOCITY) {
|
||||||
|
velocity.y = TERMINAL_VELOCITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
position.add(velocity.mul((float) Main.dtime, new Vector3f()));*/
|
||||||
|
|
||||||
|
// Check y bounds
|
||||||
|
if (position.y + height > camera.getHeight()) {
|
||||||
|
position.y = camera.getHeight() - height;
|
||||||
|
velocity.y = 0;
|
||||||
|
grounded = true;
|
||||||
|
} else {
|
||||||
|
grounded = false;
|
||||||
|
if (position.y < 0) {
|
||||||
|
position.y = 0;
|
||||||
|
velocity.y = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check X bounds
|
||||||
|
if (position.x < 0) {
|
||||||
|
position.x = 0;
|
||||||
|
velocity.x = 0;
|
||||||
|
} else if (position.x + width > camera.getWidth()) {
|
||||||
|
position.x = camera.getWidth() - width;
|
||||||
|
velocity.x = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
final float MAX_DISTANCE = 10;
|
||||||
|
final float ELASTICITY = 0.5f;
|
||||||
|
positions[0].set(position).add(offset);
|
||||||
|
Vector3f displacement = positions[2].sub(positions[0], new Vector3f()).mul(1 - ELASTICITY);
|
||||||
|
displacement.x = 0;
|
||||||
|
float length = displacement.length();
|
||||||
|
if (length > MAX_DISTANCE) {
|
||||||
|
displacement.div(length).mul(MAX_DISTANCE);
|
||||||
|
}
|
||||||
|
positions[2].set(positions[0]).add(displacement);
|
||||||
|
displacement.set(positions[1]).sub(positions[2]).mul(1 - ELASTICITY);
|
||||||
|
displacement.x = 0;
|
||||||
|
length = displacement.length();
|
||||||
|
if (length > MAX_DISTANCE) {
|
||||||
|
displacement.div(length).mul(MAX_DISTANCE);
|
||||||
|
}
|
||||||
|
System.out.println(displacement);
|
||||||
|
positions[1].set(positions[2]).add(displacement);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void render() {
|
||||||
|
shader.enable();
|
||||||
|
shader.setSubtexture(new Vector2f(0, 0), new Vector2f(0.5f, 0.2f));
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
textures[i].bind();
|
||||||
|
shader.setMVP(camera.getMatrix().translate(positions[i].add(width * scale / 2, height * scale / 2, 0.01f * i, new Vector3f())).rotateZ(rotation).scale(width * scale, height * scale, 1).translate(-0.5f, -0.5f, 0));
|
||||||
|
vao.render();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|