knifflige Domelemente

Joe

Erfahrenes Mitglied
Hallo alle,

Ich komme mit den Domelementen auf keinen grünen Zweig.
Bei untenstehenden Code hatte mir damals Sven Mintel geholfen. Es ist aber unabdingbar das ich ihn erweitere. Leider macht mir allein schon die Syntax mit den Trinitäts-Operator ? : zu schaffen.
1. Ist es möglich das in If-else Operatoren umzuschreiben?

2. Wie schaffe ich es $node->setAttribute('title'
weitere Werte hinzuzufügen zb. Ressource oder Bewegungen?

2.1 $data enthält nur die Werte aus Der DB für die Positionen der User. für Frage 2 benötige ich aber eine 2.e DB-Abfrage aus einer andren Tabelle. Wie kann ich dies kombinieren?

3. Ist es möglich alle andren "leeren" Felder auch als Link mit Position einzubinden?

PHP:
//das Grid, hardcodiert aus einer externen Datei
include 'grid.tpl';

//Einfügen der Daten ins XML
$doc=new DomDocument();
$doc->loadXML($grid);
foreach($data as $item)
{
  $node=$doc->
          documentElement->
            getElementsByTagName('div')->item(($item['PosX']-$NearestKoordsX1))->
              getElementsByTagName('a')->item(($item['PosY']-$NearestKoordsY1));		  
  $node->setAttribute('title',
                      ($item['Username']==$Username)
                        ?''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']					
                        :''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);					
  $node->setAttribute('href',
                      'main.php?section=erkunden');
  $node->setAttribute('class',
                      ($item['Username']==$Username)
                        ?'me'				
						:'enemy');
}

Das ganze nochmal komplett (funktioniert bereits):
PHP:
	<div id="content-pic">
	<?php include 'templates/Ress.tpl'; ?>
	</div>
<div id=content>
<div id=mappic>
<?php
error_reporting(E_ALL);

//// Variablen und Grundwerte zur Karten und Positionsberechnung
$SlicepointX = $UserMapX*10-277;  // Auschnittspunkt X
$SlicepointY = $UserMapY*10-220;    // Auschnittspunkt Y
$NearestKoordsX1 = $UserMapX-21;
$NearestKoordsX2 = $UserMapX+22;
$NearestKoordsY1 = $UserMapY-27;    // Erfassung aller Spieler des Kartenausschnittes 
$NearestKoordsY2 = $UserMapY+27;

//// Abweichende Berechnung bei Kartenrandnähe ansonsten wird Spieler immer auf der Mitte angezeigt
if ($UserMapX<22) {                 
	$SlicepointX = 0;              
	$NearestKoordsX1 = 0;
	$NearestKoordsX2 = 44;
}
if ($UserMapX>178) {
	$SlicepointX = 1457;
	$NearestKoordsX2 = 201;
	$NearestKoordsX1 = 156;	
}
if ($UserMapY<28) {
	$SlicepointY = 0;
	$NearestKoordsY1 = 0;
	$NearestKoordsY2 = 56;
}
if ($UserMapY>172) {
	$SlicepointY = 1568;
	$NearestKoordsY2 = 201;
	$NearestKoordsY1 = 145;
}

//// Alle Spieler aus Datenbank lesen und in ein Array speichern.
{
$sql = "SELECT
			PosX,
			PosY,
			MoveX,
			MoveY,
			Username
		FROM
			User
		WHERE
			PosX >=$NearestKoordsX1 AND PosX < $NearestKoordsX2 AND
			PosY >=$NearestKoordsY1 AND PosY < $NearestKoordsY2";
	$result = $db->query($sql);
	if (!$result) {
		die ('Etwas stimmte mit dem Query nicht: '.$db->error);
	}
	while ($row = $result->fetch_assoc()) {
	$data[] = $row;
	}
}

//// Aus der 2000*2000Px Karte den passenden KartenAusschnitt erstellen (Tiling) 
$dir= "img/Map/$SlicepointX";
if (file_exists($dir) == false)  { 
	mkdir("img/Map/$SlicepointX", 0700);						// Verzeichniss erstellen wenn noch nie erstellt 
}
$file= "img/Map/$SlicepointX/$SlicepointY.jpeg";
if (file_exists($file) == false)  {            					// Prüfen ob Auschnitt (Tile) schon existiert
	//// Kartenausschnitt ohne Spielerposition
	$size = array(543,432);                        				// Breite und Höhe des Auschnitts
	$point = array($SlicepointX,$SlicepointY);     				// Koordinaten, ab wo kopiert werden soll (erst X, dann Y).
	$image = imagecreatefromjpeg("img/MAP1.jpg") ;  			// Original einlesen
	$new = imagecreatetruecolor($size[0],$size[1]); 			// Neues Bild leer erstellen
	imagecopyresampled($new, $image, 0,0, $point[0],$point[1],
					$size[0],$size[1], $size[0],$size[1]);  	// Ausschnitt rüberkopieren
	imageJPEG($new,"img/Map/$SlicepointX/$SlicepointY.jpeg",100);         // Bild speichern
}

//das Grid, hardcodiert aus einer externen Datei
include 'grid.tpl';

//Einfügen der Daten ins XML
$doc=new DomDocument();
$doc->loadXML($grid);
foreach($data as $item)
{
  $node=$doc->
          documentElement->
            getElementsByTagName('div')->item(($item['PosX']-$NearestKoordsX1))->
              getElementsByTagName('a')->item(($item['PosY']-$NearestKoordsY1));		  
  $node->setAttribute('title',
                      ($item['Username']==$Username)
                        ?''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']
					/*	:(($item['Username']==$Username) AND ($item['PosX'] != $item['MoveX']) AND ($item['PosY'] != $item['MoveY']))
						?''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY']	*/					
                        :''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);					
  $node->setAttribute('href',
                      'main.php?section=erkunden');
  $node->setAttribute('class',
                      ($item['Username']==$Username)
                        ?'me'
					/*	:(($item['Username']==$Username) AND ($item['PosX'] != $item['MoveX']) AND ($item['PosY'] != $item['MoveY']))
						?'move'	*/					
						:'enemy');
}
$sql = "SELECT
			Username,
			PosX,
			PosY,
			MoveX,
			MoveY
		FROM
			User
		WHERE
			Session =('".session_id()."')";
$result = $db->query($sql);
if (!$result) {
die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
	
	while ($row = $result->fetch_assoc()) {
	$data2[] = $row;
	}
foreach($data2 as $item)
{
  $node=$doc->
          documentElement->
            getElementsByTagName('div')->item(($item['MoveX']-$NearestKoordsX1))->
              getElementsByTagName('a')->item(($item['MoveY']-$NearestKoordsY1));		  
  $node->setAttribute('title', (($item['Username']==$Username) AND ($item['PosX'] != $item['MoveX']) OR ($item['PosY'] != $item['MoveY']))
						?''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY']
						:''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);						
  $node->setAttribute('href',
                      'main.php?section=erkunden');
  $node->setAttribute('class', (($item['Username']==$Username) AND ($item['PosX'] != $item['MoveX']) OR ($item['PosY'] != $item['MoveY']))
						?'move'
						:'me');
}

?>

<style type="text/css">

/*CSS fürs Grid*/
#grid{
  background: url(img/Map/<? echo "$SlicepointX/$SlicepointY"; ?>.jpeg) no-repeat;
  width:543px;
  height:432px;
}
#grid div{
  width:543px;
  height:10px;
}
#grid div a{

  display:block;
  width:10px;
  height:10px;
  float:left;
}

/*CSS zur markierung der Felder, hier könnte man statt Farben Sprites einsetzen*/
#grid a.me{
  background: url(img/list12x12-dot18.gif) no-repeat;
}
#grid a.move{
  background: url(img/pin25.gif) no-repeat;
}
#grid a.enemy{
  background: url(img/list12x12-dot19.gif) no-repeat;
}
</style>

<?php
//Ausgabe des Grids
echo $doc->saveHTML();
?>

</div>
</div>
	<div id="upper-pic">
	</div>
	<div id="uppercontent">
	<h2><?php
	echo "Benötigte Dauer: ".(microtime(true)-$start)." Sekunden.<br>";
	echo "Die Map wird zur Zeit optimiert.";
	//var_dump($row["Username"]);
			//unset($_SESSION['Positionen']);
			//echo "unset ";
	?></h2>
	</div>


Ich bin mir im klaren darüber das sich möglicherweisse nicht jeder mit diesem Thema auskennt. Auch ist vieleicht eine der Fragen im Moment nicht lösbar. Dennoch würde ich mich freuen wenn ihr eine Idee dazu habt und sie mir postet. auch wenn es nur eine Frage betrifft. Normalerweisse versuche ich meine Probleme mit Hilfe von Google meist selbst zu lösen aber hier blicke ich echt kaum durch und benötige wirklich Hilfe.

Vielen Dank fürs lesen :)
 

rd4eva

Erfahrenes Mitglied
1. Ist es möglich das in If-else Operatoren umzuschreiben?
Natürlich aber was macht dir denn da zu schaffen?
PHP:
$foo = true;

$bar = ($foo) ? 'foo is true' : 'foo is false';
//entspricht 1:1
if($foo){
   $bar = 'foo is true';
}else{
   $bar = 'foo is false';
}
PHP:
$node->setAttribute('class',
                      ($item['Username']==$Username)
                        ?'me'                
                        :'enemy'); 
//entspricht 1:1

if($item['Username']==$Username){
   $node->setAttribute('class','me');
}else{
   $node->setAttribute('class','enemy');
}

Wie schaffe ich es $node->setAttribute('title'
weitere Werte hinzuzufügen zb. Ressource oder Bewegungen?
In dem du es ganz einfach tust:
"'.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY'] bzw. ''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY'] ist doch nichts weiter als ein wildes aneinanderketten von strings. Demzufolge kannst du da noch dranhängen was du willst.
PHP:
$node->setAttribute('title',
                      ($item['Username']==$Username)
                        ?''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY'] . ' Ressource oder Bewegungen oder fooBar'                    
                        :''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);

$data enthält nur die Werte aus Der DB für die Positionen der User. für Frage 2 benötige ich aber eine 2.e DB-Abfrage aus einer andren Tabelle. Wie kann ich dies kombinieren?
Vermutlich wird dir das SQL Join Statement weiterhelfen.

Ist es möglich alle andren "leeren" Felder auch als Link mit Position einzubinden?
Versteh ich nicht :)
 
  • Gefällt mir
Reaktionen: Joe

Joe

Erfahrenes Mitglied
Zu 1.ens: Danke rd4eva dein Bspl hat mir geholfen nun verstehe ich wie das ausszusehen hat. Das war vorallem deswegen wichtig da ja der Trinitätsoperator ja nur 2 Zustände unterscheiden kann Wahr oder Falsch.

Zu 2.ens Bisher gab es nur 2 Klassen me oder enemy. Nun möchte ich noch Klassen hinzufügen wie Ressource, Bewegung, leer

So habe ich das mal versucht:
PHP:
//// Alle Spieler aus Datenbank lesen und in ein Array speichern.

$sql = "SELECT
			PosX,
			PosY,
			MoveX,
			MoveY,
			Username
		FROM
			User
		WHERE
			PosX >=$NearestKoordsX1 AND PosX < $NearestKoordsX2 AND
			PosY >=$NearestKoordsY1 AND PosY < $NearestKoordsY2";
	$result = $db->query($sql);
if (!$result) {
	die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row = $result->fetch_assoc()) {
	$data[] = $row;
}
$sql = "SELECT
			SammelplatzID
		FROM
			FoundSammelplatz
		WHERE
			Username ='$Username'";
	$result1 = $db->query($sql);
if (!$result1) {
	die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row1 = $result1->fetch_assoc()) {
	$SammelplatzID1[] = $row1;
}
$SammelplatzID1 = implode($SammelplatzID1);

$sql = "SELECT
			Ressource,
			ScrapX,
			ScrapY,
			Menge
		FROM
			Sammelplatz
		WHERE
			SammelplatzID IN ($SammelplatzID1)";
	$result2 = $db->query($sql);
if (!$result2) {
	die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row2 = $result2->fetch_assoc()) {
	$Sammelplatz[] = $row2;
}
var_dump($sql);

//das Grid, hardcodiert aus einer externen Datei
include 'grid.tpl';

//Einfügen der Daten ins XML
$doc=new DomDocument();
$doc->loadXML($grid);
foreach($data as $item)
{
  $node=$doc->
          documentElement->
            getElementsByTagName('div')->item(($item['PosX']-$NearestKoordsX1))->
              getElementsByTagName('a')->item(($item['PosY']-$NearestKoordsY1));		  
  
	if ($item['Username']==$Username) {
		$node->setAttribute('title',''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);
	}
	if ($item['Ressource']!='') {
		$node->setAttribute('title',''.'Ressource '.$item['Ressource'].': ');
	}
	/*	:(($item['Username']==$Username) AND ($item['PosX'] != $item['MoveX']) AND ($item['PosY'] != $item['MoveY']))
	?''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY']	*/	
	else {	
		$node->setAttribute('title',''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);
	}	
	$node->setAttribute('href',
		'main.php?section=erkunden');
	if($item['Username']==$Username){
		$node->setAttribute('class','me');
	}
	if ($item['Ressource']!='') {
		$node->setAttribute('class','ressource');
	}
	else{
		$node->setAttribute('class','enemy');
	} 
}

Zur Zeit scheitert es daran, das es mir nicht gelingt das Array $SammelplatzID1 in meine WHERE Clause meiner Datenbankabfrage richtig einzubinden.
Wenn ich dann alle entsprechenden Sammelplatz Positionen ausgelesen habe möchte ich die Indexnamen ScrapX und ScrapY erstezen mit PosX und PosY.
Danach füge ich das Array zu dem Array $data hinzu.
Ist etwa das was bei dem Join passieren würde. Nur das ich so ein für mich komplexes Join nicht hinkriegen würde.


Zu 3.ens:
Bisher werden auf der Map lediglich Me und Enemy an seiner jeweiligen Position angezeigt. Bei einen Mouseover zeigt es Mir Namen und Position und bei einen Klick komme ich auf entsprechende Href erkunden.php.
Nun möchte ich aber allen Punkten der Karte einen "title" + href erkunden.php geben.

Vielen Dank für deine umfassend Antwort.
 

Joe

Erfahrenes Mitglied
Zur Zeit scheitert es daran, das es mir nicht gelingt das Array $SammelplatzID1 in meine WHERE Clause meiner Datenbankabfrage richtig einzubinden.
Wenn ich dann alle entsprechenden Sammelplatz Positionen ausgelesen habe möchte ich die Indexnamen ScrapX und ScrapY erstezen mit PosX und PosY.
Danach füge ich das Array zu dem Array $data hinzu.
Ist etwa das was bei dem Join passieren würde. Nur das ich so ein für mich komplexes Join nicht hinkriegen würde.

So es ist mir nun zwar gelungen die Arrays zusammenzuführen und auch die Keys zu ersetzen, auch wird die Karte korreckt angezeigt, aber es wirft mir vor der Ausgabe noch einige Fehler:
PHP:
Notice: Undefined index: Ressource in /data/multiserv/users/251402/projects/296880/www/Backend/templates/map.tpl on line 164

Notice: Undefined index: Ressource in /data/multiserv/users/251402/projects/296880/www/Backend/templates/map.tpl on line 177

Notice: Undefined index: Username in /data/multiserv/users/251402/projects/296880/www/Backend/templates/map.tpl on line 161

Notice: Undefined index: Username in /data/multiserv/users/251402/projects/296880/www/Backend/templates/map.tpl on line 174

Das sind folgende Zeilen:
PHP:
	if ($item['Username']==$Username) {
		$node->setAttribute('title',''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);
	}
	if ($item['Ressource']!='') {
		$node->setAttribute('title',''.'Ressource '.$item['Ressource'].': ');
	}
und
PHP:
	if($item['Username']==$Username){
		$node->setAttribute('class','me');
	}
	if ($item['Ressource']!='') {
		$node->setAttribute('class','move');


Ist mir nur nicht klar wieso diese Fehler nun auftauchen?
Hier noch mal der ganze relevante Code:
PHP:
//// Alle Spieler aus Datenbank lesen und in ein Array speichern.
$sql = "SELECT
			PosX,
			PosY,
			MoveX,
			MoveY,
			Username
		FROM
			User
		WHERE
			PosX >=$NearestKoordsX1 AND PosX < $NearestKoordsX2 AND
			PosY >=$NearestKoordsY1 AND PosY < $NearestKoordsY2";
	$result = $db->query($sql);
if (!$result) {
	die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row = $result->fetch_assoc()) {
	$data[] = $row;
}

// SammelplatzID der gefundenen Sammelplätze in Array speichern
$sql = "SELECT
			SammelplatzID
		FROM
			FoundSammelplatz
		WHERE
			Username ='$Username'";
	$result1 = $db->query($sql);
if (!$result1) {
	die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row1 = $result1->fetch_assoc()) {
	$SammelplatzID1[] = $row1;
}

// Array in Variable speichern. Wird bei der nächsten Datenbankabfrage benötigt
$count=count($SammelplatzID1);
for($i = 0; $i < $count; $i++) {
	if ($i == $count-1) {
		// beim letzten Datensatz kein Kommata hinzufügen
		$Sammelplatz.=$SammelplatzID1[$i]["SammelplatzID"];
	}
	else {
		$Sammelplatz.=$SammelplatzID1[$i]["SammelplatzID"].',';
	}
}

// Alle Sammelplätze, Koordinaten, Art und Menge in Array speichern
$sql = "SELECT
			Ressource,
			ScrapX,
			ScrapY,
			Menge
		FROM
			Sammelplatz
		WHERE
			SammelplatzID IN ($Sammelplatz)
		AND
			ScrapX >=$NearestKoordsX1 AND ScrapX < $NearestKoordsX2
		AND
			ScrapY >=$NearestKoordsY1 AND ScrapY < $NearestKoordsY2";
	$result2 = $db->query($sql);
if (!$result2) {
	die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row2 = $result2->fetch_assoc()) {
	$Sammel[] = $row2;
}

// Folgende Funktionen ersetzen die Keys ScrapX/ScrapY mit PosX/PosY
// gefunden auf Tutorials.de danke Yaslaw
$Sammel=correctKeysRekursiveX($Sammel);
$Sammel=(correctKeysRekursiveY($Sammel));

function correctKeysRekursiveX($Sammel){
    //Die Schlüssel extrahieren
    $keys = array_keys($Sammel);
    //In allen Schlüsseln @ durch nix ersetzen
    foreach($keys as $index => $key){
        //Falls das item ein array ist, darauf ebenfalls diese Funktion anwenden       
        if(is_array($Sammel[$key])) $Sammel[$key] = correctKeysRekursiveX($Sammel[$key]);    
        $keys[$index] = str_replace("ScrapX", "PosX", $key);
    }
    //Den Array wieder zusammensetzen
    return array_combine($keys, $Sammel);
}
function correctKeysRekursiveY($Sammel){
    //Die Schlüssel extrahieren
    $keys = array_keys($Sammel);
    //In allen Schlüsseln @ durch nix ersetzen
    foreach($keys as $index => $key){
        //Falls das item ein array ist, darauf ebenfalls diese Funktion anwenden       
        if(is_array($Sammel[$key])) $Sammel[$key] = correctKeysRekursiveY($Sammel[$key]);    
        $keys[$index] = str_replace("ScrapY", "PosY", $key);
    }
    //Den Array wieder zusammensetzen
    return array_combine($keys, $Sammel);
}
// Arrays zusammenführen
$data1=array_merge($data,$Sammel);
//var_dump($data1);

//das Grid, hardcodiert aus einer externen Datei
include 'grid.tpl';

//Einfügen der Daten ins XML
$doc=new DomDocument();
$doc->loadXML($grid);
foreach($data1 as $item)
{
  $node=$doc->
          documentElement->
            getElementsByTagName('div')->item(($item['PosX']-$NearestKoordsX1))->
              getElementsByTagName('a')->item(($item['PosY']-$NearestKoordsY1));		  
  
	if ($item['Username']==$Username) {
		$node->setAttribute('title',''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);
	}
	if ($item['Ressource']!='') {
		$node->setAttribute('title',''.'Ressource '.$item['Ressource'].': ');
	}
	/*	:(($item['Username']==$Username) AND ($item['PosX'] != $item['MoveX']) AND ($item['PosY'] != $item['MoveY']))
	?''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY']	*/	
	else {	
		$node->setAttribute('title',''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);
	}	
	$node->setAttribute('href',
		'main.php?section=erkunden');
	if($item['Username']==$Username){
		$node->setAttribute('class','me');
	}
	if ($item['Ressource']!='') {
		$node->setAttribute('class','move');
	}
	else{
		$node->setAttribute('class','enemy');
	} 
}


Kann mir jemand erklären wie die Fehler nun entstehen? Wie gesagt die Karte wird korreckt angezeigt unter der Fehlerausgabe. Wie könnte ich die Fehler umgehen?

Edit: schalte ich das Errorreporting aus ists soweit ok aber kann ja nit Sinn der Sache sein oder?
 
Zuletzt bearbeitet:

Joe

Erfahrenes Mitglied
Ok lassen wir mal das Thema Fehler. Vermutlich muss vorher geprüft werden ob das Objekt existiert.

Andere Frage:
Hier setze ich bei jedem Objekt eine URL welche mich bei einen Klick auf das Objekt/Karte mich auf diese Seite weiterleitet.
PHP:
    $node->setAttribute('href',
        'main.php?section=erkunden');
Diese Seite wird über mein Templatesystem eingebunden. Das Templatesystem ist exact das gleiche welches im Quakenet-Tutorial verwendet wird. Kennen sicher einige.

Es ist mir so aber nicht möglich die PosX und PosY- Kordinaten als Variablen per Get() mitzugeben.
Kann ich vieleicht einen Knoten setzen welcher gleich ein Formular sendet?
Kann man die Koordinaten mit OnClick per Javascript senden oder Ajax?
Wenn ja besser im ensprechenden Forum fragen oder kann jemand helfen?

Sinn ist es das die Koordinaten auf der erkunden.php automatisch in den EingabeFeldern eintragen. Wie ich das dort auswerte und wie sie eingetragen werden ist nicht das Problem sondern wie ich sie bei einem Klick auf der Karte übermittle.

Hoffentlich sind jetzt nicht alle vom Code erschlagen und scheuen sich mir deswegen zu antworten. Normal denke ich müsste es mit Javascript-und evtl. Domelementen lösbar sein. Bin ja sicher nicht der erste der einfache Klicks mit Daten verwirklichen wollte.

Vielen Dank fürs lesen :)

Edit: krass ich hab keinerlei Idee. Es muss doch möglich sein irgendwas mitzugeben auf meine Seite 'main.php?section=erkunden'. Ein Hallo Welt oder foobar. Bloss wie? Cookies Sessions Post get? Echt zum verzweifeln.
 
Zuletzt bearbeitet:

Joe

Erfahrenes Mitglied
Sorry für die Doppelposts das alles zu editieren hätte wohl aber auch kaum Sinn gemacht. So kann man wenigstens nachvollziehen um was genau es ging.

Da ich insbesondere durch Yaslaws Hilfe (auch durch ältere Threads und seiner Hilfestellung darin) meine Problemstellungen lösen konnte, wollte ich nun doch wenigstens für andere meine Lösung posten. Möglicherweisse nutzt es dem einen oder andren.

PHP:
	<div id="content-pic">
	<?php include 'templates/Ress.tpl'; ?>
	</div>
<div id=content>
<div id=mappic>
<?php
//error_reporting(E_ALL);

//// Variablen und Grundwerte zur Karten und Positionsberechnung
$SlicepointX = $UserMapX*10-277;  // Auschnittspunkt X
$SlicepointY = $UserMapY*10-220;    // Auschnittspunkt Y
$NearestKoordsX1 = $UserMapX-21;
$NearestKoordsX2 = $UserMapX+22;
$NearestKoordsY1 = $UserMapY-27;    // Erfassung aller Spieler des Kartenausschnittes 
$NearestKoordsY2 = $UserMapY+27;

//// Abweichende Berechnung bei Kartenrandnähe ansonsten wird Spieler immer auf der Mitte angezeigt
if ($UserMapX<22) {                 
	$SlicepointX = 0;              
	$NearestKoordsX1 = 0;
	$NearestKoordsX2 = 44;
}
if ($UserMapX>178) {
	$SlicepointX = 1457;
	$NearestKoordsX2 = 201;
	$NearestKoordsX1 = 156;	
}
if ($UserMapY<28) {
	$SlicepointY = 0;
	$NearestKoordsY1 = 0;
	$NearestKoordsY2 = 56;
}
if ($UserMapY>172) {
	$SlicepointY = 1568;
	$NearestKoordsY2 = 201;
	$NearestKoordsY1 = 145;
}

//// Aus der 2000*2000Px Karte den passenden KartenAusschnitt erstellen (Tiling) 
$dir= "img/Map/$SlicepointX";
if (file_exists($dir) == false)  { 
	mkdir("img/Map/$SlicepointX", 0700);						// Verzeichniss erstellen wenn noch nie erstellt 
}
$file= "img/Map/$SlicepointX/$SlicepointY.jpeg";
if (file_exists($file) == false)  {            					// Prüfen ob Auschnitt (Tile) schon existiert
	//// Kartenausschnitt ohne Spielerposition
	$size = array(543,432);                        				// Breite und Höhe des Auschnitts
	$point = array($SlicepointX,$SlicepointY);     				// Koordinaten, ab wo kopiert werden soll (erst X, dann Y).
	$image = imagecreatefromjpeg("img/MAP1.jpg") ;  			// Original einlesen
	$new = imagecreatetruecolor($size[0],$size[1]); 			// Neues Bild leer erstellen
	imagecopyresampled($new, $image, 0,0, $point[0],$point[1],
					$size[0],$size[1], $size[0],$size[1]);  	// Ausschnitt rüberkopieren
	imageJPEG($new,"img/Map/$SlicepointX/$SlicepointY.jpeg",100);         // Bild speichern
}

//// Alle Spieler aus Datenbank lesen und in ein Array speichern.
$sql = "SELECT
			PosX,
			PosY,
			MoveX,
			MoveY,
			Username
		FROM
			User
		WHERE
			PosX >=$NearestKoordsX1 AND PosX < $NearestKoordsX2 AND
			PosY >=$NearestKoordsY1 AND PosY < $NearestKoordsY2";
	$result = $db->query($sql);
if (!$result) {
	die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row = $result->fetch_assoc()) {
	$data[] = $row;
	$data2[] = $row;
}

// SammelplatzID der gefundenen Sammelplätze in Array speichern
$sql = "SELECT
			SammelplatzID
		FROM
			FoundSammelplatz
		WHERE
			Username ='$Username'";
	$result1 = $db->query($sql);
if (!$result1) {
	die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row1 = $result1->fetch_assoc()) {
	$SammelplatzID1[] = $row1;
}

// Array in Variable speichern. Wird bei der nächsten Datenbankabfrage benötigt
$count=count($SammelplatzID1);
for($i = 0; $i < $count; $i++) {
	if ($i == $count-1) {
		// beim letzten Datensatz kein Kommata hinzufügen
		$Sammelplatz.=$SammelplatzID1[$i]["SammelplatzID"];
	}
	else {
		$Sammelplatz.=$SammelplatzID1[$i]["SammelplatzID"].',';
	}
}

// Alle Sammelplätze, Koordinaten, Art und Menge in Array speichern
$sql = "SELECT
			Ressource,
			ScrapX,
			ScrapY,
			Menge
		FROM
			Sammelplatz
		WHERE
			SammelplatzID IN ($Sammelplatz)
		AND
			ScrapX >=$NearestKoordsX1 AND ScrapX < $NearestKoordsX2
		AND
			ScrapY >=$NearestKoordsY1 AND ScrapY < $NearestKoordsY2";
	$result2 = $db->query($sql);
if (!$result2) {
	die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row2 = $result2->fetch_assoc()) {
	$Sammel[] = $row2;
}

// Folgende Funktionen ersetzen die Keys ScrapX/ScrapY mit PosX/PosY
// gefunden auf Tutorials.de danke Yaslaw
$Sammel=correctKeysRekursiveX($Sammel);
$Sammel=(correctKeysRekursiveY($Sammel));

function correctKeysRekursiveX($Sammel){
    //Die Schlüssel extrahieren
    $keys = array_keys($Sammel);
    //In allen Schlüsseln @ durch nix ersetzen
    foreach($keys as $index => $key){
        //Falls das item ein array ist, darauf ebenfalls diese Funktion anwenden       
        if(is_array($Sammel[$key])) $Sammel[$key] = correctKeysRekursiveX($Sammel[$key]);    
        $keys[$index] = str_replace("ScrapX", "PosX", $key);
    }
    //Den Array wieder zusammensetzen
    return array_combine($keys, $Sammel);
}
function correctKeysRekursiveY($Sammel){
    //Die Schlüssel extrahieren
    $keys = array_keys($Sammel);
    //In allen Schlüsseln @ durch nix ersetzen
    foreach($keys as $index => $key){
        //Falls das item ein array ist, darauf ebenfalls diese Funktion anwenden       
        if(is_array($Sammel[$key])) $Sammel[$key] = correctKeysRekursiveY($Sammel[$key]);    
        $keys[$index] = str_replace("ScrapY", "PosY", $key);
    }
    //Den Array wieder zusammensetzen
    return array_combine($keys, $Sammel);
}
// Arrays zusammenführen
$data1=array_merge($data,$Sammel);

// Array $koords mit allen Kordinaten innerhalb des Kartenausschnitts befüllen
$koords=array();
$count=count($koords);
for ($i=$NearestKoordsX1; $i<$NearestKoordsX2; $i++) {
	for ($j=$NearestKoordsY1; $j<$NearestKoordsY2; $j++) {
		$count++;
        $koords[$count]['PosX'] = $i;
        $koords[$count]['PosY'] = $j;  
	}
}

// Array $koords mit Array $data1 vergleichen
// Wenn Koordinaten aus Array $koords nicht im Array $data1 vorhanden sind
// wird das Koordinatenpaar dem Array $data hinzugefügt
// VIELEN DANK YASLAW VON TUTORIALS.DE
foreach($koords as $koord){
    $flag = false;
    foreach($data1 as $item){
        if($koord["PosX"]==$item["PosX"] && $koord["PosY"]==$item["PosY"]){
            $flag = true;
            break;
        }
    }
    if(!$flag){
       $newIndex = count($data1);
       $data1[$newIndex]["PosX"] = $koord["PosX"];
       $data1[$newIndex]["PosY"] = $koord["PosY"];
    }
}

//das Grid, hardcodiert aus einer externen Datei
include 'grid.tpl';

//Einfügen der Daten ins XML
$doc=new DomDocument();
$doc->loadXML($grid);


foreach($data1 as $item)
{
  $node=$doc->
          documentElement->
            getElementsByTagName('div')->item(($item['PosX']-$NearestKoordsX1))->
              getElementsByTagName('a')->item(($item['PosY']-$NearestKoordsY1));		  
  
	if ($item['Username']==$Username) {
		$node->setAttribute('title',''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);
	}
	if ($item['Ressource']!='') {
		$node->setAttribute('title',''.$item['Menge'].' '.$item['Ressource'].': '.$item['PosX'].'/'.$item['PosY']);
	}
	if ($item['Username']!=$Username AND $item['Ressource']=='') {	
		$node->setAttribute('title',''.'Bunker von '.$item['Username'].': '.$item['PosX'].'/'.$item['PosY']);
	}
	if  ($item['Username']=='' AND $item['Ressource']==''){
		$node->setAttribute('title',''.$item['PosX'].'/'.$item['PosY']);
	}
	$node->setAttribute('href',
		'main.php?section=erkunden&PosX='.$item["PosX"].'&PosY='.$item["PosY"].'');
	if($item['Username']==$Username){
		$node->setAttribute('class','me');
	}
	if ($item['Ressource']!='') {
		$node->setAttribute('class','ress');
	}
	if ($item['Username']!=$Username AND $item['Ressource']=='') {
		$node->setAttribute('class','enemy');
	}
	if ($item['Username']=='' AND $item['Ressource']=='') {
		$node->setAttribute('class','empty');
	}
}

foreach($data2 as $item)
{
	  $node=$doc->
          documentElement->
            getElementsByTagName('div')->item(($item['MoveX']-$NearestKoordsX1))->
              getElementsByTagName('a')->item(($item['MoveY']-$NearestKoordsY1));
	if  ($item['Username']==$Username AND $item['PosX']!=$item['MoveX'] OR $item['PosY']!=$item['MoveY'] AND $item['Ressource']==''){
		$node->setAttribute('title',''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY']);
	}
	$node->setAttribute('href',
		'main.php?section=erkunden&PosX='.$item["MoveX"].'&PosY='.$item["MoveY"].'');
	if  ($item['Username']==$Username AND $item['PosX']!=$item['MoveX'] OR $item['PosY']!=$item['MoveY'] AND $item['Ressource']==''){
		$node->setAttribute('class','move');
	}
}

?>

<style type="text/css">

/*CSS fürs Grid*/
#grid{
  background: url(img/Map/<? echo "$SlicepointX/$SlicepointY"; ?>.jpeg) no-repeat;
  width:543px;
  height:432px;
}
#grid div{
  width:543px;
  height:10px;
}
#grid div a{

  display:block;
  width:10px;
  height:10px;
  float:left;
}

/*CSS zur markierung der Felder, hier könnte man statt Farben Sprites einsetzen*/
#grid a.me{
  background: url(img/list12x12-dot18.gif) no-repeat;
}
#grid a.move{
  background: url(img/pin25.gif) no-repeat;
}
#grid a.enemy{
  background: url(img/list12x12-dot19.gif) no-repeat;
}
#grid a.ress{
	//margin: 1px 0px 0px 1px;
  background: url(img/minidot8x8-19.gif) no-repeat;
}
#grid a.empty{

}

</style>

<?php
//Ausgabe des Grids
echo $doc->saveHTML();
?>

</div>
</div>
	<div id="upper-pic">
	</div>
	<div id="uppercontent">
	<h2><?php
	echo "Benötigte Dauer: ".(microtime(true)-$start)." Sekunden.<br>";
	echo "Die Map wird zur Zeit optimiert.";
	//var_dump($row["Username"]);
			//unset($_SESSION['Positionen']);
			//echo "unset ";
	?></h2>
	</div>
Sicher kann man den Code performanter und oder kompakter schreiben. Wenn ihr Ideen habt postet sie mir.

Nochmals Danke an alle die mir geholfen haben. Tutorials.de ist meiner Meinung die beste Seite für Programmierer. Stets freundlich und hilfsbereit :D
 
Zuletzt bearbeitet:

Joe

Erfahrenes Mitglied
Vieleicht habe ich das Thema etwas voreilig als erledigt abgehakt.

Kann mir jemand sagen ob es mit den Domelementen möglich ist ein $node->setAttribute('title',
mehrere Titel anzugeben?

Genauer:
Ich gehe mein gesamtes Datenarray mit Positionen und Namen in einer Schleife durch
foreach($data1 as $item)

für jeden Usernamen, und Bewegung gebe ich die Position aus. Fährt man mit der Maus über die Karte bekommt man die Position und Namen eines Spielers als title angezeigt.
PHP:
	if  ($item['Username']==$Username AND $item['PosX']!=$item['MoveX'] OR $item['PosY']!=$item['MoveY'] AND $item['Ressource']==''){
		$node->setAttribute('title',''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY']);
	}
$node->setAttribute('title',''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY']);
Zeigt mir dann Auf der Karte den Namen und die Position.


Das Problem ist das wenn sich 2 User auf der selben Position befinden überschreibt es in meiner Schleife alle User und zeigt so nur den letzten User an.
Ich möchte aber das mir nun alle User die sich dort befinden in einem Title angezeigt werden.

Geht das überhaupt mit den Domelementen? Vieleicht hat von euch ja jemand ne Idee.


Danke Joe.
 

saftmeister

Nutze den Saft!
AFAIK kann ein Attribute nur einmal vergeben werden. Du müsstest es als "Element-Feld" deklarieren. In etwa so:

XML:
<elements>
  <element>
    <users>
      <user id="123" name="Hans Wurst"/>
      <user id="456" name="Rosa Schlüpfer"/>
      <user id="789" name="Axel Schweiß"/>
      <!-- hier weiter user wenn nötig --> 
    </users>
    <position_x value="100.0"/>
    <position_y value="50.0"/>
  </element>
  <!-- hier weitere elemente -->
</elements>
 
  • Gefällt mir
Reaktionen: Joe

Joe

Erfahrenes Mitglied
Hmm also so recht eingängig ists mir nicht. Mal abgesehen davon das ich nicht so recht weiss wie ich das in meine Schleife einbauen müsste (Syntax) verstehe ich nicht so recht wie daraus ein Atribut title enstehen kann. mit title meine ich es wie man es bei Images nutzt. Man fährt über das Image und bekommt den title als Mousover angezeigt.

Hab zwar schon versucht mich in die Domelemente reinzulesen aber wie gesagt habe ich da wohl ne Blockade :(
Habe es schon vermutet das man ein Atribut nur einmal vergeben kann.
Meine Gedanken waren das man eine If-Abfrage macht und schaut ob das Atribut title im Element div und a schon vergeben wurde.
Wenn true dann so dachte ich ändere ich den Value und hänge ein <br> und neuen User + PosX/PosY drann.
Sowas etwa:
PHP:
foreach($data2 as $item)
{
      $node=$doc->
          documentElement->
            getElementsByTagName('div')->item(($item['MoveX']-$NearestKoordsX1))->
              getElementsByTagName('a')->item(($item['MoveY']-$NearestKoordsY1));
    if  ($item['Username']==$Username AND $item['PosX']!=$item['MoveX'] OR $item['PosY']!=$item['MoveY'] AND $item['Ressource']==''){


            ////////////// Das meine ich
		if (getDiesesAtribut==bereits gesetzt) {
			Hänge an Atribute(title,Horst: 100/120) nächsten User aus $data2 dran
		}
		else {
			//ganz normal das Atribut erstellen
			$node->setAttribute('title',''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY']);
		}
           ///////////////

    }
    $node->setAttribute('href',
        'main.php?section=erkunden&PosX='.$item["MoveX"].'&PosY='.$item["MoveY"].'');
    if  ($item['Username']==$Username AND $item['PosX']!=$item['MoveX'] OR $item['PosY']!=$item['MoveY'] AND $item['Ressource']==''){
        $node->setAttribute('class','move');
    }
}

Nur wüsste ich nicht mit welchen Befehlen und Syntax ich das machen könnte. Obwohl ich denke das es wohl die Befehle für geben müsste.
Ich glaub da muss ich mir doch mal nen Buch für kaufen. Ist mir ja schon voll peinlich wie ich hier rumeiere.
 
Zuletzt bearbeitet:

saftmeister

Nutze den Saft!
Ah, ok, valsch ferstanden ;-)

Kannst du den Titel mit getAttribute() abholen()? Wenn ja, ist das recht einfach:

PHP:
            ////////////// Das meine ich
        $title = '';
        if (getDiesesAtribut==bereits gesetzt) {
            $title = $node->getAttribute('title');
            $title.= ''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY'];
        }
        else {
            //ganz normal das Atribut erstellen
            $title = ''.$item['Username'].': '.$item['MoveX'].'/'.$item['MoveY'];
        }
        $node->setAttribute('title', $title);
           ///////////////

Oder so ähnlich.
 
  • Gefällt mir
Reaktionen: Joe