• Hallo Besucher!

    Du bist neu im Forum? Dann registriere dich hier, um Diskussionen beizutreten oder eigene Themen zu erstellen. Für die Registrierung ist es erforderlich, dass du einen Spielaccount bei Die Stämme hast.

    Andernfalls kannst du dich hier direkt einloggen.

    Falls du dein Passwort vergessen hast, kannst du hier ein neues Passwort anfordern.

[PHP-Source] Server 3 Koordinaten nach x/y

DeletedUser

Gast
Moin,

wer mit seinen Scripten in den Maps herumsucht benötigt zur Dorfidentifikation eine Umrechung der neuen DS-Kords auf die alten x/y Werte.

Ich denke mit folgendem Source sollte es funktionieren. Habe ein paar Kords getestet und die stimmen alle..

Code:
<?

$res = karte(66,4,0);
print_r( $res );

function karte($a, $b, $c) {

   // Zuerst Kontinent auswählen
   if ( $a < 10 ) $a = "0".$a;
   if ( $b < 10 ) $b = "0".$b;
   if ( $c < 10 ) $c = "0".$c;
   
   $y = substr($a,0,1) ;
   $x = substr($a,1,1);
   
   $res_x = $x * 50;
   $res_y = $y * 50;
   
   // Jetzt den Sektor auswählen
   $y = substr($b,0,1);
   $x = substr($b,1,1);
   $res_x += $x * 5;
   $res_y += $y * 5;
   
   // Und nun das Dorf
   $y = floor( $c / 5 );
   $x = $c - $y * 5;
   
   $res_x += $x;
   $res_y += $y;
   
   return array ('x' => $res_x, 'y' => $res_y);

}


?>

Daraus ergibt sich
Code:
  Array ( [x] => 320 [y] => 300 )

Wenn ihrs nutzt informiert mich doch kurz wo ;)
 

DeletedUser15328

Gast
Und wenn man z.B. eine Karte bei 0|0 statt bei 250|250 zentrieren will, verwendet man zusätzlich noch:

$y = 250 - $y;
$x = $x - 250;
 

DeletedUser

Gast
Ungläubige! Das ist ja eine billige Lösung, was wenn die Karte nicht 10 x 10, sondern 12 x 12 Kontinente hat oder ein Sektor aus 7 x 7 Dörfern besteht? Das Script ist zu unflexibel.
 

DeletedUser12983

Gast
Blinky schrieb:
Ungläubige! Das ist ja eine billige Lösung, was wenn die Karte nicht 10 x 10, sondern 12 x 12 Kontinente hat oder ein Sektor aus 7 x 7 Dörfern besteht? Das Script ist zu unflexibel.

Schreib was besseres auf die Schnelle.
 

DeletedUser12871

Gast
Die intern verwendete Funktion:

Code:
define('CON_COUNT', 10);
define('SEC_COUNT', 10);
define('SUB_COUNT', 5);

function coord_to_xy($con, $sec, $sub) {
	$x = $sub%SUB_COUNT + ($sec%SEC_COUNT)*SUB_COUNT + ($con%CON_COUNT)*SUB_COUNT*SEC_COUNT;
	$y = floor($sub/SUB_COUNT) + floor($sec/SEC_COUNT)*SUB_COUNT + floor($con/CON_COUNT)*SUB_COUNT*SEC_COUNT;
	return array($x, $y);
}
 

DeletedUser

Gast
Blinky schrieb:
Ungläubige! Das ist ja eine billige Lösung, was wenn die Karte nicht 10 x 10, sondern 12 x 12 Kontinente hat oder ein Sektor aus 7 x 7 Dörfern besteht? Das Script ist zu unflexibel.

Ach und das wird in der nächsten zeit geändert? Aber was ist wenn die Sektoren nicht mehr quadratisch sind sondern Ellipsenförmig? Hui... Oder Dreiecke?

Scherz beiseite - habe mir nacher auch gedacht das ich alles mittels floor hätte berechnen können wie im letzen Beispiel aber dann hatte ich einfach keine Lust mehr er zu ändern...

Tobias
 

DeletedUser

Gast
Code:
function xy_to_coord($x, $y) {
  $con = floor($x/(SEC_COUNT*SUB_COUNT)) + floor($y/(SEC_COUNT*SUB_COUNT))*CON_COUNT;
  $sec = floor(($x%(SEC_COUNT*SUB_COUNT))/SUB_COUNT) +  floor(($y%(SEC_COUNT*SUB_COUNT))/SUB_COUNT)*SEC_COUNT;
  $sub = ($x%(SEC_COUNT*SUB_COUNT))%SUB_COUNT + (($y%(SEC_COUNT*SUB_COUNT))%SUB_COUNT)*SUB_COUNT;
  return array($con, $sec, $sub);
}
Das müsste der Rückweg sein.
 

DeletedUser13504

Gast
wieso empfinde ich hier nur sogut wie jede geschriebene zeile als unstrukturiert und unkommentiert?
 

DeletedUser

Gast
Würde es euch was ausmachen, On Topic zu bleiben und das Spammen wo anders zu machen?
 

DeletedUser15328

Gast
otze schrieb:
wieso empfinde ich hier nur sogut wie jede geschriebene zeile als unstrukturiert und unkommentiert?

Weil ich z.B. keine Kommentare brauche, um mich zurecht zu finden? (In meinen Codes zumindest ^^)
 

DeletedUser

Gast
Jede 6. Zeile meines Sources ist ein Kommentar - das ist doch legtim ;)

Tobias
 

DeletedUser

Gast
exception schrieb:
Die intern verwendete Funktion:

Code:
define('CON_COUNT', 10);
define('SEC_COUNT', 10);
define('SUB_COUNT', 5);

function coord_to_xy($con, $sec, $sub) {
	$x = $sub%SUB_COUNT + ($sec%SEC_COUNT)*SUB_COUNT + ($con%CON_COUNT)*SUB_COUNT*SEC_COUNT;
	$y = floor($sub/SUB_COUNT) + floor($sec/SEC_COUNT)*SUB_COUNT + floor($con/CON_COUNT)*SUB_COUNT*SEC_COUNT;
	return array($x, $y);
}

Funktioniert das von t-o-b-i wirklich? Ich versuche gerade das PHP nach .net Umzusetzen... :(
 

DeletedUser

Gast
Also bei mir ging es.. Habe 15 Koordinaten geprüft (in unterschiedlich Kontinenten/Sektoren) und konnte keinen Fehler entdecken..

Kanns aber nicht garantieren..

Tobias
 

DeletedUser

Gast
t-o-b-i schrieb:
Also bei mir ging es.. Habe 15 Koordinaten geprüft (in unterschiedlich Kontinenten/Sektoren) und konnte keinen Fehler entdecken..

Meins läuft nicht. :(
Schmeißt auch für S3 negative Werte.


PHP %
.net MOD

PHP /
.net /
8/3 = 2.6666

Keine Ahnung bisher, warum das nicht läuft... o_O
 

DeletedUser

Gast
Blinky schrieb:
Code:
function xy_to_coord($x, $y) {
  $con = floor($x/(SEC_COUNT*SUB_COUNT)) + floor($y/(SEC_COUNT*SUB_COUNT))*CON_COUNT;
  $sec = floor(($x%(SEC_COUNT*SUB_COUNT))/SUB_COUNT) +  floor(($y%(SEC_COUNT*SUB_COUNT))/SUB_COUNT)*SEC_COUNT;
  $sub = ($x%(SEC_COUNT*SUB_COUNT))%SUB_COUNT + (($y%(SEC_COUNT*SUB_COUNT))%SUB_COUNT)*SUB_COUNT;
  return array($con, $sec, $sub);
}
Das müsste der Rückweg sein.

Kann doch gar nicht. Wenn ich negative Werte habe, kann das doch nicht hinhauen... o_O
 

DeletedUser

Gast
Blinky schrieb:
Code:
function xy_to_coord($x, $y) {
  $con = floor($x/(SEC_COUNT*SUB_COUNT)) + floor($y/(SEC_COUNT*SUB_COUNT))*CON_COUNT;
  $sec = floor(($x%(SEC_COUNT*SUB_COUNT))/SUB_COUNT) +  floor(($y%(SEC_COUNT*SUB_COUNT))/SUB_COUNT)*SEC_COUNT;
  $sub = ($x%(SEC_COUNT*SUB_COUNT))%SUB_COUNT + (($y%(SEC_COUNT*SUB_COUNT))%SUB_COUNT)*SUB_COUNT;
  return array($con, $sec, $sub);
}
Das müsste der Rückweg sein.

Mit dem Code von Exe gibt 50/50/0 = 0/275, mit Deinem 0/275 = 50/0/0
 

DeletedUser

Gast
oobdoo schrieb:
Blinky schrieb:
Code:
function xy_to_coord($x, $y) {
  $con = floor($x/(SEC_COUNT*SUB_COUNT)) + floor($y/(SEC_COUNT*SUB_COUNT))*CON_COUNT;
  $sec = floor(($x%(SEC_COUNT*SUB_COUNT))/SUB_COUNT) +  floor(($y%(SEC_COUNT*SUB_COUNT))/SUB_COUNT)*SEC_COUNT;
  $sub = ($x%(SEC_COUNT*SUB_COUNT))%SUB_COUNT + (($y%(SEC_COUNT*SUB_COUNT))%SUB_COUNT)*SUB_COUNT;
  return array($con, $sec, $sub);
}
Das müsste der Rückweg sein.

Kann doch gar nicht. Wenn ich negative Werte habe, kann das doch nicht hinhauen... o_O

Hmm, stellt dich die Frage... kann man eine S1-Map mit negativen Werten überhaupt in eine S3-Map umrechnen?
 

DeletedUser

Gast
oobdoo schrieb:
Blinky schrieb:
Code:
function xy_to_coord($x, $y) {
  $con = floor($x/(SEC_COUNT*SUB_COUNT)) + floor($y/(SEC_COUNT*SUB_COUNT))*CON_COUNT;
  $sec = floor(($x%(SEC_COUNT*SUB_COUNT))/SUB_COUNT) +  floor(($y%(SEC_COUNT*SUB_COUNT))/SUB_COUNT)*SEC_COUNT;
  $sub = ($x%(SEC_COUNT*SUB_COUNT))%SUB_COUNT + (($y%(SEC_COUNT*SUB_COUNT))%SUB_COUNT)*SUB_COUNT;
  return array($con, $sec, $sub);
}
Das müsste der Rückweg sein.

Mit dem Code von Exe gibt 50/50/0 = 0/275, mit Deinem 0/275 = 50/0/0

Also ich hab weiter rumprobiert... es scheint als wäre die Formel falsch und würde die Sektoren falsch gerechnen...
 

DeletedUser

Gast
oobdoo schrieb:
oobdoo schrieb:
Blinky schrieb:
Code:
function xy_to_coord($x, $y) {
  $con = floor($x/(SEC_COUNT*SUB_COUNT)) + floor($y/(SEC_COUNT*SUB_COUNT))*CON_COUNT;
  $sec = floor(($x%(SEC_COUNT*SUB_COUNT))/SUB_COUNT) +  floor(($y%(SEC_COUNT*SUB_COUNT))/SUB_COUNT)*SEC_COUNT;
  $sub = ($x%(SEC_COUNT*SUB_COUNT))%SUB_COUNT + (($y%(SEC_COUNT*SUB_COUNT))%SUB_COUNT)*SUB_COUNT;
  return array($con, $sec, $sub);
}
Das müsste der Rückweg sein.

Mit dem Code von Exe gibt 50/50/0 = 0/275, mit Deinem 0/275 = 50/0/0

Also ich hab weiter rumprobiert... es scheint als wäre die Formel falsch und würde die Sektoren falsch gerechnen...

Huuuuuiii, lange wach bleiben lohnt sich doch wohl. :)

Da war in der Umkehr-Funktion von Blinky ein Schreibfehler drin. Scheint jetzt bei mir hinzuhauen. B)

... (kurze Schrei-Pause)...

...weil es so schön war....

... (kurze Schrei-Pause)...


o_O

Von wegen sein Fehler... ich hatte mich verschrieben und es Stundenlang nicht gesehen... :S

... (ganz lange Schrei-Pause)...

$sec = floor(($x%(SEC_COUNT*SUB_COUNT))/SUB_COUNT) + floor(($y%(SEC_COUNT*SUB_COUNT))/SUB_COUNT)*SEC_COUNT;

Bei mir stand da SUB_COUNT :S

... (ganz lange Schrei-Pause)...

...

ich hör nicht mehr auf damit... :mad:

...
 

DeletedUser16423

Gast
Warum führt Ihr keine vierte Konstante ein; das Produkt aus
Code:
SEC_COUNT*SUB_COUNT
?

Damit würde der Code lesbarer und schneller (wenn vielleicht auch nur marginal).
 

DeletedUser

Gast
Hy habe ich mich nur noch net richtig gefunden oder gibt es auch ein Scrip für den umgedrehten weg??
 
Oben