Browse Source

Audio implementation, behaviors and entity movement tweaks

Tankernn 8 years ago
parent
commit
cdd31798eb

+ 4 - 0
src/main/java/eu/tankernn/gameEngine/TankernnGame.java

@@ -1,5 +1,6 @@
 package eu.tankernn.gameEngine;
 
+import eu.tankernn.gameEngine.audio.AudioMaster;
 import eu.tankernn.gameEngine.loader.Loader;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
 import eu.tankernn.gameEngine.renderEngine.font.TextMaster;
@@ -10,12 +11,14 @@ public class TankernnGame {
 	protected Loader loader;
 	protected GuiMaster guiMaster;
 	protected TextMaster textMaster;
+	protected AudioMaster audioMaster;
 	
 	public TankernnGame(String name) {
 		this.name = name;
 		this.loader = new Loader();
 		this.guiMaster = new GuiMaster(loader);
 		this.textMaster = new TextMaster(loader);
+		this.audioMaster = new AudioMaster();
 	}
 	
 	public void update() {
@@ -32,6 +35,7 @@ public class TankernnGame {
 		textMaster.finalize();
 		guiMaster.finalize();
 		loader.finalize();
+		audioMaster.finalize();
 	}
 	
 	public String getName() {

+ 2 - 2
src/main/java/eu/tankernn/gameEngine/TankernnGame3D.java

@@ -44,8 +44,6 @@ public class TankernnGame3D extends TankernnGame {
 	protected TerrainPack terrainPack;
 	protected Player player;
 	
-	
-	
 	private MultisampleMultitargetFbo multisampleFbo = new MultisampleMultitargetFbo(Display.getWidth(),
 			Display.getHeight());
 	private Fbo outputFbo = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE),
@@ -79,6 +77,8 @@ public class TankernnGame3D extends TankernnGame {
 		terrainPack.update(player);
 		particleMaster.update(camera);
 		DistanceSorter.sort(lights, camera);
+		
+		audioMaster.setListenerPosition(player.getPosition());
 	}
 
 	public void render() {

+ 20 - 10
src/main/java/eu/tankernn/gameEngine/audio/AudioMaster.java

@@ -1,18 +1,21 @@
 package eu.tankernn.gameEngine.audio;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.lwjgl.LWJGLException;
 import org.lwjgl.openal.AL;
 import org.lwjgl.openal.AL10;
 import org.lwjgl.util.WaveData;
+import org.lwjgl.util.vector.Vector3f;
 
 public class AudioMaster {
 	
-	private static List<Integer> buffers = new ArrayList<Integer>();
+	private static final String SOUND_PATH = "sound/";
 	
-	public static void init() {
+	private Map<String, Integer> buffers = new HashMap<>();
+	
+	public AudioMaster() {
 		try {
 			AL.create();
 		} catch (LWJGLException e) {
@@ -20,24 +23,31 @@ public class AudioMaster {
 		}
 	}
 	
-	public static void setListenerData(float x, float y, float z) {
+	public void setListenerData(float x, float y, float z) {
 		AL10.alListener3f(AL10.AL_POSITION, x, y, z);
 		AL10.alListener3f(AL10.AL_VELOCITY, 0, 0, 0);
 	}
 	
-	public static int loadSound(String file) {
+	public int loadSound(String file) {
+		if (buffers.containsKey(file))
+			return buffers.get(file);
+		
 		int buffer = AL10.alGenBuffers();
-		buffers.add(buffer);
-		WaveData waveFile = WaveData.create(file);
+		buffers.put(file, buffer);
+		WaveData waveFile = WaveData.create(SOUND_PATH + file);
 		AL10.alBufferData(buffer, waveFile.format, waveFile.data, waveFile.samplerate);
 		waveFile.dispose();
 		return buffer;
 	}
 	
-	public static void cleanUp() {
-		for (int buffer: buffers) {
+	public void finalize() {
+		for (int buffer: buffers.values()) {
 			AL10.alDeleteBuffers(buffer);
 		}
 		AL.destroy();
 	}
+
+	public void setListenerPosition(Vector3f position) {
+		setListenerData(position.x, position.y, position.z);
+	}
 }

+ 7 - 5
src/main/java/eu/tankernn/gameEngine/audio/Source.java

@@ -1,6 +1,7 @@
 package eu.tankernn.gameEngine.audio;
 
 import org.lwjgl.openal.AL10;
+import org.lwjgl.util.vector.Vector3f;
 
 public class Source {
 	private int sourceId;
@@ -13,7 +14,8 @@ public class Source {
 	}
 	
 	public void play(int buffer) {
-		stop();
+		if (this.isPlaying())
+			return;
 		AL10.alSourcei(sourceId, AL10.AL_BUFFER, buffer);
 		AL10.alSourcePlay(sourceId);
 	}
@@ -35,8 +37,8 @@ public class Source {
 		AL10.alSourceStop(sourceId);
 	}
 	
-	public void setVelocity(float x, float y, float z) {
-		AL10.alSource3f(sourceId, AL10.AL_VELOCITY, x, y, z);
+	public void setVelocity(Vector3f velocity) {
+		AL10.alSource3f(sourceId, AL10.AL_VELOCITY, velocity.x, velocity.y, velocity.z);
 	}
 	
 	public void setLooping(boolean looping) {
@@ -55,7 +57,7 @@ public class Source {
 		AL10.alSourcef(sourceId, AL10.AL_PITCH, pitch);
 	}
 	
-	public void setPosition(float x, float y, float z) {
-		AL10.alSource3f(sourceId, AL10.AL_POSITION, x, y, z);
+	public void setPosition(Vector3f pos) {
+		AL10.alSource3f(sourceId, AL10.AL_POSITION, pos.x, pos.y, pos.z);
 	}
 }

+ 18 - 25
src/main/java/eu/tankernn/gameEngine/entities/Entity3D.java

@@ -5,11 +5,11 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.animation.model.AnimatedModel;
+import eu.tankernn.gameEngine.audio.Source;
 import eu.tankernn.gameEngine.loader.models.AABB;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
 import eu.tankernn.gameEngine.settings.Physics;
-import eu.tankernn.gameEngine.terrains.Terrain;
 import eu.tankernn.gameEngine.terrains.TerrainPack;
 import eu.tankernn.gameEngine.util.IPositionable;
 
@@ -23,6 +23,7 @@ public class Entity3D implements IPositionable {
 	private AABB boundingBox;
 	protected boolean dead;
 	protected TerrainPack terrain;
+	protected Source source = new Source();
 	private final int id;
 	
 	public Entity3D(TexturedModel model, Vector3f position, AABB boundingBox, TerrainPack terrain) {
@@ -40,35 +41,15 @@ public class Entity3D implements IPositionable {
 		this.id = ID_GEN.incrementAndGet();
 	}
 	
-	public void increasePosition(Vector3f velocity) {
-		this.position.x += velocity.x;
-		this.position.y += velocity.y;
-		this.position.z += velocity.z;
-	}
-	
 	/**
 	 * Moves this entity in the direction of its rotation.
 	 * 
 	 * @param speed The speed with which to move the entity
 	 */
-	public void increasePosition(float speed) {
-		float distance = speed * DisplayManager.getFrameTimeSeconds();
-		float dx = (float) (distance * Math.sin(Math.toRadians(rotation.y)));
-		float dz = (float) (distance * Math.cos(Math.toRadians(rotation.y)));
+	public void generateVelocity(float speed) {
+		velocity.x = (float) (speed * Math.sin(Math.toRadians(rotation.y)));
+		velocity.z = (float) (speed * Math.cos(Math.toRadians(rotation.y)));
 		velocity.y += Physics.GRAVITY * DisplayManager.getFrameTimeSeconds();
-		this.increasePosition(new Vector3f(dx, velocity.y * DisplayManager.getFrameTimeSeconds(), dz));
-		
-		Terrain currentTerrain = terrain.getTerrainByWorldPos(this.getPosition().x, this.getPosition().z);
-		
-		float terrainHeight = 0;
-		if (currentTerrain != null) {
-			terrainHeight = currentTerrain.getHeightOfTerrain(this.getPosition().x, this.getPosition().z);
-		}
-		
-		if (position.y < terrainHeight) {
-			velocity.y = 0;
-			position.y = terrainHeight;
-		}
 	}
 	
 	public void increaseRotation(Vector3f deltaRotation) {
@@ -76,6 +57,17 @@ public class Entity3D implements IPositionable {
 	}
 	
 	public void update() {
+		Vector3f.add(position, (Vector3f) new Vector3f(velocity).scale(DisplayManager.getFrameTimeSeconds()), position);
+		
+		float terrainHeight = terrain.getTerrainHeightByWorldPos(position.x, position.z);
+		
+		if (position.y < terrainHeight) {
+			velocity.y = 0;
+			position.y = terrainHeight;
+		}
+		
+		source.setPosition(this.position);
+		source.setVelocity(this.velocity);
 		this.boundingBox.updatePosition(this.position);
 		if (model instanceof AnimatedModel)
 			((AnimatedModel) model).update();
@@ -119,7 +111,8 @@ public class Entity3D implements IPositionable {
 	
 	@Override
 	public boolean equals(Object obj) {
-		if (obj == null) return false;
+		if (obj == null)
+			return false;
 		if (obj instanceof Entity3D) {
 			return this.id == ((Entity3D) obj).id;
 		}

+ 6 - 13
src/main/java/eu/tankernn/gameEngine/entities/Player.java

@@ -17,27 +17,24 @@ public class Player extends Entity3D {
 	protected static final float TURN_MAX = 160;
 	private static final float JUMP_POWER = 30;
 	
-	protected TerrainPack terrainPack;
-	
 	protected float currentSpeed = 0;
 	protected float currentTurnSpeed = 0;
 	
-	private float height = 2.0f;
-	
 	public Player(TexturedModel model, Vector3f position, Vector3f rotation, float scale, AABB boundingBox, TerrainPack terrainPack) {
 		super(model, position, rotation, scale, boundingBox, terrainPack);
-		this.terrainPack = terrainPack;
 	}
 	
 	public void move() {
 		checkInputs();
 		super.increaseRotation(new Vector3f(0, currentTurnSpeed * DisplayManager.getFrameTimeSeconds(), 0));
-		super.increasePosition(currentSpeed);
+		super.generateVelocity(currentSpeed);
 	}
 	
 	private void jump() {
 		if (!this.isInAir()) {
 			this.velocity.y = JUMP_POWER;
+			
+			// source.play(jumpSoundBuffer);
 		}
 	}
 	
@@ -72,19 +69,15 @@ public class Player extends Entity3D {
 	}
 	
 	public boolean isInAir() {
-		return this.position.y > this.terrainPack.getTerrainHeightByWorldPos(this.position.x, this.position.z);
+		return this.position.y > terrain.getTerrainHeightByWorldPos(this.position.x, this.position.z);
 	}
 	
 	public float getHeight() {
-		return height;
-	}
-	
-	public void setHeight(float height) {
-		this.height = height;
+		return getBoundingBox().getSize().y;
 	}
 	
 	public Terrain getCurrentTerrain() {
-		return terrainPack.getTerrainByWorldPos(this.getPosition().x, this.getPosition().z);
+		return terrain.getTerrainByWorldPos(this.getPosition().x, this.getPosition().z);
 	}
 	
 	public Vector3f get2dRotation() {

+ 13 - 0
src/main/java/eu/tankernn/gameEngine/entities/npc/Behavior.java

@@ -0,0 +1,13 @@
+package eu.tankernn.gameEngine.entities.npc;
+
+import eu.tankernn.gameEngine.entities.Entity3D;
+
+public abstract class Behavior {
+	protected Entity3D entity;
+	
+	public abstract void update();
+	
+	public void setEntity(Entity3D entity) {
+		this.entity = entity;
+	}
+}

+ 9 - 24
src/main/java/eu/tankernn/gameEngine/entities/npc/NPC.java

@@ -1,12 +1,13 @@
 package eu.tankernn.gameEngine.entities.npc;
 
-import org.lwjgl.util.vector.Vector2f;
+import java.util.Arrays;
+import java.util.List;
+
 import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.entities.Entity3D;
 import eu.tankernn.gameEngine.loader.models.AABB;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
-import eu.tankernn.gameEngine.renderEngine.DisplayManager;
 import eu.tankernn.gameEngine.terrains.TerrainPack;
 
 public class NPC extends Entity3D {
@@ -14,16 +15,13 @@ public class NPC extends Entity3D {
 	private int health;
 	private final int maxHealth;
 	
-	// Roaming stuff, should probable be a component or something
-	private Vector2f targetPosition;
-	private RoamingArea area;
-	private float standbyTime, speed;
+	private List<Behavior> behaviors;
 	
-	public NPC(TexturedModel model, Vector3f position, int health, AABB boundingBox, RoamingArea area, float speed, TerrainPack terrainPack) {
+	public NPC(TexturedModel model, Vector3f position, int health, AABB boundingBox, TerrainPack terrainPack, Behavior... behaviors) {
 		super(model, position, boundingBox, terrainPack);
-		this.area = area;
-		this.speed = speed;
 		this.health = this.maxHealth = health;
+		this.behaviors = Arrays.asList(behaviors);
+		this.behaviors.forEach(b -> b.setEntity(this));
 	}
 	
 	@Override
@@ -31,21 +29,8 @@ public class NPC extends Entity3D {
 		if (this.health <= 0)
 			this.dead = true;
 		
-		// Roaming stuff, should probable be a component or something
-		if (targetPosition == null) {
-			if (standbyTime > 0f)
-				standbyTime -= DisplayManager.getFrameTimeSeconds();
-			else
-				targetPosition = area.getPointInside();
-		} else {
-			Vector2f direction = (Vector2f) Vector2f.sub(targetPosition, new Vector2f(getPosition().x, getPosition().z), null);
-			if (direction.length() < 1f) { // Reached target
-				targetPosition = null;
-				standbyTime = (float) (Math.random() * 5);
-			}
-			this.getRotation().y = (float) Math.toDegrees(Math.atan2(direction.x, direction.y));
-			super.increasePosition(speed);
-		}
+		behaviors.forEach(Behavior::update);
+		
 		super.update();
 	}
 	

+ 36 - 0
src/main/java/eu/tankernn/gameEngine/entities/npc/RoamingBehavior.java

@@ -0,0 +1,36 @@
+package eu.tankernn.gameEngine.entities.npc;
+
+import org.lwjgl.util.vector.Vector2f;
+
+import eu.tankernn.gameEngine.renderEngine.DisplayManager;
+
+public class RoamingBehavior extends Behavior {
+	
+	private Vector2f targetPosition;
+	private RoamingArea area;
+	private float standbyTime, speed;
+	
+	public RoamingBehavior(RoamingArea area, float speed) {
+		this.area = area;
+		this.speed = speed;
+	}
+	
+	@Override
+	public void update() {
+		if (targetPosition == null) {
+			if (standbyTime > 0f)
+				standbyTime -= DisplayManager.getFrameTimeSeconds();
+			else
+				targetPosition = area.getPointInside();
+		} else {
+			Vector2f direction = (Vector2f) Vector2f.sub(targetPosition, new Vector2f(entity.getPosition().x, entity.getPosition().z), null);
+			if (direction.length() < 1f) { // Reached target
+				targetPosition = null;
+				standbyTime = (float) (Math.random() * 5);
+			}
+			entity.getRotation().y = (float) Math.toDegrees(Math.atan2(direction.x, direction.y));
+			entity.generateVelocity(speed);
+		}
+	}
+	
+}

+ 1 - 3
src/main/java/eu/tankernn/gameEngine/entities/projectiles/Projectile.java

@@ -8,7 +8,6 @@ import eu.tankernn.gameEngine.entities.Entity3D;
 import eu.tankernn.gameEngine.loader.models.AABB;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
 import eu.tankernn.gameEngine.particles.ParticleSystem;
-import eu.tankernn.gameEngine.renderEngine.DisplayManager;
 import eu.tankernn.gameEngine.terrains.TerrainPack;
 
 public abstract class Projectile extends Entity3D {
@@ -26,7 +25,7 @@ public abstract class Projectile extends Entity3D {
 	}
 	
 	public void update() {
-		this.increasePosition((Vector3f) new Vector3f(velocity).scale(DisplayManager.getFrameTimeSeconds()));
+		super.update();
 		particleSystem.setPosition(this.getPosition());
 		
 		if (this.terrain != null) {
@@ -37,7 +36,6 @@ public abstract class Projectile extends Entity3D {
 		if (distance.length() > range) {
 			kill();
 		}
-		super.update();
 	}
 	
 	public void checkCollision(List<Entity3D> entities) {

+ 4 - 0
src/main/java/eu/tankernn/gameEngine/loader/models/AABB.java

@@ -89,6 +89,10 @@ public class AABB {
 		return Vector3f.add(position, relativeMiddlePos, null);
 	}
 	
+	public Vector3f getSize() {
+		return (Vector3f) new Vector3f(halfSize).scale(2);
+	}
+	
 	public AABB copy() {
 		return new AABB(new Vector3f(this.relativeMiddlePos), new Vector3f(this.halfSize));
 	}