La dernière grande étape consiste à ajouter des monstres qui rendront le jeu plus difficile et amusant.
Nous allons maintenant ajouter une nouvelle entitée. Pour cela nous devrons effectuer les changements suivants en ajoutant la classe Goomba
avec son graphisme et ses données:
entities/
, dans un fichier goomba.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<entity name="goomba" surface="goomba.png">
<frames horizontal="3" vertical="1"/>
<size width="16" height="16"/>
<data movementSpeed="0.75" jumpSpeed="9.0" mass="2.5"/>
<collision name="default" offsetX="0" offsetY="0" width="12" height="15" mirror="false"/>
<animation name="idle" start="1" end="1" step="1" speed="0.125" reversed="false" repeat="false"/>
<animation name="turn" start="1" end="1" step="1" speed="0.125" reversed="false" repeat="false"/>
<animation name="walk" start="1" end="2" step="1" speed="0.0625" reversed="false" repeat="true"/>
<animation name="jump" start="1" end="1" step="1" speed="0.125" reversed="false" repeat="false"/>
<animation name="dead" start="3" end="3" step="1" speed="0.125" reversed="false" repeat="false"/>
</entity>
entities/
: Goomba
:
/**
* Goomba implementation.
*
* @author Pierre-Alexandre (contact@b3dgs.com)
*/
public final class Goomba
extends Entity
{
/** Die timer. */
private final Timing timerDie;
/**
* Constructor.
*
* @param setup setup reference.
*/
public Goomba(SetupEntity setup)
{
super(setup);
timerDie = new Timing();
movement.setVelocity(0.3);
movement.setSensibility(0.1);
right = true;
}
/*
* Entity
*/
@Override
public void onHurtBy(EntityGame entity)
{
if (!dead)
{
dead = true;
right = false;
left = false;
movement.reset();
timerDie.start();
}
}
@Override
public void onHitThat(Entity entity)
{
// Nothing to do
}
@Override
protected void handleActions(double extrp)
{
super.handleActions(extrp);
if (dead && timerDie.elapsed(1000))
{
destroy();
}
}
@Override
protected void onHorizontalCollision()
{
// Invert movement in case of collision
if (right)
{
right = false;
left = true;
}
else
{
left = false;
right = true;
}
}
}
EntityType
: GOOMBA(Goomba.class);
.
Et maintenant, ajoutez la classe HandlerEntity
héritant de HandlerEntityPlatform
:
/**
* Handler implementation. All of our entity will be handled here.
*
* @author Pierre-Alexandre (contact@b3dgs.com)
*/
final class HandlerEntity
extends HandlerEntityPlatform<Entity>
{
/** Mario reference. */
private final Entity mario;
/**
* Constructor.
*
* @param camera The camera reference.
* @param mario The mario reference.
*/
HandlerEntity(CameraPlatform camera, Entity mario)
{
super(camera);
this.mario = mario;
}
/*
* HandlerEntityPlatform
*/
@Override
protected boolean canUpdateEntity(Entity entity)
{
return true;
}
@Override
protected void updatingEntity(Entity entity, double extrp)
{
if (!(mario.isDead() || entity.isDead()) && entity.collide(mario))
{
// Mario hit entity if coming from its top
if (mario.isFalling() && mario.getLocationOldY() > entity.getLocationOldY())
{
entity.onHurtBy(mario);
mario.onHitThat(entity);
}
else
{
mario.onHurtBy(entity);
entity.onHitThat(mario);
}
}
}
@Override
protected void renderingEntity(Entity entity, Graphic g, CameraPlatform camera)
{
// Nothing to do
}
}
Et enfin, mettez à jour la classe World
pour créer deux Goomba
:
/**
* World implementation.
*
* @author Pierre-Alexandre (contact@b3dgs.com)
*/
final class World
extends WorldGame
{
/** Background color. */
private static final ColorRgba BACKGROUND_COLOR = new ColorRgba(107, 136, 255);
/** Camera reference. */
private final CameraPlatform camera;
/** Map reference. */
private final Map map;
/** Factory reference. */
private final FactoryEntity factory;
/** Mario reference. */
private final Mario mario;
/** Handler reference. */
private final HandlerEntity handler;
/**
* @see WorldGame#WorldGame(Sequence)
*/
World(Sequence sequence)
{
super(sequence);
camera = new CameraPlatform(width, height);
map = new Map();
factory = new FactoryEntity(map, source.getRate());
mario = factory.create(EntityType.MARIO);
handler = new HandlerEntity(camera, mario);
}
/*
* WorldGame
*/
@Override
public void update(double extrp)
{
mario.updateControl(keyboard);
mario.update(extrp);
handler.update(extrp);
camera.follow(mario);
}
@Override
public void render(Graphic g)
{
g.setColor(World.BACKGROUND_COLOR);
g.drawRect(0, 0, width, height, true);
// Draw the map
map.render(g, camera);
// Draw the mario
mario.render(g, camera);
handler.render(g);
}
@Override
protected void saving(FileWriting file) throws IOException
{
map.save(file);
}
@Override
protected void loading(FileReading file) throws IOException
{
map.load(file);
camera.setLimits(map);
camera.setIntervals(16, 0);
map.adjustCollisions();
mario.respawn();
// Create two goombas
for (int i = 0; i < 2; i++)
{
final Goomba goomba = factory.create(EntityType.GOOMBA);
goomba.setLocation(532 + i * 24, 32);
handler.add(goomba);
}
}
}
Et voilà, Mario peut maintenant interagir avec des Goombas !
Lire la suite: Jeu de Platforme - Son et Musique