Ich beschäftige mich schon seit längerem mit einem XY Koordinatensystem und der daraus erstellbaren Karte. Ich habe in der Datenbank wieschon erwähnt also meine Einträge. Einmal die X, dann die Y und zuguterletzt die Userid. Auslesen kann ich die Daten und ein "Sichtfeld" für betreffende Spieler habe ich ebenfalls eingerichtet. Nun stellt sich bei mir nur folgendes Problem: Die Erstellung der Karte. Hierbei stellt sich bei mir folgendes Problem und zwar habe ich nur Einträge, wo schon user sind und nun habe ich das Problem, dass ich natürlich die Felder die keinen Besitzer haben auch anzeigen lassen will. Ich kann die Daten nicht mit einer Schleife auslesen, weil er mir dann die Inseln die Leer sind auslässt, was ja dann zu chaos führen würde und mal eben bei einem Koordinatensystem von 250x250 alle Felder nachzutragen dürfte sehr an der Datenbank zerren....*gg*
Mein 2. Problem liegt dann noch bei der erstellung der Karte die 5x5 groß ist, aber das geht dann meines erachtens besser zu lösen, wenn ich erstmal 25 felder ausgelesen habe
XY Koordinatensystem mit Karte
gepostet vor 18 Jahre, 10 Monate von -Chronos-
gepostet vor 18 Jahre, 10 Monate von _Jan_
Bei den Feldern bei denen nichts in der DB steht stellst du einfach eine Standardinsel da. (Frage richtig verstanden?) Bei Problemen beim grundsätzlichen Kartenaufbau bzg. X u. Y Koordinate einfach nochmal melden, hab dazu in einem anderen Forum ein kurzes Tutorial geschrieben.
gepostet vor 18 Jahre, 10 Monate von -Chronos-
Ich will die Karte anzeigen lassen...diese soll 5x5 felder groß sein. Mein problem ist, das ich ja nur die Felder darstellen kann wo ich auch Infos von habe und 25 querries zu machen wäre zu perfomancelastig.....----kannst du mir mal den link zu deinem tut geben....der könnte mir vllt helfen mich mehr in das Thema reinzulesen =)
MFG
MFG
gepostet vor 18 Jahre, 10 Monate von Mudder
Frage alle "Inseln" ab die in dem Koordinatenpunkt liegen
X: 5-10
Y: 20-25
Nun per Schleife Feld für Feld abfragen und schauen obs an den Koordinaten eine Insel gibt. Wenn ja wird diese angezeigt, ansonsten eben ein "Meeresfeld".
X: 5-10
Y: 20-25
WHERE x >= 5 AND x <= 10 AND y >= 20 AND y <= 25
Nun per Schleife Feld für Feld abfragen und schauen obs an den Koordinaten eine Insel gibt. Wenn ja wird diese angezeigt, ansonsten eben ein "Meeresfeld".
gepostet vor 18 Jahre, 10 Monate von -Chronos-
also einfach 25 querries machen?
ist das nicht sehr datenbankbelastend, wenn ich 25 mal ne abfage mache?
ist das nicht sehr datenbankbelastend, wenn ich 25 mal ne abfage mache?
gepostet vor 18 Jahre, 10 Monate von Klaus
Es wäre einfacher wenn du für jedes Feld einen Datensatz in der DB hast.
Oder du wenn du in der Schleife bist: Berechne die Koordinaten in PHP und vergeliche das mit dem was MySQL dir leifert. Wenns nicht stimmt kommt halt solange Wasser bis du an der Insel bist.
Oder du wenn du in der Schleife bist: Berechne die Koordinaten in PHP und vergeliche das mit dem was MySQL dir leifert. Wenns nicht stimmt kommt halt solange Wasser bis du an der Insel bist.
gepostet vor 18 Jahre, 10 Monate von -Chronos-
Für jedes Feld?
Das heisst ich lasse eine Schleife durchlaufen die mir die passenden Koordinaten erstellt und in der Schleife lasse ich direkt schauen, was es für eine Insel ist?
Dass hiesse ich müsste aber alle koordinaten belegt haben ich habe aber nur bisher belegte Koordinaten eingetragen was heisst ich müsste im endeffekt entweder alle anderen felder reinschreiben bzw ich müsste 25 einzelüberprüfungen machen...
nur das ist immoment mein problem...beide möglichkeiten sind doch nicht optimal, oder? kann mir mal jemand mit einem passenden beispiel helfen?
Das heisst ich lasse eine Schleife durchlaufen die mir die passenden Koordinaten erstellt und in der Schleife lasse ich direkt schauen, was es für eine Insel ist?
Dass hiesse ich müsste aber alle koordinaten belegt haben ich habe aber nur bisher belegte Koordinaten eingetragen was heisst ich müsste im endeffekt entweder alle anderen felder reinschreiben bzw ich müsste 25 einzelüberprüfungen machen...
nur das ist immoment mein problem...beide möglichkeiten sind doch nicht optimal, oder? kann mir mal jemand mit einem passenden beispiel helfen?
gepostet vor 18 Jahre, 10 Monate von Magic007
also bei mir suche ich alle felder
SELECT * FROM islands WHERE x = x AND y = y AND userid != 0
dann zeigst du eben alle informationen an und wenn 0 dann eben wassser?
Wo ist da dein Prob?
wasser zu generieren dürfte doch deiner perfomance nicht schaden oder?
SELECT * FROM islands WHERE x = x AND y = y AND userid != 0
dann zeigst du eben alle informationen an und wenn 0 dann eben wassser?
Wo ist da dein Prob?
wasser zu generieren dürfte doch deiner perfomance nicht schaden oder?
gepostet vor 18 Jahre, 10 Monate von -Chronos-
Mein Problem besteht darin, das ich eben NUR BESETZTE felder eingetragen habe, es gibt also keine felder mit userid 0 oder -1
Und wenn ich nur einen bruchteil für eine Karte auslesen kann, woher soll ich dann den rest hernehmen???!?....
Ich hoffe ich habe mich nun verständlicher ausgedrückt *gg*
Und wenn ich nur einen bruchteil für eine Karte auslesen kann, woher soll ich dann den rest hernehmen???!?....
Ich hoffe ich habe mich nun verständlicher ausgedrückt *gg*
gepostet vor 18 Jahre, 10 Monate von Störti
Kann ja sein, dass ich da jetzt was falsch vertanden habe, aber du willst doch, dass in einem Quadrat von 5x5 (dessen Position du kennst) alle Inseln ausgegeben werden, die dort sind, oder?
Speichere in deinen Inseln doch auch die Kordinaten ab, dann kannst du mit einer Abfrage einfach sämtliche Inseln rauslesen, die im entsprechenden Sektor liegen.
Das liesst du dann erstmal aus und packst das in ein zweisimensionales Array:
Dann mit zwei ineinander gelegten FOR-Schleifen jedes potentielle Feld auf eine Insel absuchen (im Array), wenn islands[x][y] definiert ist, ist dort was und sonst halt nur Wasser.
Auf jeden Fall würde ich es vermeiden, tatsächlich 25 Queries auszuführen, das zieht bei genügender Masse schon am Server...
Speichere in deinen Inseln doch auch die Kordinaten ab, dann kannst du mit einer Abfrage einfach sämtliche Inseln rauslesen, die im entsprechenden Sektor liegen.
SELECT * FROM islands WHERE x BETWEEN(5,10) AND y BETWEEN(0,5);
Das liesst du dann erstmal aus und packst das in ein zweisimensionales Array:
islands[x][y] = $data
Dann mit zwei ineinander gelegten FOR-Schleifen jedes potentielle Feld auf eine Insel absuchen (im Array), wenn islands[x][y] definiert ist, ist dort was und sonst halt nur Wasser.
Auf jeden Fall würde ich es vermeiden, tatsächlich 25 Queries auszuführen, das zieht bei genügender Masse schon am Server...
gepostet vor 18 Jahre, 10 Monate von -Chronos-
Also....mein problem steht genau in der Umsetzung in dem von dir genannten Aspekt:
SELECT * FROM islands WHERE x BETWEEN ($x-2) AND ($x+2) AND y BETWEEN ($y-2) AND ($y+2)
So...bis dahin verstehe ich ja noch alles....nun mein Problem. Ich habe wiegesagt nur besetzte Felder eingetragen...und nun bekomme ich z.b. folgendes Ergebniss
1|1|13
1|3|7
2|3|3
3|3|9
Ich will aber eine Tabelle füllen inder ich 25 Felder decken muss, nur in dem Sektor sind 4 Inseln befüllt und die restlichen leer (nicht eingetragen)...mein Problem liegt im Wie...ich weiss nicht wie ich da rangehen soll
SELECT * FROM islands WHERE x BETWEEN ($x-2) AND ($x+2) AND y BETWEEN ($y-2) AND ($y+2)
So...bis dahin verstehe ich ja noch alles....nun mein Problem. Ich habe wiegesagt nur besetzte Felder eingetragen...und nun bekomme ich z.b. folgendes Ergebniss
x|y|userid
1|1|13
1|3|7
2|3|3
3|3|9
Ich will aber eine Tabelle füllen inder ich 25 Felder decken muss, nur in dem Sektor sind 4 Inseln befüllt und die restlichen leer (nicht eingetragen)...mein Problem liegt im Wie...ich weiss nicht wie ich da rangehen soll
gepostet vor 18 Jahre, 10 Monate von Störti
Dazu war der untere Teil meines Posts gedacht.
Wenn du die Abfrage startest, bekommst du alle Inseln in diesem Sektor ausgegeben, das ist schon mal gut.
Dann erzeugst du ein Array, in welchem du alle Daten reinschreibst:
{
$islands[$row['x']][$row['y']] = $row['user_id'];
}
Dann hast du in einem zweisimensionalen Array alle vorhandenen Inseln stehen:
$island[1][1] = 13
$island[1][3] = 7
$island[2][3] = 3
$island[3][3] = 9
Alle Felder, in denen eine Insel liegt, sind jetzt in diesem Array mit der User-ID belegt. Wenn du das Feld dreidimensional machst, kannst du noch mehr Daten speichern. Alle Felder, in denen keine Insel liegt, sind nicht im Array definiert.
Nun weisst du ja, dass jeder deiner Sektoren genau 5 Felder breit und 5 Felder lang ist.
Also startest du zwei FOR-Schleifen, die sämtliche mögliche Felder prüfen, ob da was drin ist.
{
for ( $j = 1; $j <= 5; $j++ )
{
if ( isset($islands[$i][$j] )
{
// mache irgendwas, denn da is ne Insel
}
else
{
// mache was anderes, da ist keine Insel
}
} //END FOR2
} //END FOR1
Wenn du die Abfrage startest, bekommst du alle Inseln in diesem Sektor ausgegeben, das ist schon mal gut.
Dann erzeugst du ein Array, in welchem du alle Daten reinschreibst:
while ( $row = mysql_fetch_array($result) )
{
$islands[$row['x']][$row['y']] = $row['user_id'];
}
Dann hast du in einem zweisimensionalen Array alle vorhandenen Inseln stehen:
$island[1][1] = 13
$island[1][3] = 7
$island[2][3] = 3
$island[3][3] = 9
Alle Felder, in denen eine Insel liegt, sind jetzt in diesem Array mit der User-ID belegt. Wenn du das Feld dreidimensional machst, kannst du noch mehr Daten speichern. Alle Felder, in denen keine Insel liegt, sind nicht im Array definiert.
Nun weisst du ja, dass jeder deiner Sektoren genau 5 Felder breit und 5 Felder lang ist.
Also startest du zwei FOR-Schleifen, die sämtliche mögliche Felder prüfen, ob da was drin ist.
for ( $i = 1; $i <= 5; $i++ )
{
for ( $j = 1; $j <= 5; $j++ )
{
if ( isset($islands[$i][$j] )
{
// mache irgendwas, denn da is ne Insel
}
else
{
// mache was anderes, da ist keine Insel
}
} //END FOR2
} //END FOR1
gepostet vor 18 Jahre, 10 Monate von _Jan_
dito
das was oben einige geschrieben haben ist quatsch, bei sovielen DB Querys würde dein Server zusammenbrechen
das was oben einige geschrieben haben ist quatsch, bei sovielen DB Querys würde dein Server zusammenbrechen
gepostet vor 18 Jahre, 10 Monate von Klaus
Ich glaube es handelt sich um ein Missverständnis. Es wird nur ein MySQL Query ausgeführt und die Ergebnisse werden dann über while($row = mysql_fetch_array()) geholt. Das ist doch die Standardprozedur!