Developing TicToe HTML5/Implementing Server Entities: Difference between revisions
Content deleted Content added
imported>Hendrik Brummermann |
imported>Hendrik Brummermann No edit summary |
||
| (23 intermediate revisions by the same user not shown) | |||
Line 31:
public Entity() {
// default constructor
setRPClass("entity");
}
Line 114 ⟶ 115:
public Gameboard() {
// default constructor
setRPClass("gameboard");
}
Line 218 ⟶ 220:
Again the imports and constructors have been left out.
== Factory ==
The last step is to make our entities known to Marauroa. Therefore we create a new ObjectFactory implementation called net.sf.arianne.tictoe.server.core.TicToeObjectFactory. While this does the same thing as the object factory on the client side, the syntax is a bit different:
<source lang="java">
package net.sf.arianne.tictoe.server.core;
import marauroa.common.game.RPClass;
import marauroa.common.game.RPObject;
import marauroa.server.game.rp.RPObjectFactory;
import net.sf.arianne.tictoe.server.entity.Gameboard;
import net.sf.arianne.tictoe.server.entity.Player;
import net.sf.arianne.tictoe.server.entity.Token;
/**
* Creates concrete objects of entities.
*/
public class TicToeObjectFactory extends RPObjectFactory {
private static RPObjectFactory singleton;
/**
* returns the factory instance (this method is called
* by Marauroa using reflection).
*
* @return RPObjectFactory
*/
public static RPObjectFactory getFactory() {
if (singleton == null) {
singleton = new TicToeObjectFactory();
}
return singleton;
}
@Override
public RPObject transform(final RPObject object) {
final RPClass clazz = object.getRPClass();
if (clazz == null) {
return super.transform(object);
}
final String name = clazz.getName();
if (name.equals("player")) {
return new Player(object);
} else if (name.equals("gameboard")) {
return new Gameboard(object);
} else if (name.equals("token")) {
return new Token(object);
}
return super.transform(object);
}
}
</source>
This is a very simple implementation of the transform method, but as we only have 3 entities, this is okay for now. Complex programs usually replace the if/else-if construct with a registration mechanism.
This new class has to be added to server.ini:
<source lang="ini">
factory_implementation=net.sf.arianne.tictoe.server.core.TicToeObjectFactory
</source>
== Rule Processor ==
The last basic class is the Rule Processor. It will receive all events from Marauroa and act in a game specific manner. We will register it in server.ini as:
<source lang="ini">
ruleprocessor=net.sf.arianne.tictoe.server.core.TicToeRule
</source>
It is a singleton class, and therefore has to implement a get-method for the instance:
<source lang="java">
package net.sf.arianne.tictoe.server.core;
import marauroa.common.game.RPObject;
import marauroa.server.game.rp.IRPRuleProcessor;
import marauroa.server.game.rp.RPRuleProcessorImpl;
import net.sf.arianne.tictoe.server.entity.Entity;
import net.sf.arianne.tictoe.server.entity.Gameboard;
import net.sf.arianne.tictoe.server.entity.Player;
import net.sf.arianne.tictoe.server.entity.Token;
/**
* provides the rules of the game.
*/
public class TicToeRule extends RPRuleProcessorImpl {
private static RPRuleProcessorImpl instance;
/**
* gets the Rule singleton object
*
* @return Rule
*/
public static IRPRuleProcessor get() {
if (instance == null) {
instance = new TicToeRule();
}
return instance;
}
</source>
The constructor of the rule processor is a good place, to define the RPClasses:
<source lang="java">
/**
* creates the rule processor
*/
public TicToeRule() {
Entity.generateRPClass();
Player.generateRPClass();
Gameboard.generateRPClass();
Token.generateRPClass();
}
</source>
We override the method createCharacterObject, to tell Marauroa, that newly created character objects should use the class "Player":
<source lang="java">
/**
* Creates an new character object that will used by createCharacter
*
* @param username the username who owns the account of the character to be added.
* @param character the character to create
* @param template the desired values of the avatar representing the character.
* @return RPObject
*/
@SuppressWarnings("unused")
@Override
protected RPObject createCharacterObject(String username, String character, RPObject template) {
Player player = new Player();
player.setPlayerName(character);
return player;
}
}
</source>
| |||