com.gamejolt.mikykr5.ceidecpong.ecs.entities.PongEntityInitializer.java Source code

Java tutorial

Introduction

Here is the source code for com.gamejolt.mikykr5.ceidecpong.ecs.entities.PongEntityInitializer.java

Source

/*
 * 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.ceidecpong.ecs.entities;

import com.badlogic.ashley.core.Entity;
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.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.gamejolt.mikykr5.ceidecpong.ProjectConstants;
import com.gamejolt.mikykr5.ceidecpong.ecs.components.BoundingBoxComponent;
import com.gamejolt.mikykr5.ceidecpong.ecs.components.Mappers;
import com.gamejolt.mikykr5.ceidecpong.ecs.components.PlayerComponent;
import com.gamejolt.mikykr5.ceidecpong.ecs.components.PositionComponent;
import com.gamejolt.mikykr5.ceidecpong.ecs.components.ScoreComponent;
import com.gamejolt.mikykr5.ceidecpong.ecs.components.SoundComponent;
import com.gamejolt.mikykr5.ceidecpong.ecs.components.SpriteComponent;
import com.gamejolt.mikykr5.ceidecpong.ecs.components.VelocityComponent;
import com.gamejolt.mikykr5.ceidecpong.utils.AsyncAssetLoader;
import com.gamejolt.mikykr5.ceidecpong.utils.managers.CachedSoundManager;

/**
 * A concrete implementation of a {@link EntityInitializerBase} that creates all the entities
 * needed by the Pong game.
 * 
 * @author Miguel Astor
 */
public class PongEntityInitializer extends EntityInitializerBase {
    /**
     * An assets loader instance.
     */
    private AsyncAssetLoader loader;

    /**
     * An entity that plays a sound when the user scores.
     */
    private Entity victorySound;

    /**
     * An entity that plays a sound when the computer scores.
     */
    private Entity defeatSound;

    /**
     * An entity that represents the ball in the game.
     */
    private Entity ball;

    /**
     * An entity that represents the human player.
     */
    private Entity paddleUser;

    /**
     * An entity that represents the computer player.
     */
    private Entity paddleComp;

    /**
     * An entity that is used to render the background.
     */
    private Entity background;

    /**
     * Flag that indicates that all entities have been created.
     */
    private boolean entitiesCreated;

    /**
     * Flag that indicates that all assets associated to entities have been loaded.
     */
    private boolean assetsLoaded;

    /**
     * Create the initializer and set the flags to false.
     */
    public PongEntityInitializer() {
        entitiesCreated = false;
        assetsLoaded = false;
    }

    @Override
    public void createAllEntities(PooledEngine engine) {
        // Get instances of the needed asset loaders.
        loader = AsyncAssetLoader.getInstance();
        CachedSoundManager soundManager = CachedSoundManager.getInstance();

        // Load all textures and sound effects.
        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");

        // Create the entities related to the sound effects.
        victorySound = engine.createEntity();
        victorySound.add(engine.createComponent(SoundComponent.class));
        defeatSound = engine.createEntity();
        defeatSound.add(engine.createComponent(SoundComponent.class));

        // Create the background.
        background = engine.createEntity();
        background.add(engine.createComponent(PositionComponent.class));
        background.add(engine.createComponent(SpriteComponent.class));

        // Create the ball.
        ball = engine.createEntity();
        ball.add(engine.createComponent(PositionComponent.class));
        ball.add(engine.createComponent(VelocityComponent.class));
        ball.add(engine.createComponent(SpriteComponent.class));
        ball.add(engine.createComponent(BoundingBoxComponent.class));
        ball.add(engine.createComponent(SoundComponent.class));

        // Create the human player.
        paddleUser = engine.createEntity();
        paddleUser.add(engine.createComponent(PositionComponent.class));
        paddleUser.add(engine.createComponent(VelocityComponent.class));
        paddleUser.add(engine.createComponent(SpriteComponent.class));
        paddleUser.add(engine.createComponent(BoundingBoxComponent.class));
        paddleUser.add(engine.createComponent(ScoreComponent.class));
        paddleUser.add(engine.createComponent(PlayerComponent.class));

        // Create the computer player.
        paddleComp = engine.createEntity();
        paddleComp.add(engine.createComponent(PositionComponent.class));
        paddleComp.add(engine.createComponent(VelocityComponent.class));
        paddleComp.add(engine.createComponent(SpriteComponent.class));
        paddleComp.add(engine.createComponent(BoundingBoxComponent.class));
        paddleComp.add(engine.createComponent(ScoreComponent.class));
        paddleComp.add(engine.createComponent(PlayerComponent.class));

        // Register all entities.
        engine.addEntity(victorySound);
        engine.addEntity(defeatSound);
        engine.addEntity(background);
        engine.addEntity(ball);
        engine.addEntity(paddleUser);
        engine.addEntity(paddleComp);

        // Mark the flag.
        entitiesCreated = true;
    }

    @Override
    public void setLoadableAssets(PooledEngine engine) throws IllegalStateException {
        if (!entitiesCreated)
            throw new IllegalStateException("Entities have not been created before setting assets.");

        // Some variables used to initialize the ball.
        Vector2 randomVector = new Vector2().set(Vector2.X).setAngle(MathUtils.random(-60, 60));
        int randomSign = MathUtils.random(-1, 1) >= 0 ? 1 : -1;

        // Fetch the assets.
        TextureAtlas atlas = loader.getAsset("data/gfx/textures/pong_atlas.atlas", TextureAtlas.class);
        Texture bckg = loader.getAsset("data/gfx/textures/bckg.png", Texture.class);

        // Add the sound effects to the entities.
        Mappers.soundMapper.get(victorySound).path = "data/sfx/oh_yeah_wav_cut.ogg";
        Mappers.soundMapper.get(defeatSound).path = "data/sfx/atari_boom.ogg";

        // Set up the background.
        Mappers.spriteMapper.get(background).sprite = new Sprite(bckg);
        Mappers.positionMapper.get(background).setXY(-(ProjectConstants.FB_WIDTH / 2.0f),
                -(ProjectConstants.FB_HEIGHT / 2.0f));

        // Set up the 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.velocityMapper.get(ball).setXY(randomVector.x * 475.0f * randomSign,
                randomVector.y * 475.0f * randomSign);
        Mappers.bboxMapper.get(ball).bbox.set(Mappers.spriteMapper.get(ball).sprite.getBoundingRectangle());
        Mappers.soundMapper.get(ball).path = "data/sfx/BounceYoFrankie.ogg";

        // Set up the human player.
        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.bboxMapper.get(paddleUser).bbox
                .set(Mappers.spriteMapper.get(paddleUser).sprite.getBoundingRectangle());
        Mappers.playerMapper.get(paddleUser).id = PlayerComponent.HUMAN_PLAYER;

        // Set up the computer player.
        Mappers.spriteMapper.get(paddleComp).sprite = atlas.createSprite("paddle");
        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.playerMapper.get(paddleComp).id = PlayerComponent.COMPUTER_PLAYER;

        // Release the assets loader instance and mark the flag.
        AsyncAssetLoader.freeInstance();
        assetsLoaded = true;
    }

    @Override
    public void dispose() throws IllegalStateException {
        if (!entitiesCreated)
            throw new IllegalStateException("Entities have not been created before disposing assets.");

        if (!assetsLoaded)
            throw new IllegalStateException("Assets have not been loaded before disposing.");

        // Release the sound manager instance.
        CachedSoundManager.freeInstance();
    }
}