|
|
3D Spiele Welt - API Documentation- Übersicht - Beispiele - Würfel Beispiel - Würfel Beispiel
Das Würfel-Beispiel implementiert einen einfachen Würfel,
welcher beim Anklicken zufällig seine Farbe ändert. Der Würfel
behält seine Farbe bis der Programmcode des Würfels ausgetauscht oder der Server neu gestartet wird.
Die Farbe des Würfels wird zudem bei allen Benutzern gleich dargestellt.
Download Source Code
Quellcode Beschreibung
Folger Ablauf wird durch das Anklicken des Würfels ausgelöst:
- HotSpot -> onHotSpotActivated()
- Client ruft serverseitige Funktion "changeColor" auf
- Serverobjekt ändert die Eigenschaft colorProperty (ID 1)
- Clientobjekt bekommt die Änderung der Eigenschaft 1 und dessen neuen Wert
- Clientobjekt ändert die Farbe des Würfels auf die neue Farbe
Clientseitige Klasse
Die zuständige Klasse für die clientseitige Darstellung implementiert die Schnittstellen HotSpot
(ermöglicht das anklickbare Objekt) und ObjectPropertyListener (überwacht die Eigenschaften des serverseigen Objekts).
public class WuerfelClientObject extends SimpleCityObject
implements HotSpot, ObjectPropertyListener {
|
Beim Initialisieren des clientseitigen Objekts, werden zuerst die Referenzen
auf die verschiedenen Kontexte und den Logger geholt.
protected void initialize(TransformGroup tg) {
// Get logger instance and contexts
this.LOGGER = this.context.getLogger();
this.interactionContext = this.context.getInteractionContext();
this.appearanceContext = this.context.getAppearanceContext();
|
Damit dieser Würfel die Veränderungen der serverseitigen Eigenschaften mitbekommt, wird
ein ObjectPropertyListener (this) registriert. Nun erhält das Objekt ein Methodenaufruf
(public void onPropertyChanged(int propID, Object newValue)) wenn sich eine Eigenschaft verändert hat.
// Register property listener
this.context.getPropertyContext().
addPropertyListener((ObjectPropertyListener) this);
|
Damit beim Erstellen dieses Objekts sofort die richtige (aktuelle) Farbe dargestellt wird,
wird diese vom PropertyContext ausgelesen (Eigenschaft Farbe => ID 1).
// Get the current color for the box
Color currentColor =
(Color) this.context.getPropertyContext().
getPropertyValue(1, Color.BLACK);
|
Nun wird die eigentliche Repräsentation für Java3D erstellt. Die Box wird mit der Würfelgröße 1 erstellt.
Über den AppearanceContext wird eine einfache Erscheinung (Appearance) erzeugt welche die Farbe repräsentiert.
Danach wird dem Würfel die Möglichkeit (Capability) gegeben seine Erscheinung zu überschreiben.
// Create the box
this.box = new Box(1, 1, 1,
appearanceContext.createAppearanceFromColor(new Color3f(currentColor)));
this.box.setCapability(Box.ALLOW_APPEARANCE_OVERRIDE_WRITE);
this.box.setCapability(Box.ALLOW_APPEARANCE_WRITE);
|
Da die grafische Repräsentation selbst erzeugt wurde (nicht über den Object3DLoaderContext), müssen der Box
bestimmte Eigenschaften (zur Verwaltung der Objekte) übergeben werden. Dies geschieht durch
applyAPIInformation(MyShape3D shape)
// Apply the api information to the graphical representation for the
// world management
this.context.applyAPIInformation(this.box);
|
Nun wird zuletzt der HotSpot registiert (das Objekt selbst), damit das Objekt über die
Methode public void onSpotActivated() die Aktivierung mitbekommt.
// Apply hot spot
this.interactionContext.applyHotSpot(this.box, (HotSpot) this);
tg.addChild(this.box);
}
|
Wird der HotSpot aktiviert (z.B. durch eine Mausklick), wird die onBoxClicked() Methode
aufgerufen. Über den Kontext (ClientObjectContext) kann nun serverseitig die changeColor Funktion aufgerufen werden.
public void onSpotActivated() {
this.onBoxClicked();
}
public void onBoxClicked() {
LOGGER.info("On Box clicked");
try {
this.context.callServerObjectFunction("changeColor", new Object[0]);
} catch (RemoteException e) {
LOGGER.log(Level.SEVERE, "While calling server function", e);
}
}
|
Da nun (wie in der serverseiten Klasse zu sehen ist) die Eigenschaft 1 geändert wird,
bekommt das clientseitige Objekt über die onPropertyChanged Methode
die Änderung mit und ändert selbst seine Farbe:
public void onPropertyChanged(int propID, Object newValue) {
// this.context.getLogger().info("Box Property changed: " + propID);
if (propID == 1) {
Color newColor = (Color) newValue;
Appearance appearance =
this.appearanceContext.createAppearanceFromColor(
new Color3f(newColor));
this.box.setAppearance(appearance);
}
}
|
Serverseitige Klasse
Die serverseitige Klasse ist wie folgt implementiert.
public class WuerfelServerObject extends AbstractLivingServerObject {
private static final Random rand = new Random();
private LOColorProperty colorProperty;
public WuerfelServerObject() {
super();
}
@Override
public void initialize() {
// Register function call listener (sink)
this.context.setFunctionCallSink(this);
this.colorProperty = this.context.getPropertyContext()
.createColorProperty(1, new Color(0, 200, 0));
}
@Override
public void deinitialize() {
}
public Object callFunction(String function, Object[] args) {
if ("changeColor".equals(function)) {
Color color = new Color(
rand.nextInt(256),
rand.nextInt(256),
rand.nextInt(256));
colorProperty.setValue(color);
}
return null;
}
}
|
Das WuerfelServerObject erbt vom AbstractLivingServerObject und muss daher die initialize und deinitialize Methoden
implementieren.
Beim Initialisieren wird über den Kontext (LivingServerObjectContext) der FunctionCallSink registiert (hier das Serverobjekt selbst).
Danach wird die Farbeigenschaft (ID 1) registiert (Default Farbe: grün).
Beim Aufruf einer serverseitigen Funktion wird die callFunction Methode aufgerufen.
Das clientseitige Objekt ruft beim Anklicken die "changeColor" Funktion auf.
Das serverseitige Objekt ändert nun die colorProperty. Die Eigenschaft wird automatisch
an alle Clients übertragen und der Würfel ändert die Farbe.
Typbeschreibung
Die Typen Beschreibung für die 3DSpieleWelt sieht wie folgt aus:
(Quelle: META-INF/CITY.XML)
<cityland>
<ObjectTypedef
type="de.beispiel.WuerfelBeispiel"
class="de.beispiel.WuerfelClientObject"
serverClass="de.beispiel.WuerfelServerObject"
LOD="default">
</ObjectTypedef>
</cityland>
|
siehe auch 3DSpiele Welt Archiv Struktur
 | Ihre Meinung zu diesem Eintrag |  | | | | |  | |  |
|
|