package example;
import gdwNet.client.BasicClient;
import gdwUtils.DefaultCharSet;
import java.nio.ByteBuffer;
/**
* Speziell:
* Beispielimplementierung für eine CoreLoop auf der Clientseite. Sie prüft ob eine Chatnachricht
* getippt wurde und ob Nachrichten vom Server kamen.
*
* Allgemein:
* Eine so genannten CoreLoop ist eine Endlosschleife, die praktische in jedem Spiel anwendung findet.
* Sie bildet die Grundeinheit und besteht aus normalerweise aus:
* - update(hole Spielereingaben, zb; von Tastatur. Simuliere weiter das Spielgeschehen)
* - draw(Zeichne das aktuelle Spielgeschehen)
*
* @author firen
*
*/
public class ClientCoreLoop extends Thread
{
private BasicClient clientRef;
private final ChatClient guiRef;
private static final int MAXCHATINPUTLENGTH = 35;
public ClientCoreLoop(BasicClient clientRef, ChatClient guiRef)
{
this.clientRef = clientRef;
this.guiRef = guiRef;
this.start();
}
public void setRef(BasicClient ref)
{
this.clientRef = ref;
}
@Override
public void run()
{
while (true)
{
try
{
//Damit es nicht auf 100% CPU läuft, weil hier nichts geszeichnet wird
sleep(250);
} catch (InterruptedException e1)
{
}
// würde mir mist gegeben? oder alles geschlossen
if (this.clientRef == null)
{
return;
}
// frag nach ob etwas vom Server gesendet wurde
if (!clientRef.pollInput())
{
//ich habe einen Verbindungsverlust
return;
}
// frage die eventuell eingetippe Nachricht ab
String msg = this.guiRef.getChatBuffer();
if (msg.length() != 0)
{
// ist nicht leer
if (msg.length() > MAXCHATINPUTLENGTH)
{
//schneide Nachricht ab, da Nachrichten an den Server
//nur begrenzten Platz haben
msg = msg.substring(0, MAXCHATINPUTLENGTH);
}
// lese das bytearray aus der Nachricht
byte[] arr = msg.getBytes(DefaultCharSet.getDefaultCharset());
// hole Nachrichten ByteBuffer
ByteBuffer buf = this.clientRef.getMessageBuffer();
// schreibe Chatnachricht code
buf.put(MyMessageConstants.ChatMessage);
// füge Läge des bytearrays ein
buf.put((byte) arr.length);
// füge bytearray ein
buf.put(arr);
// sende Nachricht an Server
this.clientRef.sendMSG(buf, false);
}
}
}
}