Sound effects working.

This commit is contained in:
2014-10-22 12:15:05 -04:30
parent 5c829f5ea7
commit c8f8512fcf
17 changed files with 285 additions and 72 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -20,10 +20,10 @@ import com.badlogic.ashley.core.ComponentMapper;
public abstract class Mappers { public abstract class Mappers {
public static final ComponentMapper<PositionComponent> positionMapper = ComponentMapper.getFor(PositionComponent.class); public static final ComponentMapper<PositionComponent> positionMapper = ComponentMapper.getFor(PositionComponent.class);
public static final ComponentMapper<VelocityComponent> velocityMapper = ComponentMapper.getFor(VelocityComponent.class); public static final ComponentMapper<VelocityComponent> velocityMapper = ComponentMapper.getFor(VelocityComponent.class);
public static final ComponentMapper<SoundEffectComponent> soundEffectMapper = ComponentMapper.getFor(SoundEffectComponent.class);
public static final ComponentMapper<TextureComponent> textureMapper = ComponentMapper.getFor(TextureComponent.class); public static final ComponentMapper<TextureComponent> textureMapper = ComponentMapper.getFor(TextureComponent.class);
public static final ComponentMapper<SpriteComponent> spriteMapper = ComponentMapper.getFor(SpriteComponent.class); public static final ComponentMapper<SpriteComponent> spriteMapper = ComponentMapper.getFor(SpriteComponent.class);
public static final ComponentMapper<BoundingBoxComponent> bboxMapper = ComponentMapper.getFor(BoundingBoxComponent.class); public static final ComponentMapper<BoundingBoxComponent> bboxMapper = ComponentMapper.getFor(BoundingBoxComponent.class);
public static final ComponentMapper<ScoreComponent> scoreMapper = ComponentMapper.getFor(ScoreComponent.class); public static final ComponentMapper<ScoreComponent> scoreMapper = ComponentMapper.getFor(ScoreComponent.class);
public static final ComponentMapper<PlayerComponent> playerMapper = ComponentMapper.getFor(PlayerComponent.class); public static final ComponentMapper<PlayerComponent> playerMapper = ComponentMapper.getFor(PlayerComponent.class);
public static final ComponentMapper<SoundComponent> soundMapper = ComponentMapper.getFor(SoundComponent.class);
} }

View File

@@ -19,6 +19,9 @@ import com.badlogic.ashley.core.Component;
import com.badlogic.gdx.utils.Pool.Poolable; import com.badlogic.gdx.utils.Pool.Poolable;
public class PlayerComponent extends Component implements Poolable { public class PlayerComponent extends Component implements Poolable {
public static int HUMAN_PLAYER = 0;
public static int COMPUTER_PLAYER = 1;
public int id = -1; public int id = -1;
@Override @Override

View File

@@ -0,0 +1,13 @@
package com.gamejolt.mikykr5.poukemon.ecs.components;
import com.badlogic.ashley.core.Component;
import com.badlogic.gdx.utils.Pool.Poolable;
public class SoundComponent extends Component implements Poolable {
public String path = "";
@Override
public void reset() {
this.path = "";
}
}

View File

@@ -1,28 +0,0 @@
/*
* Copyright (c) 2014, Miguel Angel Astor Romero
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Read the LICENSE file for more details.
*/
package com.gamejolt.mikykr5.poukemon.ecs.components;
import com.badlogic.ashley.core.Component;
import com.badlogic.gdx.utils.Pool.Poolable;
public class SoundEffectComponent extends Component implements Poolable {
int soundEffectID = -1;
@Override
public void reset() {
soundEffectID = -1;
}
}

View File

@@ -17,22 +17,31 @@ package com.gamejolt.mikykr5.poukemon.ecs.entities;
import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.PooledEngine; import com.badlogic.ashley.core.PooledEngine;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.gamejolt.mikykr5.poukemon.ProjectConstants; import com.gamejolt.mikykr5.poukemon.ProjectConstants;
import com.gamejolt.mikykr5.poukemon.ecs.components.BoundingBoxComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.BoundingBoxComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.Mappers; import com.gamejolt.mikykr5.poukemon.ecs.components.Mappers;
import com.gamejolt.mikykr5.poukemon.ecs.components.PlayerComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.PlayerComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.PositionComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.PositionComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.ScoreComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.ScoreComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.SoundComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.SpriteComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.SpriteComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.VelocityComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.VelocityComponent;
import com.gamejolt.mikykr5.poukemon.utils.AsyncAssetLoader; import com.gamejolt.mikykr5.poukemon.utils.AsyncAssetLoader;
import com.gamejolt.mikykr5.poukemon.utils.managers.CachedSoundManager;
public class PongEntityInitializer extends EntityInitializerBase { public class PongEntityInitializer extends EntityInitializerBase {
private AsyncAssetLoader loader; private AsyncAssetLoader loader;
private Entity victorySound;
private Entity defeatSound;
private Entity ball; private Entity ball;
private Entity paddleUser; private Entity paddleUser;
private Entity paddleComp; private Entity paddleComp;
private Entity background;
private boolean entitiesCreated; private boolean entitiesCreated;
private boolean assetsLoaded; private boolean assetsLoaded;
@@ -44,17 +53,34 @@ public class PongEntityInitializer extends EntityInitializerBase {
@Override @Override
public void createAllEntities(PooledEngine engine){ public void createAllEntities(PooledEngine engine){
loader = AsyncAssetLoader.getInstance(); loader = AsyncAssetLoader.getInstance();
CachedSoundManager soundManager = CachedSoundManager.getInstance();
loader.addAssetToLoad("data/gfx/textures/pong_atlas.atlas", TextureAtlas.class); loader.addAssetToLoad("data/gfx/textures/pong_atlas.atlas", TextureAtlas.class);
loader.addAssetToLoad("data/gfx/textures/bckg.png", Texture.class);
soundManager.loadSound("data/sfx/BounceYoFrankie.ogg");
soundManager.loadSound("data/sfx/oh_yeah_wav_cut.ogg");
soundManager.loadSound("data/sfx/atari_boom.ogg");
victorySound = engine.createEntity();
victorySound.add(engine.createComponent(SoundComponent.class));
defeatSound = engine.createEntity();
defeatSound.add(engine.createComponent(SoundComponent.class));
background = engine.createEntity();
background.add(engine.createComponent(PositionComponent.class));
background.add(engine.createComponent(SpriteComponent.class));
ball = engine.createEntity(); ball = engine.createEntity();
ball.add(engine.createComponent(PositionComponent.class)); ball.add(engine.createComponent(PositionComponent.class));
ball.add(engine.createComponent(VelocityComponent.class)); ball.add(engine.createComponent(VelocityComponent.class));
ball.add(engine.createComponent(SpriteComponent.class)); ball.add(engine.createComponent(SpriteComponent.class));
ball.add(engine.createComponent(BoundingBoxComponent.class)); ball.add(engine.createComponent(BoundingBoxComponent.class));
ball.add(engine.createComponent(SoundComponent.class));
paddleUser = engine.createEntity(); paddleUser = engine.createEntity();
paddleUser.add(engine.createComponent(PositionComponent.class)); paddleUser.add(engine.createComponent(PositionComponent.class));
paddleUser.add(engine.createComponent(VelocityComponent.class));
paddleUser.add(engine.createComponent(SpriteComponent.class)); paddleUser.add(engine.createComponent(SpriteComponent.class));
paddleUser.add(engine.createComponent(BoundingBoxComponent.class)); paddleUser.add(engine.createComponent(BoundingBoxComponent.class));
paddleUser.add(engine.createComponent(ScoreComponent.class)); paddleUser.add(engine.createComponent(ScoreComponent.class));
@@ -68,6 +94,9 @@ public class PongEntityInitializer extends EntityInitializerBase {
paddleComp.add(engine.createComponent(ScoreComponent.class)); paddleComp.add(engine.createComponent(ScoreComponent.class));
paddleComp.add(engine.createComponent(PlayerComponent.class)); paddleComp.add(engine.createComponent(PlayerComponent.class));
engine.addEntity(victorySound);
engine.addEntity(defeatSound);
engine.addEntity(background);
engine.addEntity(ball); engine.addEntity(ball);
engine.addEntity(paddleUser); engine.addEntity(paddleUser);
engine.addEntity(paddleComp); engine.addEntity(paddleComp);
@@ -80,22 +109,31 @@ public class PongEntityInitializer extends EntityInitializerBase {
if(!entitiesCreated) if(!entitiesCreated)
throw new IllegalStateException("Entities have not been created before setting assets."); throw new IllegalStateException("Entities have not been created before setting assets.");
Vector2 randomVector = new Vector2().set(Vector2.X).setAngle(MathUtils.random(0, 360));
TextureAtlas atlas = loader.getAsset("data/gfx/textures/pong_atlas.atlas", TextureAtlas.class); TextureAtlas atlas = loader.getAsset("data/gfx/textures/pong_atlas.atlas", TextureAtlas.class);
Texture bckg = loader.getAsset("data/gfx/textures/bckg.png", Texture.class);
Mappers.soundMapper.get(victorySound).path = "data/sfx/oh_yeah_wav_cut.ogg";
Mappers.soundMapper.get(defeatSound).path = "data/sfx/atari_boom.ogg";
Mappers.spriteMapper.get(background).sprite = new Sprite(bckg);
Mappers.positionMapper.get(background).setXY(-(ProjectConstants.FB_WIDTH / 2.0f), -(ProjectConstants.FB_HEIGHT / 2.0f));
Mappers.spriteMapper.get(ball).sprite = atlas.createSprite("ball"); Mappers.spriteMapper.get(ball).sprite = atlas.createSprite("ball");
Mappers.positionMapper.get(ball).setXY(-(Mappers.spriteMapper.get(ball).sprite.getWidth() / 2), -(Mappers.spriteMapper.get(ball).sprite.getHeight() / 2)); Mappers.positionMapper.get(ball).setXY(-(Mappers.spriteMapper.get(ball).sprite.getWidth() / 2), -(Mappers.spriteMapper.get(ball).sprite.getHeight() / 2));
Mappers.velocityMapper.get(ball).setXY(173, -475); Mappers.velocityMapper.get(ball).setXY(randomVector.x * 475.0f, randomVector.y * 475.0f);
Mappers.bboxMapper.get(ball).bbox.set(Mappers.spriteMapper.get(ball).sprite.getBoundingRectangle()); Mappers.bboxMapper.get(ball).bbox.set(Mappers.spriteMapper.get(ball).sprite.getBoundingRectangle());
Mappers.soundMapper.get(ball).path = "data/sfx/BounceYoFrankie.ogg";
Mappers.spriteMapper.get(paddleUser).sprite = atlas.createSprite("glasspaddle2"); Mappers.spriteMapper.get(paddleUser).sprite = atlas.createSprite("glasspaddle2");
Mappers.positionMapper.get(paddleUser).setXY(-(ProjectConstants.FB_WIDTH / 2) + 100, -(Mappers.spriteMapper.get(paddleUser).sprite.getHeight() / 2)); Mappers.positionMapper.get(paddleUser).setXY(-(ProjectConstants.FB_WIDTH / 2) + 100, -(Mappers.spriteMapper.get(paddleUser).sprite.getHeight() / 2));
Mappers.bboxMapper.get(paddleUser).bbox.set(Mappers.spriteMapper.get(paddleUser).sprite.getBoundingRectangle()); Mappers.bboxMapper.get(paddleUser).bbox.set(Mappers.spriteMapper.get(paddleUser).sprite.getBoundingRectangle());
Mappers.playerMapper.get(paddleUser).id = 0; Mappers.playerMapper.get(paddleUser).id = PlayerComponent.HUMAN_PLAYER;
Mappers.spriteMapper.get(paddleComp).sprite = atlas.createSprite("paddle"); Mappers.spriteMapper.get(paddleComp).sprite = atlas.createSprite("paddle");
Mappers.positionMapper.get(paddleComp).setXY(((ProjectConstants.FB_WIDTH / 2) - 1) - 100, -(Mappers.spriteMapper.get(paddleComp).sprite.getHeight() / 2)); Mappers.positionMapper.get(paddleComp).setXY(((ProjectConstants.FB_WIDTH / 2) - 1) - 100 - Mappers.spriteMapper.get(paddleComp).sprite.getWidth(), -(Mappers.spriteMapper.get(paddleComp).sprite.getHeight() / 2));
Mappers.bboxMapper.get(paddleComp).bbox.set(Mappers.spriteMapper.get(paddleComp).sprite.getBoundingRectangle()); Mappers.bboxMapper.get(paddleComp).bbox.set(Mappers.spriteMapper.get(paddleComp).sprite.getBoundingRectangle());
Mappers.playerMapper.get(paddleComp).id = 1; Mappers.playerMapper.get(paddleComp).id = PlayerComponent.COMPUTER_PLAYER;
AsyncAssetLoader.freeInstance(); AsyncAssetLoader.freeInstance();
assetsLoaded = true; assetsLoaded = true;
@@ -108,5 +146,7 @@ public class PongEntityInitializer extends EntityInitializerBase {
if(!assetsLoaded) if(!assetsLoaded)
throw new IllegalStateException("Assets have not been loaded before disposing."); throw new IllegalStateException("Assets have not been loaded before disposing.");
CachedSoundManager.freeInstance();
} }
} }

View File

@@ -15,15 +15,20 @@
*/ */
package com.gamejolt.mikykr5.poukemon.ecs.systems; package com.gamejolt.mikykr5.poukemon.ecs.systems;
import com.badlogic.ashley.core.ComponentType;
import com.badlogic.ashley.core.Engine; import com.badlogic.ashley.core.Engine;
import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family; import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem; import com.badlogic.ashley.systems.IteratingSystem;
import com.badlogic.ashley.utils.ImmutableArray; import com.badlogic.ashley.utils.ImmutableArray;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.gamejolt.mikykr5.poukemon.ProjectConstants; import com.gamejolt.mikykr5.poukemon.ProjectConstants;
import com.gamejolt.mikykr5.poukemon.ecs.components.BoundingBoxComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.BoundingBoxComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.Mappers; import com.gamejolt.mikykr5.poukemon.ecs.components.Mappers;
import com.gamejolt.mikykr5.poukemon.ecs.components.PlayerComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.PositionComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.PositionComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.SoundComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.SpriteComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.SpriteComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.VelocityComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.VelocityComponent;
@@ -33,10 +38,12 @@ public class CollisionDetectionSystem extends IteratingSystem {
private final float screenRightBorder; private final float screenRightBorder;
private final float screenTopBorder; private final float screenTopBorder;
private final float screenBottomBorder; private final float screenBottomBorder;
private final Vector2 randomVector = new Vector2();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public CollisionDetectionSystem(Engine engine){ public CollisionDetectionSystem(Engine engine){
super(Family.getFor(PositionComponent.class, BoundingBoxComponent.class, VelocityComponent.class)); //super(Family.getFor(PositionComponent.class, BoundingBoxComponent.class, VelocityComponent.class));
super(Family.getFor(ComponentType.getBitsFor(PositionComponent.class, BoundingBoxComponent.class, VelocityComponent.class), ComponentType.getBitsFor(), ComponentType.getBitsFor(PlayerComponent.class)));
collidables = engine.getEntitiesFor(Family.getFor(BoundingBoxComponent.class)); collidables = engine.getEntitiesFor(Family.getFor(BoundingBoxComponent.class));
screenLeftBorder = -((float)ProjectConstants.FB_WIDTH / 2.0f); screenLeftBorder = -((float)ProjectConstants.FB_WIDTH / 2.0f);
@@ -51,6 +58,7 @@ public class CollisionDetectionSystem extends IteratingSystem {
PositionComponent position = Mappers.positionMapper.get(entity); PositionComponent position = Mappers.positionMapper.get(entity);
BoundingBoxComponent bounds = Mappers.bboxMapper.get(entity); BoundingBoxComponent bounds = Mappers.bboxMapper.get(entity);
VelocityComponent velocity = Mappers.velocityMapper.get(entity); VelocityComponent velocity = Mappers.velocityMapper.get(entity);
SoundComponent sound = Mappers.soundMapper.get(entity);
// Check if this entity is within the screen. // Check if this entity is within the screen.
// If the entity collides with any of the borders then bounce or score as needed. // If the entity collides with any of the borders then bounce or score as needed.
@@ -62,6 +70,10 @@ public class CollisionDetectionSystem extends IteratingSystem {
message = new InterSystemMessage(ScoringSystem.class.getCanonicalName()); message = new InterSystemMessage(ScoringSystem.class.getCanonicalName());
message.data.put("SCORE", 1); message.data.put("SCORE", 1);
InterSystemMessagingQueue.pushMessage(message); InterSystemMessagingQueue.pushMessage(message);
message = new InterSystemMessage(SoundSystem.class.getCanonicalName());
message.data.put("PLAY", "data/sfx/atari_boom.ogg");
InterSystemMessagingQueue.pushMessage(message);
} }
if(position.x + bounds.bbox.getWidth() >= screenRightBorder){ if(position.x + bounds.bbox.getWidth() >= screenRightBorder){
@@ -72,18 +84,32 @@ public class CollisionDetectionSystem extends IteratingSystem {
message = new InterSystemMessage(ScoringSystem.class.getCanonicalName()); message = new InterSystemMessage(ScoringSystem.class.getCanonicalName());
message.data.put("SCORE", 0); message.data.put("SCORE", 0);
InterSystemMessagingQueue.pushMessage(message); InterSystemMessagingQueue.pushMessage(message);
message = new InterSystemMessage(SoundSystem.class.getCanonicalName());
message.data.put("PLAY", "data/sfx/oh_yeah_wav_cut.ogg");
InterSystemMessagingQueue.pushMessage(message);
} }
if(position.y < screenBottomBorder){ if(position.y < screenBottomBorder){
position.y = screenBottomBorder; position.y = screenBottomBorder;
velocity.vy = velocity.vy < 0.0f ? -velocity.vy : velocity.vy; velocity.vy = velocity.vy < 0.0f ? -velocity.vy : velocity.vy;
accelerate(velocity); accelerate(velocity);
if(sound != null){
message = new InterSystemMessage(SoundSystem.class.getCanonicalName());
message.data.put("PLAY", sound.path);
InterSystemMessagingQueue.pushMessage(message);
}
} }
if(position.y + bounds.bbox.getHeight() >= screenTopBorder){ if(position.y + bounds.bbox.getHeight() >= screenTopBorder){
position.y = screenTopBorder - bounds.bbox.getHeight(); position.y = screenTopBorder - bounds.bbox.getHeight();
velocity.vy = velocity.vy > 0.0f ? -velocity.vy : velocity.vy; velocity.vy = velocity.vy > 0.0f ? -velocity.vy : velocity.vy;
accelerate(velocity); accelerate(velocity);
if(sound != null){
message = new InterSystemMessage(SoundSystem.class.getCanonicalName());
message.data.put("PLAY", sound.path);
InterSystemMessagingQueue.pushMessage(message);
}
} }
for(int i = 0; i < collidables.size(); i++){ for(int i = 0; i < collidables.size(); i++){
@@ -108,7 +134,8 @@ public class CollisionDetectionSystem extends IteratingSystem {
SpriteComponent sprite = Mappers.spriteMapper.get(entity); SpriteComponent sprite = Mappers.spriteMapper.get(entity);
VelocityComponent velocity = Mappers.velocityMapper.get(entity); VelocityComponent velocity = Mappers.velocityMapper.get(entity);
velocity.setXY(173, -475); randomVector.set(Vector2.X).setAngle(MathUtils.random(0, 360));
velocity.setXY(randomVector.x * -475, randomVector.y * 475);
if(position != null){ if(position != null){
if(sprite != null){ if(sprite != null){

View File

@@ -18,15 +18,23 @@ package com.gamejolt.mikykr5.poukemon.ecs.systems;
import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family; import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem; import com.badlogic.ashley.systems.IteratingSystem;
import com.gamejolt.mikykr5.poukemon.ProjectConstants;
import com.gamejolt.mikykr5.poukemon.ecs.components.BoundingBoxComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.Mappers; import com.gamejolt.mikykr5.poukemon.ecs.components.Mappers;
import com.gamejolt.mikykr5.poukemon.ecs.components.PlayerComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.PlayerComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.PositionComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.PositionComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.VelocityComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.VelocityComponent;
public class ComputerPlayerPositioningSystem extends IteratingSystem { public class ComputerPlayerPositioningSystem extends IteratingSystem {
private final float screenTopBorder;
private final float screenBottomBorder;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public ComputerPlayerPositioningSystem() { public ComputerPlayerPositioningSystem() {
super(Family.getFor(PlayerComponent.class, VelocityComponent.class, PositionComponent.class)); super(Family.getFor(PlayerComponent.class, VelocityComponent.class, PositionComponent.class, BoundingBoxComponent.class));
screenTopBorder = ((float)ProjectConstants.FB_HEIGHT / 2.0f) - 1.0f;
screenBottomBorder = -((float)ProjectConstants.FB_HEIGHT / 2.0f);
} }
@Override @Override
@@ -35,19 +43,26 @@ public class ComputerPlayerPositioningSystem extends IteratingSystem {
VelocityComponent velocity = Mappers.velocityMapper.get(entity); VelocityComponent velocity = Mappers.velocityMapper.get(entity);
PositionComponent position = Mappers.positionMapper.get(entity); PositionComponent position = Mappers.positionMapper.get(entity);
PlayerComponent player = Mappers.playerMapper.get(entity); PlayerComponent player = Mappers.playerMapper.get(entity);
BoundingBoxComponent bounds = Mappers.bboxMapper.get(entity);
if(player.id == 1){ if(player.id == PlayerComponent.COMPUTER_PLAYER){
while((message = InterSystemMessagingQueue.popMessage(ComputerPlayerPositioningSystem.class.getCanonicalName())) != null){ while((message = InterSystemMessagingQueue.popMessage(ComputerPlayerPositioningSystem.class.getCanonicalName())) != null){
float ballY; float ballY;
if(message.data.containsKey("BALL_Y")){ if(message.data.containsKey("BALL_Y")){
ballY = (Float) message.data.get("BALL_Y"); ballY = (Float) message.data.get("BALL_Y");
if(ballY > position.y){ if(ballY > position.y + (bounds.bbox.height / 2.0f)){
velocity.vy = 550.0f; velocity.vy = 550.0f;
}else if (ballY < position.y){ }else if (ballY < position.y + (bounds.bbox.height / 2.0f)){
velocity.vy = -550.0f; velocity.vy = -550.0f;
} }
if(position.y < screenBottomBorder)
position.y = screenBottomBorder;
if(position.y + bounds.bbox.getHeight() >= screenTopBorder)
position.y = screenTopBorder - bounds.bbox.getHeight();
} }
} }
} }

View File

@@ -18,14 +18,22 @@ package com.gamejolt.mikykr5.poukemon.ecs.systems;
import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family; import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem; import com.badlogic.ashley.systems.IteratingSystem;
import com.gamejolt.mikykr5.poukemon.ProjectConstants;
import com.gamejolt.mikykr5.poukemon.ecs.components.BoundingBoxComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.Mappers; import com.gamejolt.mikykr5.poukemon.ecs.components.Mappers;
import com.gamejolt.mikykr5.poukemon.ecs.components.PlayerComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.PlayerComponent;
import com.gamejolt.mikykr5.poukemon.ecs.components.PositionComponent; import com.gamejolt.mikykr5.poukemon.ecs.components.PositionComponent;
public class HumanPlayerPositioningSystem extends IteratingSystem { public class HumanPlayerPositioningSystem extends IteratingSystem {
private final float screenTopBorder;
private final float screenBottomBorder;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public HumanPlayerPositioningSystem() { public HumanPlayerPositioningSystem() {
super(Family.getFor(PlayerComponent.class, PositionComponent.class)); super(Family.getFor(PlayerComponent.class, PositionComponent.class, BoundingBoxComponent.class));
screenTopBorder = ((float)ProjectConstants.FB_HEIGHT / 2.0f) - 1.0f;
screenBottomBorder = -((float)ProjectConstants.FB_HEIGHT / 2.0f);
} }
@Override @Override
@@ -33,14 +41,21 @@ public class HumanPlayerPositioningSystem extends IteratingSystem {
InterSystemMessage message; InterSystemMessage message;
PositionComponent position = Mappers.positionMapper.get(entity); PositionComponent position = Mappers.positionMapper.get(entity);
PlayerComponent player = Mappers.playerMapper.get(entity); PlayerComponent player = Mappers.playerMapper.get(entity);
BoundingBoxComponent bounds = Mappers.bboxMapper.get(entity);
if(player.id == 0){ if(player.id == PlayerComponent.HUMAN_PLAYER){
while((message = InterSystemMessagingQueue.popMessage(HumanPlayerPositioningSystem.class.getCanonicalName())) != null){ while((message = InterSystemMessagingQueue.popMessage(HumanPlayerPositioningSystem.class.getCanonicalName())) != null){
float playerY; float playerY;
if(message.data.containsKey("INPUT_Y")){ if(message.data.containsKey("INPUT_Y")){
playerY = (Float) message.data.get("INPUT_Y"); playerY = (Float) message.data.get("INPUT_Y");
position.y = playerY; position.y = playerY;
if(position.y < screenBottomBorder)
position.y = screenBottomBorder;
if(position.y + bounds.bbox.getHeight() >= screenTopBorder)
position.y = screenTopBorder - bounds.bbox.getHeight();
} }
} }
} }

View File

@@ -15,6 +15,9 @@
*/ */
package com.gamejolt.mikykr5.poukemon.ecs.systems; package com.gamejolt.mikykr5.poukemon.ecs.systems;
import java.util.LinkedList;
import java.util.Queue;
import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family; import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem; import com.badlogic.ashley.systems.IteratingSystem;
@@ -31,6 +34,7 @@ import com.gamejolt.mikykr5.poukemon.utils.managers.CachedFontManager;
public class ScoringSystem extends IteratingSystem { public class ScoringSystem extends IteratingSystem {
private final SpriteBatch batch; private final SpriteBatch batch;
private BitmapFont font; private BitmapFont font;
private Queue<InterSystemMessage> ignoredMessages;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public ScoringSystem(final SpriteBatch batch){ public ScoringSystem(final SpriteBatch batch){
@@ -38,6 +42,7 @@ public class ScoringSystem extends IteratingSystem {
this.batch = batch; this.batch = batch;
this.font = CachedFontManager.getInstance().loadFont("data/fonts/CRYSTAL-Regular.ttf", 180); this.font = CachedFontManager.getInstance().loadFont("data/fonts/CRYSTAL-Regular.ttf", 180);
CachedFontManager.freeInstance(); CachedFontManager.freeInstance();
ignoredMessages = new LinkedList<InterSystemMessage>();
} }
@Override @Override
@@ -58,14 +63,16 @@ public class ScoringSystem extends IteratingSystem {
if(playerId == player.id){ if(playerId == player.id){
score.score++; score.score++;
}else{ }else{
InterSystemMessagingQueue.pushMessage(message); ignoredMessages.add(message);
break;
} }
} }
} }
for(InterSystemMessage msg : ignoredMessages)
InterSystemMessagingQueue.pushMessage(msg);
ignoredMessages.clear();
bounds = font.getBounds(String.format("%02d", score.score)); bounds = font.getBounds(String.format("%02d", score.score));
y = (ProjectConstants.FB_HEIGHT / 2.0f) - (bounds.height / 2.0f) - 20; y = (ProjectConstants.FB_HEIGHT / 2.0f) - (bounds.height / 2.0f) - 20;
if(player.id == 0){ if(player.id == 0){
x = -(ProjectConstants.FB_WIDTH / 4.0f) - (bounds.width / 2.0f); x = -(ProjectConstants.FB_WIDTH / 4.0f) - (bounds.width / 2.0f);

View File

@@ -0,0 +1,48 @@
package com.gamejolt.mikykr5.poukemon.ecs.systems;
import java.util.LinkedList;
import java.util.Queue;
import com.badlogic.ashley.core.Entity;
import com.badlogic.ashley.core.Family;
import com.badlogic.ashley.systems.IteratingSystem;
import com.badlogic.gdx.audio.Sound;
import com.gamejolt.mikykr5.poukemon.ecs.components.Mappers;
import com.gamejolt.mikykr5.poukemon.ecs.components.SoundComponent;
import com.gamejolt.mikykr5.poukemon.utils.managers.CachedSoundManager;
public class SoundSystem extends IteratingSystem {
private Queue<InterSystemMessage> ignoredMessages;
@SuppressWarnings("unchecked")
public SoundSystem() {
super(Family.getFor(SoundComponent.class));
ignoredMessages = new LinkedList<InterSystemMessage>();
}
@Override
public void processEntity(Entity entity, float deltaTime) {
InterSystemMessage message;
String path;
Sound sfx;
SoundComponent sound = Mappers.soundMapper.get(entity);
while((message = InterSystemMessagingQueue.popMessage(SoundSystem.class.getCanonicalName())) != null){
if(message.data.containsKey("PLAY")){
path = (String) message.data.get("PLAY");
if(sound.path.compareTo(path) == 0){
sfx = CachedSoundManager.getInstance().loadSound(path);
sfx.play();
CachedSoundManager.freeInstance();
}else{
ignoredMessages.add(message);
}
}
}
for(InterSystemMessage msg : ignoredMessages)
InterSystemMessagingQueue.pushMessage(msg);
ignoredMessages.clear();
}
}

View File

@@ -22,9 +22,8 @@ import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Pixmap.Format; import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.glutils.FrameBuffer; import com.badlogic.gdx.graphics.glutils.FrameBuffer;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3;
import com.gamejolt.mikykr5.poukemon.GameCore; import com.gamejolt.mikykr5.poukemon.GameCore;
import com.gamejolt.mikykr5.poukemon.GameCore.game_states_t; import com.gamejolt.mikykr5.poukemon.GameCore.game_states_t;
import com.gamejolt.mikykr5.poukemon.ProjectConstants; import com.gamejolt.mikykr5.poukemon.ProjectConstants;
@@ -38,6 +37,7 @@ import com.gamejolt.mikykr5.poukemon.ecs.systems.InterSystemMessagingQueue;
import com.gamejolt.mikykr5.poukemon.ecs.systems.PositioningSystem; import com.gamejolt.mikykr5.poukemon.ecs.systems.PositioningSystem;
import com.gamejolt.mikykr5.poukemon.ecs.systems.RenderingSystem; import com.gamejolt.mikykr5.poukemon.ecs.systems.RenderingSystem;
import com.gamejolt.mikykr5.poukemon.ecs.systems.ScoringSystem; import com.gamejolt.mikykr5.poukemon.ecs.systems.ScoringSystem;
import com.gamejolt.mikykr5.poukemon.ecs.systems.SoundSystem;
import com.gamejolt.mikykr5.poukemon.interfaces.AssetsLoadedListener; import com.gamejolt.mikykr5.poukemon.interfaces.AssetsLoadedListener;
public class InGameState extends BaseState implements AssetsLoadedListener{ public class InGameState extends BaseState implements AssetsLoadedListener{
@@ -50,7 +50,6 @@ public class InGameState extends BaseState implements AssetsLoadedListener{
private boolean assetsLoaded; private boolean assetsLoaded;
private OrthographicCamera fbCamera; private OrthographicCamera fbCamera;
private Rectangle fbBounds; private Rectangle fbBounds;
private Vector2 fbWoorldCoords;
public InGameState(final GameCore core) throws IllegalArgumentException{ public InGameState(final GameCore core) throws IllegalArgumentException{
super(core); super(core);
@@ -63,19 +62,19 @@ public class InGameState extends BaseState implements AssetsLoadedListener{
oldRatio = aspectRatio(ProjectConstants.FB_WIDTH, ProjectConstants.FB_HEIGHT); oldRatio = aspectRatio(ProjectConstants.FB_WIDTH, ProjectConstants.FB_HEIGHT);
assetsLoaded = false; assetsLoaded = false;
fbCamera = new OrthographicCamera(ProjectConstants.FB_WIDTH, ProjectConstants.FB_HEIGHT); fbCamera = new OrthographicCamera(ProjectConstants.FB_WIDTH, ProjectConstants.FB_HEIGHT);
fbWoorldCoords = new Vector2();
// Create all entities. // Create all entities.
entityInitializer = new PongEntityInitializer(); entityInitializer = new PongEntityInitializer();
entityInitializer.createAllEntities(engine); entityInitializer.createAllEntities(engine);
// Add systems in the order they will be processed. // Add systems in the order they will be processed.
engine.addSystem(new PositioningSystem());
engine.addSystem(new CollisionDetectionSystem(engine));
engine.addSystem(new HumanPlayerPositioningSystem()); engine.addSystem(new HumanPlayerPositioningSystem());
engine.addSystem(new ComputerPlayerPositioningSystem()); engine.addSystem(new ComputerPlayerPositioningSystem());
engine.addSystem(new ScoringSystem(core.batch)); engine.addSystem(new PositioningSystem());
engine.addSystem(new CollisionDetectionSystem(engine));
engine.addSystem(new SoundSystem());
engine.addSystem(new RenderingSystem(core.batch)); engine.addSystem(new RenderingSystem(core.batch));
engine.addSystem(new ScoringSystem(core.batch));
} }
@Override @Override
@@ -147,7 +146,7 @@ public class InGameState extends BaseState implements AssetsLoadedListener{
if(touchInsideFrameBuffer(screenX, screenY)){ if(touchInsideFrameBuffer(screenX, screenY)){
message = new InterSystemMessage(HumanPlayerPositioningSystem.class.getCanonicalName()); message = new InterSystemMessage(HumanPlayerPositioningSystem.class.getCanonicalName());
message.data.put("INPUT_Y", convertWorldHeightToFrameBufferHeight(touchPointWorldCoords.y)); message.data.put("INPUT_Y", convertWorldYToFrameBufferY(screenY));
InterSystemMessagingQueue.pushMessage(message); InterSystemMessagingQueue.pushMessage(message);
} }
@@ -160,7 +159,7 @@ public class InGameState extends BaseState implements AssetsLoadedListener{
if(touchInsideFrameBuffer(screenX, screenY)){ if(touchInsideFrameBuffer(screenX, screenY)){
message = new InterSystemMessage(HumanPlayerPositioningSystem.class.getCanonicalName()); message = new InterSystemMessage(HumanPlayerPositioningSystem.class.getCanonicalName());
message.data.put("INPUT_Y", convertWorldHeightToFrameBufferHeight(touchPointWorldCoords.y)); message.data.put("INPUT_Y", convertWorldYToFrameBufferY(screenY));
InterSystemMessagingQueue.pushMessage(message); InterSystemMessagingQueue.pushMessage(message);
} }
@@ -188,15 +187,16 @@ public class InGameState extends BaseState implements AssetsLoadedListener{
} }
} }
private float convertWorldHeightToFrameBufferHeight(float height){ private float convertWorldYToFrameBufferY(float y){
float newHeight, oldHeight, b = (float)ProjectConstants.FB_HEIGHT / (float)h; Vector3 vec3 = new Vector3(0, y - Math.abs(fbBounds.y - (-(h/2.0f))), 0);
oldHeight = height + ((ProjectConstants.FB_HEIGHT / 2.0f) - 1.0f); Gdx.app.log("IN_GAME", "Y before: " + Float.toString(vec3.y));
oldHeight /= (float)h;
newHeight = (oldHeight * b) * ProjectConstants.FB_HEIGHT;
newHeight -= ProjectConstants.FB_HEIGHT;
return newHeight; fbCamera.unproject(vec3, 0, 0, w, h / oldRatio);
Gdx.app.log("IN_GAME", "Y after: " + Float.toString(vec3.y));
return vec3.y;
} }
/** /**

View File

@@ -58,13 +58,13 @@ public class CachedFontManager{
} }
public BitmapFont loadFont(String path, int size){ public BitmapFont loadFont(String path, int size){
if(fonts.containsKey(path))
return fonts.get(path);
FreeTypeFontGenerator fontGenerator; FreeTypeFontGenerator fontGenerator;
FreeTypeFontParameter fontParameters; FreeTypeFontParameter fontParameters;
BitmapFont font; BitmapFont font;
if(fonts.containsKey(path))
return fonts.get(path);
fontParameters = new FreeTypeFontParameter(); fontParameters = new FreeTypeFontParameter();
fontParameters.characters = FONT_CHARS; fontParameters.characters = FONT_CHARS;
fontParameters.size = size; fontParameters.size = size;
@@ -72,7 +72,6 @@ public class CachedFontManager{
fontGenerator = new FreeTypeFontGenerator(Gdx.files.internal(path)); fontGenerator = new FreeTypeFontGenerator(Gdx.files.internal(path));
font = fontGenerator.generateFont(fontParameters); font = fontGenerator.generateFont(fontParameters);
fonts.put(path, font); fonts.put(path, font);
fontGenerator.dispose(); fontGenerator.dispose();
@@ -92,7 +91,6 @@ public class CachedFontManager{
for(BitmapFont font : fonts.values()) for(BitmapFont font : fonts.values())
font.dispose(); font.dispose();
fonts.clear(); fonts.clear();
} }
} }

View File

@@ -0,0 +1,75 @@
/*
* Copyright (c) 2014, Miguel Angel Astor Romero
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Read the LICENSE file for more details.
*/
package com.gamejolt.mikykr5.poukemon.utils.managers;
import java.util.HashMap;
import java.util.Map;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Sound;
public class CachedSoundManager {
private Map<String, Sound> sounds;
private CachedSoundManager(){
sounds = new HashMap<String, Sound>();
}
private static final class SingletonHolder{
public static int REF_COUNT = 0;
public static CachedSoundManager INSTANCE;
}
public static CachedSoundManager getInstance(){
if(SingletonHolder.REF_COUNT == 0)
SingletonHolder.INSTANCE = new CachedSoundManager();
SingletonHolder.REF_COUNT++;
return SingletonHolder.INSTANCE;
}
public static void freeInstance(){
SingletonHolder.REF_COUNT--;
if(SingletonHolder.REF_COUNT <= 0){
SingletonHolder.INSTANCE.dispose();
SingletonHolder.INSTANCE = null;
}
}
public Sound loadSound(String path){
if(sounds.containsKey(path))
return sounds.get(path);
Sound s = Gdx.audio.newSound(Gdx.files.internal(path));
sounds.put(path, s);
return s;
}
public void unloadSound(String path){
if(sounds.containsKey(path)){
sounds.get(path).dispose();
sounds.remove(path);
}
}
private void dispose(){
Gdx.app.log("SOUND_MANAGER", "Disposing sounds.");
for(Sound sound : sounds.values())
sound.dispose();
sounds.clear();
}
}