• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Browsergame Map - Teile dynamisch laden

chucky2361

New member
Hallo Leute,

Ich bins mal wieder, hab schon mal bezüglich einer Map hier gepostet und mir wurde auch ein bisschen geholfen :)

Jedoch stehe ich nun wieder vor einem Problem :/
Ich habe nun eine die Karte, sie wird auch erstellt und angezeit. Sogar per Jquery draggable kann man sie bewegen...

Nur mein Problem ist ich weiß nicht wie ich es schaffe das ich jetzt die richtigen Teile dazulade und auf die richtigen Stelle setze.

ich poste hier mal meinen gesamten Code:

Code:
<html>
	
<head>
<script type="text/javascript" src="js/jquery/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/jquery_ui/jquery-ui-1.10.4.custom.min.js"></script>
</head>
<script type="text/javascript">
	$(document).ready(function() {
		// Kartenbreite & Kartenhöhe
		var map_width;
		var map_height;
		// Breite & Höhe eines Feldes in Pixel
		var field_width_px;
		var field_height_px;
		// Fensterbreite & Fensterhöhe
		var window_width;
		var window_height;
		// X-Koordinate & Y-Koordinate oben/links
		var window_topleft_x;
		var window_topleft_y;
		// Kartenfelder
		var fields = new Array();
		// X-Koordinate & Y-Koordinate der aktuellen Position
		var x_coord;
		var y_coord;
			
		// Kartengröße definieren in Felder (z.B.: 5x5 Felder)
		function setSize(width, height) {
			map_width = width;
			map_height = height;
		}

		// Feldgröße definieren in PX
		function setFieldSize(width_px, height_px) {
			field_width_px = width_px;
			field_height_px = height_px;
		}
			// Felder setzen
		function setField(x, y, field) {
			if ((x < 100) || (y < 100) || (x >= map_width) || (y >= map_height)) {
				return false;
			}
			var ix=x;
			var iy=y;
			for (; ix == x; ix++) {
				for (; iy == y; iy++) {
					fields[x] = new Array();
					fields[x][y] = field;
				}
			}
		}

		// Felder holen
		function getField(x, y) {
			if (typeof(fields[x])!="undefined") {
				if (typeof(fields[x][y])!="undefined") {
					return fields[x][y];
				} else {
					return false;
				}
			} else {
				return false;
			}
		}

		// Position setzen
		function setPosition(x, y) {
			if (x < 100) {
				x = 100;
			}
			if (y < 100) {
				y = 100;
			}
			if (x >= map_width) {
				x = map_width - 1;
			}
			if (y >= map_height) {
				y = map_height - 1;
			}
			x_coord = x;
			y_coord = y;
			
			setWindowPosition(x - Math.round(window_width / 2) + 1, y - Math.round(window_height / 2) + 1);
		}
			// Fenstergröße in Feldern 
		function setWindowSize(width, height) {
			window_width = width;
			window_height = height;
		}

		function setWindowPosition(x, y) {
			if (x < 100) {
				x = 100;
			}
			if (y < 100) {
				y = 100;
			}
			if (x + window_width > map_width) {
				x = map_width - window_width;
			}
			if (y + window_height > map_height) {
				y = map_height - window_height;
			}
			window_topleft_x = x;
			window_topleft_y = y;
		}

		function getWindowHtml() {
			var code = '<div id="map_wrapper" style="overflow:hidden;width:490px; height:350px; border: black solid 1px;text-align:center;" >';
			code += '<div id="mymapwindow" style="min-width:' + "" + ((field_width_px) * window_width) + "" + 'px; min-height:' + "" + (field_height_px) * window_height + "" + 'px;">';
			var window_bottomright_x = (window_topleft_x + (window_width - 1));
			var window_bottomright_y = (window_topleft_y + (window_height - 1));
			for (var y = window_topleft_y; y <= window_bottomright_y; y++) {
				for (var x = window_topleft_x; x <= window_bottomright_x; x++) {
					var field = getField(x, y);
					if (field) {
						var color = field['color'];
						var caption = field['caption'];
					} else {
						color = '#009933';
						caption = '';
					}
					code += '<div style="float: left; width: ' + "" + (field_width_px - 1) + "" + 'px; height: ' + "" + (field_height_px - 1) + "" + 'px; margin-right: 1px; margin-bottom: 1px; background-color: ' + "" + color + "" + '; text-align: center;" title=" ' + "" + caption + "" + ' ">(' + "" + x + "" + '|' + "" + y + "" + ')</div>';
				}
				code += '<div style="clear:both;"></div>';
			}
			code += '</div>';
			code += '</div>';
			code += '<div style="clear:both;"></div>';
			
			$("div#map").html(code);
		}
		
        	// Kartengröße definieren in Felder (z.B.: 30x30 Felder)
        	setSize(1000, 1000);
        	// Feldgröße definieren
		setFieldSize(70, 50);
		// Felder definieren
		setField(106, 106, {"color":"red", "caption":'Dorf'});
		// Fenstergröße der Karte definieren in Felder (z.B.: 9x9 Felder)
		setWindowSize(7, 7);
		// Aktuelle Position zentrieren sofern möglich
		setPosition(106, 106);
		// Karte ausgeben
		getWindowHtml();
		
		$("#mymapwindow").draggable({
			drag: function(event, ui) {
				// neue koordinaten berechnen
				var current_y = ui.position.top + y_coord;
				var current_x = ui.position.left + x_coord;
				$("div#drag").text("drag: \nx: "+ current_x + "\ny: " + current_y);
				
			}
		});		
	});

</script>
	<body>
		<div id="map"></div>
		<div id="drag"></div>
	</body>
</html>

Falls ihr nebenbei Fehler endeckt oder verbesserungsvorschläge habt dann immer her damit :)

Code könnte meines Wissens komplett kopiert und selbst getestet werden. Ich bitte jedoch es nicht für seine eigenen Projekten zu nutzen. Danke :)
 
Was möchtest du denn für Teile dazuladen? Irgendwelche Kartenelemente? Eventuell wäre Ajax was für dich.
 
Ja also von der Datenbak hole ich die Daten...
z.B.: 200|300 ist ein Dorf --> Farbe Gelb
120|130 ist ein Berg --> Farbe Braun
und der Rest soll Wiese sein --> Grün

Wenn ich jetzt die Karte nach rechts bewege weiß ich nicht wie ich auf der linken Seite die Daten nachlade...
 
Ich würde mal folgendes versuchen:
- onmousemove abfangen bzw. bei JQuery .mousemove() | jQuery API Documentation
- Immer wenn dieser angetriggert wird, die neuen Daten aus der DB lesen (mit einem Ajax Request): Du musst natürlich irgendwie wissen, welche Daten du brauchst. Ich würde das eventuell anhand von Koordinaten machen. Kartenelement 1 sitzt auf Position 1:1, Kartenelement 2 auf 2:2 usw. Wie ich sehe hast du die im JS ja schon, wenn du diese jetzt auch noch in der DB hast, könntest du darüber die Position eindeutig ermitteln und so die passenden Kartendaten auslesen.
- Karte neu rendern, vermutlich wird das dann deine Funktion "getWindowHtml();" sein.


Ich hoffe das hilft dir schon mal weiter.
 
Hallo, sorry für die späte Antwort. Habe mir das mal angeschaut und es hat mir schon ein wenig weitergeholfen...
Meine Map geht von 100 bis 999.
Und das ist mein Problem... wie kann ich auf der linken Seite laden? woher weiß ich welche Teile ich laden muss? da Blick ich nicht ganz durch :/

Szenario:



|_______________________________________________
|------------|-------------|-------------|------------|
| (200/201) | (200/202) | (200/203) | (200/204) |
|------------|-------------|-------------|------------|
| (201/201) | (201/202) | (201/203) | (201/204) |
|------------|-------------|-------------|------------|
| (202/201) | (202/202) | (202/203) | (202/204) |
|------------|-------------|-------------|------------|
| (203/201) | (203/202) | (203/203) | (203/204) |
|------------|-------------|-------------|------------|
| (204/201) | (204/202) | (204/203) | (204/204) |
|------------|-------------|-------------|------------|
| (205/201) | (205/202) | (205/203) | (205/204) |
|------------|-------------|-------------|------------|
|_______________________________________________

Das fett geschriebene sind die Koordinaten... Jedes Feld ist eine eigene Div...
Wenn die Karte jetzt nach rechts gezogen wird dann muss es auf der linken Seite die neuen Felder nachgeladen werden...
Wie ermittel ich nun welche Felder ich brauche und wo sie hingehöhren?

Ich hoffe es ist verständlich genug :/

bin auch gerne in skype erreichbar (patrick_uhlir@hotmail.com)
 
Laut deinem Code im ersten Posting hast du doch die neuen Koordinaten, oder nicht? Oder sind das nicht die gleichen wie sie in der DB stehen?
 
doch die müssten stimmen... mein Problem ist eig nur das ich nicht weiß wie ich das nötige nach lade und richtig positioniere...
 
Mein Gedanke war/ist:
Du machst mit einen Request und fragst mit den neuen Koordinaten die Daten aus der DB ab. Wenn du alles bekommen hast (Ist es ein Dorf, ist die Farbe grün, etc.), kannst du dann die Funktion "getWindowHtml()" aufrufen. getWindowHtml erstellt doch die Karte, oder? Wenn ja, müsstest du die Funktion nur noch ein wenig erweitern, sodass du ihr die neuen Eigenschaften (Farbe, Dorf, etc.) mitgeben kannst.

Code:
$.ajax({
url: "holeDaten.php?x=...&y=...",
success: function(xhr) {
// Ich würde mir Serverseitig eine JSON-Struktur aufbauen, welche die Daten schön lesbar ausgibt.
getWindowHtml(xhr.Dorf,xhr.Farbe,...);
}
});
 
Sry für die späte antwort.
Als Ansatz hat es mir sehr weitergeholfen :)

Werde mich dann nochmal melden wenn ich es geschafft habe :)
 
Zurück
Oben