ERLEDIGT
JA
JA
ANTWORTEN
3
3
ZUGRIFFE
496
496
EMPFEHLEN
-
Hallo und Halli,
nach endlichen Jahren habe ich mich mal wieder an eine angefangene Spielanwendung gewagt.
Es ist so eine Art Risikospiel mit selbsterstellten Landkarten.
dabei werden die verschiedenen Länder mit Poligonen dargestellt. Angriffe werden mittels Pfeile von einem zum anderen Land dargestellt.
Nun möchte wenn die verschiedenen Angriffe ausgeführt werden die beteiligten Länder etwas animieren. Am einfachsten vielleicht mit Farbwechseln.
Die Vorgehensweise ist grundsätzlich ja so dass man alles was zu zeichnen ist in die überschriebene paintComponent() routine packt. Aber irgendwie fehlt mir da nun der Ansatz dort eine art farbenfrohe Blinkerei unterzubringen.
Zuerst dachte ich ok man braucht einen Thread der die Farbwechsel der Schlachtbeteiligten Länder duchläuft.
In die PaintComponentroutine eingebaut ist das aber irgendwie so eine Art immerwieder neue Threads startende Endlosschleife.
wenn ich das ganze nur so als schleife reinbaue ohne threads bemerkt man fast nix.
Wie müsste man das gescheit anstellen?
grobes Prinzip z.Z.
Code java: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
... public void paintComponent(Graphics g) { super.paintComponent(g); // hier werden allemöglich dinge gemalt paintPlayerOrders((Graphics2D)g); // hier werden die Befehle des aktuellen Spielers als Pfeile dargestellt for (Country[] c : m_battleList) // hier dachte ich könnte man die Schlachten falls welche stattfinden malen { paintBattle((Graphics2D)g, c[0], c[1]); } }... protected void paintBattle(final Graphics2D g, final Country offense, final Country defense) { /* new Thread(new Runnable() { public void run() { */ try { for (int i=0; i<4; i++) { Polygon polygon = new Polygon(); boolean blinkOn = true; if (blinkOn) { Point2D[] points = offense.getPolygon().getRawPoints(); for (int j=0; j<points.length; j++) { int x = (int) (points[j].getX() * m_skalaFaktor); int y = (int) (points[j].getY() * m_skalaFaktor); polygon.addPoint(x,y); } g.setColor(offense.getOwner().getColor()); g.fillPolygon(polygon); g.setColor(Color.BLACK); drawCountryLink(g,offense, defense); } else { Point2D[] points = defense.getPolygon().getRawPoints(); for (int j=0; j<points.length; j++) { int x = (int) (points[j].getX() * m_skalaFaktor); int y = (int) (points[j].getY() * m_skalaFaktor); polygon.addPoint(x,y); } g.setColor(offense.getOwner().getColor()); g.fillPolygon(polygon); g.setColor(Color.RED); drawCountryLink(g,offense, defense); } blinkOn = !blinkOn; repaint(); Thread.sleep(500); } } catch (Exception ex) { MExceptionHandler.handleException(ex); } /* } }).start(); */ }
Habe dass wie gesagt mit und ohne Thread verscuht, dabei stellte sich heraus, dass repaint offenbar tatsächlich munter paintComponent auszulösen scheint.
Würde heir eine inwokeAndWati oder inwvokeLater Sinn machen?
irgendwie fehlt mir da aber die Vorstellung wie das dann läuft .... :-/
Hat jemand vielleicht einen Hinweis oder besseren Ansatz?
mit neujahrentgegenstrahlenden Grüßen
Takidoso
-
30.12.11 20:24 #2
Hi,
also grundlegend würde ich sagen, dass bei einem Spiel immer ein Thread benötigt wird, der das Spiel neu zeichnet und neu berechnet.
In deinen Paint-Methoden musst du dann das reinschreiben, was gezeichnet werden soll, in welchem Fall. Sprich:
Code java:1 2 3 4 5 6 7
protected void paintBattle(Graphics2D g, Country country) { if(country.isAttacked()) { // Hier schreibst du rein, was gemalt werden soll, wenn das Land angegriffen wird } else { // Hier schreibst du dann den "Default" rein } }
Gruß
FabioBitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
30.12.11 20:27 #3
- Registriert seit
- Jun 2009
- Beiträge
- 870
Das Problem ist, dass du die Animation nicht vollständig im Java-AWT-Event-Thread ablaufen lassen kannst, weil du damit das Zeichnen des Rests der Anwendung blockierst. Deswegen solltest du die Animation über Flags steuern, die über einen Counter (Attribut der Klasse) oder einen Timer gesetzt werden. Zeichnen solltes tu auf gar keinen Fall in einem anderen Thread oder Runnable durchführen!
Am besten ist, du definierst eine gewisse Abfolge und setzt dazu ein Flag, das bei jeder Zeichnung (d.h. bei jedem Aufruf von paintComponent() ) ein mal erhöht wird, damit du weißt, bei welchem Schritt du bist. Dann brauchst du noch einen Timer, der mindestens 25 mal pro Sekunde repaint() initiierst (damit du 25 FPS bekommst und die Animation damit flüssig erscheint).Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
Hallo genodeftest ,
Das ist ein interessanter Ansatz.
Also man hat einen Thread, der repaint ansteuert und damit wird paintComponent getriggert.
paintComponent selbst hat eine algorithmik, die nach jedem antriggern praktisch ein "Bild" weiter geht.
Mal schauen wie ich das bei mir umsetzen kann. Aber danke vielmals für die Grundidee.
edit:
Jo hat generell geklappt bei mir danke nochmals für den Gedankenanstoß
Ähnliche Themen
-
paintComponent?
Von JohnathanBernstein im Forum Java GrundlagenAntworten: 9Letzter Beitrag: 28.05.11, 04:18 -
Swing Animation - VM beendet nicht
Von bile im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 5Letzter Beitrag: 10.07.09, 08:36 -
javax.swing.plaf.FontUIResource: Woher lädt Swing den Font
Von Deficiency im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 17.01.08, 08:38 -
JSlider und paintComponent
Von M_Kay im Forum JavaAntworten: 0Letzter Beitrag: 20.07.07, 02:25 -
JButton - paintComponent()
Von MasterEvil im Forum JavaAntworten: 3Letzter Beitrag: 18.01.06, 16:20





Zitieren
Login





