Hallo Tutorianer
Ich habe am Ende dieses Posts mal das gesamte Skript hingesetzt falls es den einen oder andren intressiert.
Ich denke man wird schnell erkennen um was sich diese Skript dreht.
Zu der Frage:
Kann ich diese Codezeilen
ändern das es die Schleife so nicht benötigt? Vieleicht mit einem Array?
Das Problem ist ich möchte das Ausgangsbild nicht verändern sondern es soll ein neues Bild mit andren Namen enstehen. Das geht aber in so einer Schleife nicht da ja jede Position die dazu kommt das Bild verändert und den selben Namen des Bildes braucht.
Der Sinn warum mir das so wichtig ist, ist weil ich vorher prüfen will ob das Ausgangsbild bereits erstellt wurde so muss es nicht nochmal erstellt werden.
Das so erstellte Ausgangsbild soll aber wie oben gesehen zusätzliche kleinere Bilder bekommen und als neues ganzes Bild abgespeichert werden unter andren Namen. Das Ausgangsbild soll also nicht verändert werden.
Hier mal der Ausschnitt wo das deutlicher wird was ich meine:
Es soll praktisch nur dann Rechenarbeit produzieren wenn es noch nicht erstellt wurde oder sich was geändert hat.
Ich bin sehr dankbar für eure Anregungen und die Zeit fürs lesen oder Antworten.
Hier steh ich auf dem Schlauch und allein krieg ich da nicht hin jedenfalls nicht innerhalb einiger Tage oder Wochen.
Zum Schluss nochmal das ganze Skript wenn es wer braucht oder wem intressiert. Es funktioniert soweit tadelos ist aber alles auf mein Div und dessen Grösse zugeschnitten.
Ich habe am Ende dieses Posts mal das gesamte Skript hingesetzt falls es den einen oder andren intressiert.
Ich denke man wird schnell erkennen um was sich diese Skript dreht.
Zu der Frage:
Kann ich diese Codezeilen
PHP:
for ($i=0; $i < (count($PosX)); $i++) {
$Points = array(($PosX[$i] - $UserMapX)*10+$DIVmitteX-5-1, // Koordinaten, ab wo kopiert werden soll (erst X, dann Y).
($PosY[$i] - $UserMapY)*10+$DIVmitteY-5-1); // Berechnung aller Positionen der erfassten Spieler
$new = imageCreateFromJPEG("img/Usermaps/MAP1_$Mapowner.jpg"); //Original
if (($PosX[$i]==$UserMapX) AND ($PosY[$i]==$UserMapY)) {
$grafix = imageCreateFromGIF("img/list12x12-dot18.gif"); // roten Punkt zeichnen für die eigne Position
}
else {
$grafix = imageCreateFromGIF("img/list12x12-dot19.gif"); // schwarzer Punkt für alle andren Spieler
}
imageCopyResampled($new, $grafix,
$Points[0],$Points[1], /* imagecopy() an berechnete Stelle ($Points) in $new, */
0, 0, /* der zu kopierende Bereich beginnt in $ballgrey bei ( 0, 0) */
12, 12,12,12); /* und ist x Pixel breit und y Pixel hoch */
imageJPEG($new,"img/Usermaps/MAP1_$Mapowner.jpg",100);
}
ändern das es die Schleife so nicht benötigt? Vieleicht mit einem Array?
Das Problem ist ich möchte das Ausgangsbild nicht verändern sondern es soll ein neues Bild mit andren Namen enstehen. Das geht aber in so einer Schleife nicht da ja jede Position die dazu kommt das Bild verändert und den selben Namen des Bildes braucht.
Der Sinn warum mir das so wichtig ist, ist weil ich vorher prüfen will ob das Ausgangsbild bereits erstellt wurde so muss es nicht nochmal erstellt werden.
Das so erstellte Ausgangsbild soll aber wie oben gesehen zusätzliche kleinere Bilder bekommen und als neues ganzes Bild abgespeichert werden unter andren Namen. Das Ausgangsbild soll also nicht verändert werden.
Hier mal der Ausschnitt wo das deutlicher wird was ich meine:
PHP:
//// Alle Spieler aus Datenbank lesen und in ein Array speichern.
{
$sql = "SELECT
Username,
PosX,
PosY
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()) {
$PosX[] = $row["PosX"];
$PosY[] = $row["PosY"];
$koordArray[$row['PosX']][$row['PosY']]= $row['Username'];
}
}
//// 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";
$file2= "img/Usermaps/MAP1_$Mapowner.jpg";
if (file_exists($file) == false OR file_exists($file2) == 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
imageJPEG($new,"img/Usermaps/MAP1_$Mapowner.jpg",100); // Bild speichern
}
//// Überprüfen ob sich die Positionen in der Datenbank geändert haben oder nicht
if (isset($_SESSION['Positionen']) AND $koordArray != $_SESSION['Positionen'] OR !isset($_SESSION['Positionen'])) {
if (isset($_SESSION['Positionen'])) {
unset($_SESSION['Positionen']);
$_SESSION['Positionen'] = $koordArray;
}
else {
$_SESSION['Positionen'] = $koordArray;
}
//// Positionen als Bilder in die Karte kopieren ////
for ($i=0; $i < (count($PosX)); $i++) {
$Points = array(($PosX[$i] - $UserMapX)*10+$DIVmitteX-5-1, // Koordinaten, ab wo kopiert werden soll (erst X, dann Y).
($PosY[$i] - $UserMapY)*10+$DIVmitteY-5-1); // Berechnung aller Positionen der erfassten Spieler
$new = imageCreateFromJPEG("img/Usermaps/MAP1_$Mapowner.jpg"); //Original
if (($PosX[$i]==$UserMapX) AND ($PosY[$i]==$UserMapY)) {
$grafix = imageCreateFromGIF("img/list12x12-dot18.gif"); // roten Punkt zeichnen für die eigne Position
}
else {
$grafix = imageCreateFromGIF("img/list12x12-dot19.gif"); // schwarzer Punkt für alle andren Spieler
}
imageCopyResampled($new, $grafix,
$Points[0],$Points[1], /* imagecopy() an berechnete Stelle ($Points) in $new, */
0, 0, /* der zu kopierende Bereich beginnt in $ballgrey bei ( 0, 0) */
12, 12,12,12); /* und ist x Pixel breit und y Pixel hoch */
imageJPEG($new,"img/Usermaps/MAP1_$Mapowner.jpg",100);
}
}
Es soll praktisch nur dann Rechenarbeit produzieren wenn es noch nicht erstellt wurde oder sich was geändert hat.
Ich bin sehr dankbar für eure Anregungen und die Zeit fürs lesen oder Antworten.
Hier steh ich auf dem Schlauch und allein krieg ich da nicht hin jedenfalls nicht innerhalb einiger Tage oder Wochen.
Zum Schluss nochmal das ganze Skript wenn es wer braucht oder wem intressiert. Es funktioniert soweit tadelos ist aber alles auf mein Div und dessen Grösse zugeschnitten.
PHP:
<div id="content-pic">
</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
$DIVmitteX=271.5;
$DIVmitteY=216; // Mitte des Divs/ angezeigter Bereich der Karte
$NearestKoordsX1 = $UserMapX-28;
$NearestKoordsX2 = $UserMapX+28;
$NearestKoordsY1 = $UserMapY-22; // Erfassung aller Spieler des Kartenausschnittes
$NearestKoordsY2 = $UserMapY+22;
$Mapowner = $Username;
//// Abweichende Berechnung bei Kartenrandnähe ansonsten wird Spieler immer auf der Mitte angezeigt
if ($UserMapX<28) {
$SlicepointX = 0;
$NearestKoordsX1 = 0;
$NearestKoordsX2 = 56;
$DIVmitteX=276-((28-$UserMapX)*10);
}
if ($UserMapX>172) {
$SlicepointX = 1457;
$NearestKoordsX2 = 201;
$NearestKoordsX1 = 145;
$DIVmitteX=257+(($UserMapX-172)*10);
}
if ($UserMapY<22) {
$SlicepointY = 0;
$NearestKoordsY1 = 0;
$NearestKoordsY2 = 44;
$DIVmitteY=216-((22-$UserMapY)*10);
}
if ($UserMapY>178) {
$SlicepointY = 1568;
$NearestKoordsY2 = 201;
$NearestKoordsY1 = 156;
$DIVmitteY=206+(($UserMapY-178)*10);
}
//// Alle Spieler aus Datenbank lesen und in ein Array speichern.
{
$sql = "SELECT
Username,
PosX,
PosY
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()) {
$PosX[] = $row["PosX"];
$PosY[] = $row["PosY"];
$koordArray[$row['PosX']][$row['PosY']]= $row['Username'];
}
}
$dir= "img/Map/$SlicepointX";
if (file_exists($dir) == false) {
mkdir("img/Map/$SlicepointX", 0700);
}
$file= "img/Map/$SlicepointX/$SlicepointY.jpeg";
$file2= "img/Usermaps/MAP1_$Mapowner.jpg";
if (file_exists($file) == false OR file_exists($file2) == false) {
//// 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
imageJPEG($new,"img/Usermaps/MAP1_$Mapowner.jpg",100); // Bild speichern
}
if (isset($_SESSION['Positionen']) AND $koordArray != $_SESSION['Positionen'] OR !isset($_SESSION['Positionen'])) {
if (isset($_SESSION['Positionen'])) {
unset($_SESSION['Positionen']);
$_SESSION['Positionen'] = $koordArray;
}
else {
$_SESSION['Positionen'] = $koordArray;
}
for ($i=0; $i < (count($PosX)); $i++) {
$Points = array(($PosX[$i] - $UserMapX)*10+$DIVmitteX-5-1, // Koordinaten, ab wo kopiert werden soll (erst X, dann Y).
($PosY[$i] - $UserMapY)*10+$DIVmitteY-5-1); // Berechnung aller Positionen der erfassten Spieler
$new = imageCreateFromJPEG("img/Usermaps/MAP1_$Mapowner.jpg"); //Original
if (($PosX[$i]==$UserMapX) AND ($PosY[$i]==$UserMapY)) {
$grafix = imageCreateFromGIF("img/list12x12-dot18.gif"); // roten Punkt zeichnen für die eigne Position
}
else {
$grafix = imageCreateFromGIF("img/list12x12-dot19.gif"); // schwarzer Punkt für alle andren Spieler
}
imageCopyResampled($new, $grafix,
$Points[0],$Points[1], /* imagecopy() an berechnete Stelle ($Points) in $new, */
0, 0, /* der zu kopierende Bereich beginnt in $ballgrey bei ( 0, 0) */
12, 12,12,12); /* und ist x Pixel breit und y Pixel hoch */
imageJPEG($new,"img/Usermaps/MAP1_$Mapowner.jpg",100);
}
}
//// Anzeige aller Positionen
echo "<map name=\"map\">"; //HTMLCode Anfangstag soll ein "Mouseover" zum anzeigen der Namen und Positionen gennerieren.
for ($PlayerPosX=$NearestKoordsX1; $PlayerPosX<$NearestKoordsX2; $PlayerPosX++) {
for ($PlayerPosY=$NearestKoordsY1; $PlayerPosY<$NearestKoordsY2; $PlayerPosY++) {
if (isset($koordArray[$PlayerPosX][$PlayerPosY]) && $koordArray[$PlayerPosX][$PlayerPosY] != "") {
$Name=$koordArray[$PlayerPosX][$PlayerPosY];
$Titlepos = array(($PlayerPosX - $UserMapX)*10+$DIVmitteX-6,
($PlayerPosY - $UserMapY)*10+$DIVmitteY-6,
($PlayerPosX - $UserMapX)*10+$DIVmitteX+4, //Array für Title(und oder Link)-generirung Positionen
($PlayerPosY - $UserMapY)*10+$DIVmitteY+4);
echo "<area shape=\"rect\" coords=\"$Titlepos[0],$Titlepos[1],$Titlepos[2],$Titlepos[3]\"
href=\"main.php?section=erkunden\" title=\"$Name: $PlayerPosX,$PlayerPosY\">\n"; //HTMLCode Position und Titel
}
else {
$Titlepos = array(($PlayerPosX - $UserMapX)*10+$DIVmitteX-6,
($PlayerPosY - $UserMapY)*10+$DIVmitteY-6,
($PlayerPosX - $UserMapX)*10+$DIVmitteX+4, //Array für Title(und oder Link)-generirung Positionen
($PlayerPosY - $UserMapY)*10+$DIVmitteY+4);
echo "<area shape=\"rect\" coords=\"$Titlepos[0],$Titlepos[1],$Titlepos[2],$Titlepos[3]\"
href=\"main.php?section=erkunden\" title=\"$PlayerPosX,$PlayerPosY\">\n"; //HTMLCode Position und Titel
}
}
}
echo "</map>"; //HTMLCode schliessendes Maptag.. erst hier ist die Maptabelle vollständig.
echo "<img src='img/Usermaps/MAP1_$Mapowner.jpg' width='543' height='432' border='0' alt='Karte' usemap='#map'>"; //zeigt Karte mit Positionen und Mouseover
/**
* Formel für Positionsanzeige aller Spieler des Kartenausschnittes:
* ($PosXOtherPlayer - $UserMapX) * 10 (Feld =10*10Pixel bei Feldgrösse 200*200 (Karte ist 2000*2000 Pixel) +
* $DIVmitteX(DIV/BildMittelPunktberechnung) -5 Mitte des Feldes(Feld 10*10) -1 Rest des ball.gif (teils transparent deswegen keine Überlagerung)
* ($PosYOtherPlayer - $UserMapY) * 10 (Feld =10*10Pixel bei Feldgrösse 200*200 (Karte ist 2000*2000 Pixel) +
* $DIVmitteX(DIV/BildMittelPunktberechnung) -5 Mitte des Feldes -4 Mitte des ball.gif (teils transparent deswegen keine Überlagerung)
* $Points = array(($PosXOtherPlayer - $UserMapX)*10+$DIVmitteX-5-1,
($PosYOtherPlayer - $UserMapY)*10+$DIVmitteY-5-1); */
?>
</div>
</div>
<div id="upper-pic">
</div>
<div id="uppercontent">
<h2><?php
echo "Benötigte Dauer: ".(microtime(true)-$start)." Sekunden";
//unset($_SESSION['Positionen']);
//echo "unset ";
?></h2>
</div>