AdSense

Montag, 20. Mai 2013

Panzerkampf

(English version) Vor einige Jahren hatte ich mal unter Linux ein Spiel programmiert: Panzerkampf. Die Grundlegende Idee war, dass man an einem Computer mit Pfeiltasten bzw. WASD einen Panzer durch die Gegend fährt und versucht, den anderen Spieler auszuschalten. Leider war das Projekt ziemlich limitiert, eine Tastatur kann nicht beliebig viele Tasten abfragen und wenn nun zwei Spieler an einer Tastatur sitzen und jeweils mehrere Tasten drücken, kann es sein, dass der eine Spieler nicht mehr schießen kann.

Vor etwa zwei Wochen habe ich mich dann nochmal an das Spiel gemacht. Programmiert habe ich in C#, das Spiel ist nun auch Netzwerk-fähig (dafür muss ich aber den Server hier bei mir am PC gestartet haben). Die Netzwerk-Kommunikation funktioniert mit Sockets, hier ein kleines Codebeispiel dazu:

Client:

System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
clientSocket.Connect("mein.server.de", port);
NetworkStream serverStream = clientSocket.GetStream();
byte[] outStream = System.Text.Encoding.ASCII.GetBytes("message to server");
//Nachricht an Server senden
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
byte[] inStream = new byte[70000];
//inStream anpassen (größe an clientSocket.ReceiveBufferSize anpassen)
Array.Resize(ref inStream, clientSocket.ReceiveBufferSize);
//Nachricht vom Server empfangen
serverStream.Read(inStream, 0, clientSocket.ReceiveBufferSize);
string dataFromServer = System.Text.Encoding.ASCII.GetString(inStream);
clientSocket.Close();


Server:

TcpListener serverSocket = new TcpListener(port);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
clientSocket = serverSocket.AcceptTcpClient();
NetworkStream networkStream = clientSocket.GetStream();
byte[] bytesFrom = new byte[10025];
Array.Resize(ref bytesFrom, clientSocket.ReceiveBufferSize);
networkStream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
Byte[] sendBytes = Encoding.ASCII.GetBytes("message to Client");
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
clientSocket.Close();


Für die Sounds habe ich Sounds von freesound.org benutzt, welche alle der Creative Commons 0 Lizenz unterliegen, ich also die Autoren nicht explizit erwähnen muss, ich darf lediglich nicht sagen, dass die Sounds von mir wären.

Die Grafiken male ich alle selber (C#, Windows Forms).

Den Download zu Panzerkampf gibts es hier: http://physudo.bplaced.net/Panzerkampf/publish.htm
Und den Server hier: http://physudo.bplaced.net/PanzerkampfServer/publish.htm

Falls es jemand ausprobiert würde ich mich freuen, wenn ich ein kleines Feedback (hier als Kommentar) bekommen könnte.

Keine Kommentare:

Kommentar veröffentlichen