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

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmus für Bewegungen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Algorithmus für Bewegungen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 83

Algorithmus für Bewegungen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
02.04.2019 19:36 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
watchout
Grünschnabel


Dabei seit: 02.04.2019
Beiträge: 1

RE: Algorithmus für Bewegungen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
03.04.2019 00:18 watchout ist offline Beiträge von watchout suchen Nehmen Sie watchout in Ihre Freundesliste auf
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 83

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
28.04.2019 11:17 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 83

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo nochmal,

also sie laufen jetzt hintereinander her.
Ich denke, dass ich jetzt weiterkomme mit Formationen usw. . Danke für die Idee.
05.05.2019 21:21 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 83

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?
13.05.2019 21:37 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 83

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ok. Habs. Geschlossen.
18.05.2019 09:27 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmus für Bewegungen