Web-Login
EMail:
Pwd:
Serverstatus:
offline

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
 
Bewertung:
 sehr hilfreich  gut  in Ordnung  ausreichend  mangelhaft
Kommentar:
 
 
  © Copyright 2006-2012, ToKi Soft, Germany Sitemap