Antwort
von
nach 3 Stunden
0
hilfreich
Re^2: Websitenkommunikation zwischen zwei Usern
Danke für die ausführliche Antwort. Ein bisschen hat mir das schon geholfen. Ich ab jetzt dennoch mal meinen Code mit angehängt.
Dies ist der Code in der Hauptdatei die in die Seite direkt eingebunden wird (der javascript-Part):
<code>
window.setInterval("SetShoots()",1000);
<!--
// Schüsse einsetzen
var request = false;
// Request senden
function SetShoots() {
// Request erzeugen
if (window.XMLHttpRequest) {
request = new XMLHttpRequest(); // Mozilla, Safari, Opera
} else if (window.ActiveXObject) {
try {
request = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
} catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
} catch (e) {}
}
}
// überprüfen, ob Request erzeugt wurde
if (!request) {
alert("Kann keine XMLHTTP-Instanz erzeugen");
return false;
} else {
var url = "setshoots.php";
// Request öffnen
request.open('post', url, true);
// Requestheader senden
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// Request senden
request.send();
// Request auswerten
request.onreadystatechange = interpretRequest;
}
}
// Schuss abgeben
// Request senden
function Schuss(id, type) {
// Request erzeugen
if (window.XMLHttpRequest) {
request = new XMLHttpRequest(); // Mozilla, Safari, Opera
} else if (window.ActiveXObject) {
try {
request = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
} catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
} catch (e) {}
}
}
// überprüfen, ob Request erzeugt wurde
if (!request) {
alert("Kann keine XMLHTTP-Instanz erzeugen");
return false;
} else {
var url = "schuss.php";
// Request öffnen
request.open('post', url, true);
// Requestheader senden
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// Request senden
request.send('id='+id+'&type='+type);
// Request auswerten
request.onreadystatechange = interpretRequest;
}
}
// Request auswerten
function interpretRequest() {
switch (request.readyState) {
// wenn der readyState 4 und der request.status 200 ist, dann ist alles korrekt gelaufen
case 4:
if (request.status != 200) {
alert("Der Request wurde abgeschlossen, ist aber nicht OK\nFehler:"+request.status);
} else {
// Antwort des Servers -> als XML-Dokument
var xmlDoc = request.responseXML;
// Namen aus dem XML-Dokument herauslesen
var id = xmlDoc.getElementsByTagName('id')[0].firstChild.nodeValue;
var content = xmlDoc.getElementsByTagName('content')[0].firstChild.nodeValue;
var event = xmlDoc.getElementsByTagName('event')[0].firstChild.nodeValue;
// Namen in die Felder schreiben
document.getElementById(id).style.backgroundImage = content;
document.getElementById('event').innerHTML = event;
}
break;
default:
break;
}
}
//-->
</code>
Dies ist der Code für den ersten Request/Funktion der php-Datei:
<code>
<?php
include("_settings.php");
include("_connect.php");
include("_functions.php");
header('Content-Type: text/xml; charset=utf-8'); // sorgt für die korrekte Kodierung
header('Cache-Control: must-revalidate, pre-check=0, no-store, no-cache, max-age=0, post-check=0'); // ist mal wieder wichtig wegen IE
$result = mysql_query("SELECT * FROM shoots WHERE game_ID = '$gameID' AND user_ID = '$user2_ID' ORDER BY shoot_ID DESC LIMIT 0,1");
while($data=mysql_fetch_array($result)){
$field = $data['field'];
$hit = $data['hit'];
switch($hit) {
case "1":
$content = 'url(gfx/bg_1_X.jpg)';
$event = '"Du wurdest getroffen! Dein Gegner darf nochmal!"';
break;
case "0":
$content = 'url(gfx/bg_1_O.jpg)';
$event = '"Glueck gehabt! Daneben! Du bist dran!"';
break;
default:
break;
}
}
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
echo "<formatname>\n";
echo " <id>"."M_".$field."</id>\n";
echo " <content>".$content."</content>\n";
echo " <event>".$event."</event>\n";
echo "</formatname>\n";
?>
</code>
Und dies der Code der vom zweiten Request.
<code>
<?php
include("_settings.php");
include("_connect.php");
include("_functions.php");
header('Content-Type: text/xml; charset=utf-8'); // sorgt für die korrekte Kodierung
header('Cache-Control: must-revalidate, pre-check=0, no-store, no-cache, max-age=0, post-check=0'); // ist mal wieder wichtig wegen IE
$id = $_POST['id'];
$type = $_POST['type'];
$anz = "0";
$hit = "0";
$event = "Du hast leider nicht getroffen!";
$content = "";
$result = mysql_query("SELECT * FROM games WHERE games_ID = '$gameID'");
while($data=mysql_fetch_array($result)){
$turn = $data['turn'];
$user1 = $data['user1_ID'];
$user2 = $data['user2_ID'];
if(($turn == "0" AND $data['user1_ID']==$userID) OR ($turn == "1" AND $data['user2_ID']==$userID)){
$turn = "0";
}else{
$turn = "1";
}
}
if($turn == "1"){
$event = "Warte auf den Zug deines Gegners!";
$id = "event";
$content = 'url()';
}else{
if($userID == $user1){
$newturn = "1";
}else{
$newturn = "0";
}
$result = mysql_query("SELECT * FROM ships WHERE user_ID = '$user2_ID' AND (pos1 = '$id' OR pos2 = '$id' OR pos3 = '$id' OR pos4 = '$id' OR pos5 = '$id')");
while($data=mysql_fetch_array($result)){
$hits = $data['hits']+1;
$shipID = $data['ships_ID'];
mysql_query("UPDATE ships SET hits = '$hits' WHERE ships_ID = '$shipID' ");
$family=$data['family'];
if($family==$hits){
$event = "Du hast das gegnerische Schiff versenkt!";
}else{
$event = "Du hast einen Treffer gelandet!";
}
$hit = "1";
$anz = "1";
if($userID == $user1){
$newturn = "0";
}else{
$newturn = "1";
}
}
if($anz=="1"){
if($type=="1"){
$content = 'url(gfx/bg_1_X.jpg)';
}else{
$content = 'url(gfx/bg_2_X.jpg)';
}
}else{
if($type=="1"){
$content = 'url(gfx/bg_1_O.jpg)';
}else{
$content = 'url(gfx/bg_2_O.jpg)';
}
}
mysql_query("UPDATE games SET turn = '$newturn' WHERE games_ID = '$gameID'");
mysql_query("INSERT INTO shoots ( shoot_ID, game_ID, user_ID, field, hit) values ( NULL, '$gameID', '$userID', '$id', '$hit')");
}
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
echo "<formatname>\n";
echo " <id>".$id."</id>\n";
echo " <content>".$content."</content>\n";
echo " <event>".$event."</event>\n";
echo "</formatname>\n";
?>
</code>
Fehler dürften sich aber ansich eher im JS Teil eingeschlichen haben ... wobei ich nur zufällige Fehler bei der Ausgabe habe keine systematischen.
Fehler sind dabei z.B., dass er manchmal beim Schießen keinen Text ausgibt und das Bild nicht verändert. Der Datenbankeintrag erfolgt aber meist trotzdem und beim Gegner werden die Schüsse auch eingezeichnet.
Danke schonmal :).
Gruß
Marco