Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Java ::  Problem beim Zeichnen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Tolpan
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.05.2009
Beiträge: 99
Beitrag Tolpan Mitglied 15:51:04 11.02.2010   Titel:   Problem beim Zeichnen            Zitieren

Hallo Leute

ich habe ein kleines Problem mit dem Graphics Sachen. Es geht um einen Risiko-Klon. Ich benutze zwei direkt übereinander liegende Panels zum zeichnen. Das hintere zeichnet nur die Landkarte. Das Vordere zeichnet informationen zu den Ländern und beim anklicken eines Landes animierte Pfeile zu den Nachbarländern. Abgesehen davon muss der Rest aber durchsichtig bleiben. Wenn die Pfeilanimation jetzt läuft, sieht man die ganze Zeit über die zwischendurch gezeichneten Bilder (ganz viele Pfeilspitzen) erst wenn die animation beendet ist verschwinden diese. Ich habe schon mehrfach versucht irgendwie das Bild zu leeren aber alles was ich erreiche ist das gesamte füllen mit einer Farbe wie es clear() macht. Ich hab schon versucht die Farbe auf Null zu setzen und einen Alpha wert von 0 anzugeben aber nichts hat geklappt. Kennt einer von euch ne möglichkeit wie ich das Bild wieder komplett leer bekomme?

meine Zeichenmethode sieht so aus:
Java 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
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
@Override
    public void
paint(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setStroke(new BasicStroke(10f));
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for(Landrepresentation landRep : this.landrepresentations) {
            Point offset = landRep.getOffset();
            Land land = landRep.getLand();
            int armeeCount = land.getArmeeCount();
            Color playerColor = this.getColorByPlayer(land.getOwner());
            g.setColor(playerColor);
            g2.fillOval(offset.x, offset.y, 20, 20);
            g.setColor(Color.WHITE);
            g.drawString("" + armeeCount,
                            offset.x + 4,
                            offset.y + 14);
            if(land == this.selectedland
                    && land.getOwner() == Game.getInstance().getCurrentPlayer()) {
                for (Land neighbor : land.getNeighborLands()) {
                    if(neighbor.getOwner() == land.getOwner()) {
                        g.setColor(Color.BLUE);
                    }
                    else {
                        g.setColor(Color.RED);
                    }
                    Point neighborOffset = this.getOffsetForLand(neighbor);
                   
                    Point lineStart = new Point(0, 0);
                    Point lineEnd = new Point(0, 0);
                    Point origin = new Point(0, 0);
                   
                    Point2D.Double direction = new Point2D.Double(offset.x - neighborOffset.x,
                                                    offset.y - neighborOffset.y);
                    double length = origin.distance(direction);
                    direction.x /= length;
                    direction.y /= length;
                   
                    Point animationEnd = new Point(neighborOffset.x + (int)(direction.x * 25) + 10,
                                                   neighborOffset.y + (int)(direction.y * 25) + 10);
                   
                    lineStart.x = offset.x - (int)(direction.x * 20) + 10;
                    lineStart.y = offset.y - (int)(direction.y * 20) + 10;
                   
                    double directionFactor = (lineStart.distance(animationEnd) / 2000) * this.animationRuntime;
                   
                    lineEnd.x = offset.x - (int)(direction.x * directionFactor) + 10;
                    lineEnd.y = offset.y - (int)(direction.y * directionFactor) + 10;
                   
                    Point2D.Double ortho = new Point2D.Double();
                    ortho.x = direction.y;
                    ortho.y = -direction.x;
                   
                    Point triangle1 = new Point((int)(lineEnd.x - 3 * direction.x + 10 * ortho.x),
                                                (int)(lineEnd.y - 3 * direction.y + 10 * ortho.y));
                    Point triangle2 = new Point((int)(lineEnd.x - 3 * direction.x - 10 * ortho.x),
                                                (int)(lineEnd.y - 3 * direction.y - 10 * ortho.y));
                   
                    Polygon triangle = new Polygon();
                    triangle.addPoint((int)(lineEnd.x - 20 * direction.x),
                                      (int)(lineEnd.y - 20 * direction.y));
                    triangle.addPoint(triangle1.x, triangle1.y);
                    triangle.addPoint(triangle2.x, triangle2.y);
                   
                    g2.draw(new Line2D.Double(lineStart, lineEnd));
                    g2.fill(triangle);
                }
            }
        }
    }
Java 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
@Override
public void
paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setStroke(new BasicStroke(10f));
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for(Landrepresentation landRep : this.landrepresentations) {
Point offset = landRep.getOffset();
Land land = landRep.getLand();
int armeeCount = land.getArmeeCount();
Color playerColor = this.getColorByPlayer(land.getOwner());
g.setColor(playerColor);
g2.fillOval(offset.x, offset.y, 20, 20);
g.setColor(Color.WHITE);
g.drawString("" + armeeCount,
offset.x + 4,
offset.y + 14);
if(land == this.selectedland
&& land.getOwner() == Game.getInstance().getCurrentPlayer()) {
for (Land neighbor : land.getNeighborLands()) {
if(neighbor.getOwner() == land.getOwner()) {
g.setColor(Color.BLUE);
}
else {
g.setColor(Color.RED);
}
Point neighborOffset = this.getOffsetForLand(neighbor);

Point lineStart = new Point(0, 0);
Point lineEnd = new Point(0, 0);
Point origin = new Point(0, 0);

Point2D.Double direction = new Point2D.Double(offset.x - neighborOffset.x,
offset.y - neighborOffset.y);
double length = origin.distance(direction);
direction.x /= length;
direction.y /= length;

Point animationEnd = new Point(neighborOffset.x + (int)(direction.x * 25) + 10,
neighborOffset.y + (int)(direction.y * 25) + 10);

lineStart.x = offset.x - (int)(direction.x * 20) + 10;
lineStart.y = offset.y - (int)(direction.y * 20) + 10;

double directionFactor = (lineStart.distance(animationEnd) / 2000) * this.animationRuntime;

lineEnd.x = offset.x - (int)(direction.x * directionFactor) + 10;
lineEnd.y = offset.y - (int)(direction.y * directionFactor) + 10;

Point2D.Double ortho = new Point2D.Double();
ortho.x = direction.y;
ortho.y = -direction.x;

Point triangle1 = new Point((int)(lineEnd.x - 3 * direction.x + 10 * ortho.x),
(int)(lineEnd.y - 3 * direction.y + 10 * ortho.y));
Point triangle2 = new Point((int)(lineEnd.x - 3 * direction.x - 10 * ortho.x),
(int)(lineEnd.y - 3 * direction.y - 10 * ortho.y));

Polygon triangle = new Polygon();
triangle.addPoint((int)(lineEnd.x - 20 * direction.x),
(int)(lineEnd.y - 20 * direction.y));
triangle.addPoint(triangle1.x, triangle1.y);
triangle.addPoint(triangle2.x, triangle2.y);

g2.draw(new Line2D.Double(lineStart, lineEnd));
g2.fill(triangle);
}
}
}
}
Java 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
@Override
    public void
paint(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setStroke(new BasicStroke(10f));
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for(Landrepresentation landRep : this.landrepresentations) {
            Point offset = landRep.getOffset();
            Land land = landRep.getLand();
            int armeeCount = land.getArmeeCount();
            Color playerColor = this.getColorByPlayer(land.getOwner());
            g.setColor(playerColor);
            g2.fillOval(offset.x, offset.y, 20, 20);
            g.setColor(Color.WHITE);
            g.drawString("" + armeeCount,
                            offset.x + 4,
                            offset.y + 14);
            if(land == this.selectedland
                    && land.getOwner() == Game.getInstance().getCurrentPlayer()) {
                for (Land neighbor : land.getNeighborLands()) {
                    if(neighbor.getOwner() == land.getOwner()) {
                        g.setColor(Color.BLUE);
                    }
                    else {
                        g.setColor(Color.RED);
                    }
                    Point neighborOffset = this.getOffsetForLand(neighbor);
                   
                    Point lineStart = new Point(0, 0);
                    Point lineEnd = new Point(0, 0);
                    Point origin = new Point(0, 0);
                   
                    Point2D.Double direction = new Point2D.Double(offset.x - neighborOffset.x,
                                                    offset.y - neighborOffset.y);
                    double length = origin.distance(direction);
                    direction.x /= length;
                    direction.y /= length;
                   
                    Point animationEnd = new Point(neighborOffset.x + (int)(direction.x * 25) + 10,
                                                   neighborOffset.y + (int)(direction.y * 25) + 10);
                   
                    lineStart.x = offset.x - (int)(direction.x * 20) + 10;
                    lineStart.y = offset.y - (int)(direction.y * 20) + 10;
                   
                    double directionFactor = (lineStart.distance(animationEnd) / 2000) * this.animationRuntime;
                   
                    lineEnd.x = offset.x - (int)(direction.x * directionFactor) + 10;
                    lineEnd.y = offset.y - (int)(direction.y * directionFactor) + 10;
                   
                    Point2D.Double ortho = new Point2D.Double();
                    ortho.x = direction.y;
                    ortho.y = -direction.x;
                   
                    Point triangle1 = new Point((int)(lineEnd.x - 3 * direction.x + 10 * ortho.x),
                                                (int)(lineEnd.y - 3 * direction.y + 10 * ortho.y));
                    Point triangle2 = new Point((int)(lineEnd.x - 3 * direction.x - 10 * ortho.x),
                                                (int)(lineEnd.y - 3 * direction.y - 10 * ortho.y));
                   
                    Polygon triangle = new Polygon();
                    triangle.addPoint((int)(lineEnd.x - 20 * direction.x),
                                      (int)(lineEnd.y - 20 * direction.y));
                    triangle.addPoint(triangle1.x, triangle1.y);
                    triangle.addPoint(triangle2.x, triangle2.y);
                   
                    g2.draw(new Line2D.Double(lineStart, lineEnd));
                    g2.fill(triangle);
                }
            }
        }
    }

_________________
Ich würde lieber mit einer Schar Zwerge in den Krieg ziehen.
Bis an die Zähne bewaffnet und DRECKIG.
- Gimli in HDR-Rückkehr des Königs(Film)
Michamab
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.04.2001
Beiträge: 1829
Beitrag Michamab Mitglied 17:06:33 11.02.2010   Titel:              Zitieren

Ohne das ich jetzt einen genaueren Blick auf deinen Code geworfen hab, kannst du einfach die repaint() Methode ausführen und dann in der paint() Methode einfach nichts zeichnen. Also ungefähr so:

Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Zeichenflaeche extends Component {

private boolean clear = false;

public void clearAll() {
this.clear = true;
this.repain();
}

public void draw() {
this.clear = false;
}

public void paint(Graphics g) {
if(clear) return;
else {
// hier wird dann gezeichnet ...
}
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Zeichenflaeche extends Component {

private boolean clear = false;

public void clearAll() {
this.clear = true;
this.repain();
}

public void draw() {
this.clear = false;
}

public void paint(Graphics g) {
if(clear) return;
else {
// hier wird dann gezeichnet ...
}
}
Java Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Zeichenflaeche extends Component {

private boolean clear = false;

public void clearAll() {
this.clear = true;
this.repain();
}

public void draw() {
this.clear = false;
}

public void paint(Graphics g) {
if(clear) return;
else {
// hier wird dann gezeichnet ...
}
}
Dasd
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.08.2003
Beiträge: 1036
Beitrag Dasd Mitglied 09:14:14 12.02.2010   Titel:              Zitieren

Mir erscheint der Ansatz insgesamt fragwürdig. Würde man sowas normalerweise nicht mit Double-Buffering lösen, indem man pro Frame zunächst den Hintergrund und dann die einzelnen Elemente darauf zeichnet?

Das geht sehr komfortabel mit AWT's BufferStrategy:
http://java.sun.com/docs/books/tutorial/extra/fullscreen/bufferstrategy.html

Ich arbeite derzeit auch an einem kleinen Framework, das davon Gebrauch macht.

Edit:
Michamab schrieb:
Ohne das ich jetzt einen genaueren Blick auf deinen Code geworfen hab, kannst du einfach die repaint() Methode ausführen und dann in der paint() Methode einfach nichts zeichnen. [...]


Das funktioniert IMHO nicht, weil die alten Bildbereiche dabei nicht überschrieben werden.


Zuletzt bearbeitet von Dasd am 09:17:51 12.02.2010, insgesamt 1-mal bearbeitet
Tolpan
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.05.2009
Beiträge: 99
Beitrag Tolpan Mitglied 13:58:32 12.02.2010   Titel:              Zitieren

@Dasd:
Ich sollte vielleicht noch dazu sagen das ich ein JPanel benutze kein awt.Panel und das auf doubleBuffered = true gesetzt habe.
Am Anfang hab ich alles in ein Panel gezeichnet. Das Problem daran war, dass das Hintergrundbild an 2000 X 2000 Pixel groß ist, wenn ich das mitzeichne schaff ichs auf meinem schon recht alten Notebook grade mal auf 2-3 Bilder in der 2 Sekunden Animation. Deswegen versuch ich das ja auszulagern.

_________________
Ich würde lieber mit einer Schar Zwerge in den Krieg ziehen.
Bis an die Zähne bewaffnet und DRECKIG.
- Gimli in HDR-Rückkehr des Königs(Film)
DEvent
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.12.2003
Beiträge: 3270
Beitrag DEvent Mitglied 14:10:56 12.02.2010   Titel:              Zitieren

Wenn du besser/schneller zum Ziel kommen willst, kann ich dir http://www.piccolo2d.org/ empfehlen. Ist ein 2D Szenegraph. Oder https://scenegraph.dev.java.net/ ist aber unter der GPL.

_________________
http://www.globalscaling.de/
http://www.globalscalingsoftware.de/
byto
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.08.2006
Beiträge: 1188
Beitrag byto Mitglied 14:29:18 12.02.2010   Titel:              Zitieren

Niemals paint() überschreiben! Immer paintComponent() :warning:
Michamab
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.04.2001
Beiträge: 1829
Beitrag Michamab Mitglied 21:39:38 12.02.2010   Titel:              Zitieren

byto schrieb:
Niemals paint() überschreiben! Immer paintComponent() :warning:


Das stimmt im Fall von JComponent zwar, paintComponent() existiert in der Klasse Component allerdings nicht.

Dasd schrieb:
Edit:
Michamab schrieb:
Ohne das ich jetzt einen genaueren Blick auf deinen Code geworfen hab, kannst du einfach die repaint() Methode ausführen und dann in der paint() Methode einfach nichts zeichnen. [...]


Das funktioniert IMHO nicht, weil die alten Bildbereiche dabei nicht überschrieben werden.


Das funktioniert sehr wohl, weil ja durch den Aufruf von repaint() wieder paint() aufgerufen wird und alles komplett neu gezeichnet wird.
Tolpan
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.05.2009
Beiträge: 99
Beitrag Tolpan Mitglied 23:36:20 13.02.2010   Titel:              Zitieren

Da ich ein JPanel habe hätte ich paintComponent überschreiben können und ich weis auch dass man das so macht. Da das Jpanel aber eh nichts anderes tut als zeichnen und vorallem niemals irgendwelche Components beinhalten wird, wars mir schlicht und einfach egal.

@Michamab:
Das wird nicht funktionieren da ich nur kleine Bereiche des Bildes zeichne und nicht das ganze, da der Rest ja durchsichtig bleiben muss.

@DEvent:
Ich wollte hier eigentlich nur auf Java-Bordmittel zurückgreifen aber ich werd mir das mal ansehen. Danke.

_________________
Ich würde lieber mit einer Schar Zwerge in den Krieg ziehen.
Bis an die Zähne bewaffnet und DRECKIG.
- Gimli in HDR-Rückkehr des Königs(Film)
C/C++ Forum :: Java ::  Problem beim Zeichnen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.