Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmus für Bewegungen » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 6 Beiträge
Tommy1234

Ok. Habs. Geschlossen.
Tommy1234

Ich hab gerade erst die Tragweite meiner Frage verstanden.
Nach ein bisl googeln findet man ein paar bloqs und articles zu dem Thema. Dieses ist ziemlich komplex und vor allem die gruppenbewegung sowie Formationen sind alles andere als einfach zu implementieren. Deshalb hier die Frage:
Hat hier jemand gruppenbewegung sowie Formationen auf einem 2d grid schon mal implementiert oder das zumindest mal versucht hat und evtl ein paar Tipps dazu geben kann?
Tommy1234

Hallo nochmal,

also sie laufen jetzt hintereinander her.
Ich denke, dass ich jetzt weiterkomme mit Formationen usw. . Danke für die Idee.
Tommy1234

Hi danke für die Antwort.
Ich habs implementiert, das Problem an der Sache ist nur, dass der Pfad zur Laufzeit stets abgefragt werden muss , damit die nächste Einheit immer das letzte tile des Vorgängers als ziel hat. Und bei 12 Einheiten tut sich Garnichts mehr extreme laggs. Hier mal der Code:

zum Einen die Implementiterung der eigentlichen Bewegung:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:

public void move() {
		
		lastx = x;
		lasty = y;
		
		if(path != null) {
			if(path.size() > 0) {
				
				Tile tile = path.get(path.size()-1);
					
				int tx = Tools.toScreenX(tilex,tiley)-16;
				int ty = Tools.toScreenY(tilex,tiley);
					
				if(x < tx && y == ty) {
					x+=xspeed;
					direction = 2;
					move = getFrame(move,10,14,4);
					lasttilex = tilex-1;
					lasttiley = tiley+1;
				}
				
				else if(y < ty && x == tx) {
					y+=yspeed;
					direction = 4;
					move = getFrame(move,5,9,4);
					lasttilex = tilex-1;
					lasttiley = tiley-1;
				}
				
				else if(x > tx && y == ty) {
					x-=xspeed;
					direction = 6;
					move = getFrame(move,15,19,4);
					lasttilex = tilex+1;
					lasttiley = tiley-1;
				}
					
				else if(y > ty && x == tx) {
					y-=yspeed;
					direction = 0;
					move = getFrame(move,0,4,4);
					lasttilex = tilex+1;
					lasttiley = tiley+1;
				}
					
				else if(x < tx && y < ty) {
					x+=xspeed;
					y+=yspeed/2;
					direction = 3;
					move = getFrame(move,30,34,4);
					lasttilex = tilex-1;
					lasttiley = tiley;
				}
				
				else if(y < ty && x > tx) {
					x-=xspeed;
					y+=yspeed/2;
					direction = 5;
					move = getFrame(move,35,39,4);
					lasttilex = tilex;
					lasttiley = tiley-1;
				}
					
				else if(x > tx && y > ty) {
					x-=xspeed;
					y-=yspeed/2;
					direction = 7;
					move = getFrame(move,25,29,4);
					lasttilex = tilex+1;
					lasttiley = tiley;
				}
					
				else if(y > ty && x < tx) {
					x+=xspeed;
					y-=yspeed/2;
					direction = 1;
					move = getFrame(move,20,24,4);
					lasttilex = tilex;
					lasttiley = tiley+1;
				}
					
				else if(y == ty && x == tx){
					IsometricMap.tiles[tilex][tiley].setUnit(false);
					tilex = tile.getX();
					tiley = tile.getY();
					IsometricMap.tiles[tilex][tiley].setUnit(true);
					
					path.remove(tile);
				}
				
			}
			else {
				
				
				
			}
			
			//System.out.println(tilex + "   " + lasttilex + "   " + tiley + "   " + lasttiley);
		}
	}


und zum anderen die Koordination der Einheiten:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:

for(int i = 0;i<entities.size();i++) {
			for(int j = entities.size()-1;j>i;j--) {
				if(entities.get(i).marked) {
					if(MouseInput.right) {
						entities.get(i).mousex = entities.get(j).mousex = Game.rightx;
						entities.get(i).mousey = entities.get(j).mousey = Game.righty;
						
					}
					entities.get(i).path = IsometricMap.findPath(entities.get(i).tilex,entities.get(i).tiley,entities.get(i).mousex,entities.get(i).mousey);
					entities.get(j).path = IsometricMap.findPath(entities.get(j).tilex,entities.get(j).tiley,entities.get(j).mousex,entities.get(j).mousey);
					if(entities.get(i).path != null && entities.get(j).path != null) {
						if(entities.get(i).path.size() <= entities.get(j).path.size()) {
							entities.get(i).move();
							if(entities.get(i).tilex != entities.get(i).lasttilex || entities.get(i).tiley != entities.get(i).lasttiley) {
								entities.get(j).path = IsometricMap.findPath(entities.get(j).tilex,entities.get(j).tiley,entities.get(i).lasttilex,entities.get(i).lasttiley);
								entities.get(j).move();
							}
						}
						else if(entities.get(j).path.size() <= entities.get(i).path.size()) {
							entities.get(j).move();
							if(entities.get(j).tilex != entities.get(j).lasttilex || entities.get(j).tiley != entities.get(j).lasttiley) {
								entities.get(i).path = IsometricMap.findPath(entities.get(i).tilex,entities.get(i).tiley,entities.get(j).lasttilex,entities.get(j).lasttiley);
								entities.get(i).move();
							}
						}	
					}
				}
			}
		}



Wie erreicht man da niedrigere Frameraten ( denglisch XD).

Wäre für Hilfe dankbar.
watchout RE: Algorithmus für Bewegungen

also ich würde die Einheiten erst durchnummerieren. besser gesagt die Positionen der Einheiten und dann in jedem schritt zur position vom Vorgänger gehen lassen.
Tommy1234 Algorithmus für Bewegungen

Hallo, steh auf dem Schlauch. Ich möchte auf einem 2d grid spielfiguren bewegen und zwar nacheinander. Das heißt, dass man via mausrahmen Einheiten markieren kann (siehe Age of Empires) anschließend wird geklickt, und damit der Pfad generiert und schließlich die Einheit bewegt. Ich möchte nun einen Algorithmus in Java schreiben der die Einheiten nacheinander bewegt abhängig vom kürzesten Pfad aller markierten Einheiten. Ich halte die Einheiten in einer ArrayList und berechne mir den Index der Einheit mit dem kürzesten Pfad.
Jetzt dachte ich mir wenn das letzte Feld eben dieser Einheit freigegeben wurde, dann bewege ich die nächste usw..
Meine Frage ist nun wie setzt man das im Sinne eines guten Algorithmus um?

Wäre für Hilfe sehr dankbar.

Gruß Tommy