knifflige Domelemente

Joe

Erfahrenes Mitglied
Klasse! Das sieht gut aus nun mus ich mich nochmal schlau machen wie ich das Attribute hole um meine If-Abfrage zu machen.

Ich denke etwa so müsste es fast klappen:
If (getAttribute('title'))
Sollte ja nen True werfen falls bereits gesetzt.

Aber das bringt mich schon mal Meilen weiter Danke Saftmeister :)
 

saftmeister

Nutze den Saft!
Du könntest es bspw. so machen:

PHP:
if ( ($title = $node->getAttribute('title')) != '' ) {

Dann hast du in Title schon mal das bisherige drin stehen, und kannst die erste Zeile im if-Block sparen.
 
  • Gefällt mir
Reaktionen: Joe

Joe

Erfahrenes Mitglied
Mann o Mann also eins ist Fakt Domelemente sind echt unflexibel und schwer zu händeln.
Hab ne Ewigkeit gebraucht um zu verstehen das ich eine weitere Datenbankabfrage zwingend machen muss. Die erste fragte alle PosX/PosY (Bunkerstandort) und MoveX/MoveY (Bewegungen) Koordinaten ab. Problem war das die Bewegungen aber freilich ausserhalb des Kartenausschnitts und damit ausserhalb meines XML-Gitters lagen.

Das hat mich echt bald verzweifeln lassen da es vorerst ging sich aber dann jemand (User) auserhalb meines Gitters/Kartenauschnitt bewegte.

Man kann garnicht alles aufzählen was man da beachten muss wenn man mit Domelementen arbeiten möchte.
Jedenfalls habe ichs nun doch noch hinbekommen dennoch fürchte ich mit jedem weiteren Teil den man der Karte hinzufügen möchte wirds komplizierter wenn nicht bald unlösbar mit den Domelementen.

Einzigst einen Zeilenumbruch <br> nach jedem User scheint man nicht realisieren zu können.



Danke dir Saftmeister mit deiner Hilfe konnte ich mein letztes Problem lösen. Ich glaub so lasse ich das ganze auch mal stehen :D


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,
            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);

// 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');
    }
}

// Abfrage der Bewegungen der User innerhalb des Kartenbereichs
$sql = "SELECT
			PosX,
			PosY,
            MoveX,
            MoveY,
            Username
        FROM
            User
        WHERE
            MoveX >=$NearestKoordsX1 AND MoveX < $NearestKoordsX2
		AND
            MoveY >=$NearestKoordsY1 AND MoveY < $NearestKoordsY2";
    $result = $db->query($sql);
if (!$result) {
    die ('Etwas stimmte mit dem Query nicht: '.$db->error);
}
while ($row = $result->fetch_assoc()) {
    $data2[] = $row;
}

// Nur Bewegungen der User ausserhlb ihres Bunkers auf der Karte zeigen
foreach($data2 as $item)
{
$node=$doc->
	documentElement->
		// dem Gitter Bewegungskoordinaten zuordnen
		getElementsByTagName('div')->item(($item['MoveX']-$NearestKoordsX1))->
			getElementsByTagName('a')->item(($item['MoveY']-$NearestKoordsY1));
	// User ausserhalb von Bunker?
    if  ($item['PosX']!=$item['MoveX'] OR $item['PosY']!=$item['MoveY']){
		// Atribute an dieser Position schon vergeben?
        if (($title = $node->getAttribute('title')) != '') {
			// weiteren User ans titleTAG granhängen
            $title.= ''.': '.$item['Username'];
        }
		// Atribut nicht vergeben
        else {
            // User ins Atribut schreiben
            $title = ''.$item['Username'];
        }
		//Attribut erstellen
        $node->setAttribute('title', $title);
    }
	//Link generieren mit Position (Position wird auf erkunden.php ausgelesen)
    $node->setAttribute('href',
        'main.php?section=erkunden&PosX='.$item["MoveX"].'&PosY='.$item["MoveY"].'');
	// Klasse erstellen und Minigrafik auf Karte an Position zeigen
    if  ($item['PosX']!=$item['MoveX'] OR $item['PosY']!=$item['MoveY']){
        $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>
 
Zuletzt bearbeitet:

Neue Beiträge