2016-05-24 23 views
2

Ich schreibe ein River-Raid-Like-Spiel, und alle Bilder werden mit g.drawImage (...) gezeichnet. Meine Frage ist: Wie kann ich das Seitenverhältnis des Inhalts beibehalten und den Inhalt an die neue Fenstergröße anpassen, wenn jemand die Größe des JFrame ändert?Größe ändern Bilder ohne JLabel

Gibt es eine Option wie diese? Kann ich dies tun, ohne JLabels und Layouts zu verwenden? Wenn nicht, wie geht das anders?

private void initBoard() { 
     addKeyListener(new TAdapter()); 
     setFocusable(true); 
     setBackground(Color.WHITE); 
     setLayout(new GridBagLayout()); 
     craft = new Craft(ICRAFT_X, ICRAFT_Y); 
     mapa = new Mapa(); 
     setMinimumSize(new Dimension(WIDTH, HEIGHT)); 
     initEnemiesAndAddThem(); 
     czas = new Timer(delay, this); 
     czas.start(); 
    } 

JFrame Konstruktor:

Mein Code Dinge auf dem JPanel

private void doDrawing(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     drawStrings(g2); 
     mapa.drawMap(g2); 
     ArrayList ms = craft.getMissiles(); 

     for (Object m1 : ms) { 
      Missile m = (Missile) m1; 
      g2.drawImage(m.getImage(), m.getX(), m.getY(), this); 
     } 
     g2.drawImage(craft.getImage(), craft.getX(), craft.getY(), this); 
     for (EnemyJet enemy : enemies) { 
      g2.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), this); 
     } 
     for (Fuel fuel : fuels) { 
      g2.drawImage(fuel.getImage(), fuel.getX(), fuel.getY(), fuel.getHeight(), fuel.getHeight(), this); 
     } 
     for (Obstacle o : obst) { 
      g2.drawImage(o.getImage(), o.getX(), o.getY(), this); 
     } 
     drawStrings(g2); 
    } 

Auch JPanel Konstruktor zu zeichnen

private void initGame() 
    { 
     add(new Plansza()); 
     setTitle("Reeevah Raaid"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(WIDTH, HEIGHT); 
     setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     setLocationRelativeTo(null); 
     pack(); 
     setVisible(true); 
     //setExtendedState(JFrame.MAXIMIZED_BOTH); 
     //setResizable(false); 
    } 

Antwort

1

Sie können die ganze Sache skalieren:

private void doDrawing(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 

    AffineTransform originalTransform = g2.getTransform(); 
    g2.scale(getWidth()/(double) WIDTH, getHeight()/(double) HEIGHT); 

    // Do all drawing here 

    g2.setTransform(originalTransform); 
} 

Einige Anmerkungen:

  • Die g2.setTransform(originalTransform) am Ende ist der Import Ameise. Das Graphics-Objekt gehört nicht Ihnen - es kann verwendet werden, um andere Komponenten zu zeichnen, also müssen Sie es in dem Zustand belassen, in dem es sich befand, als es Ihnen übergeben wurde.
  • WIDTH und HEIGHT müssen umgewandelt werden, um zu verdoppeln, weil in Java, wenn jeder Operand einer Divisionsoperation ein double ist, das Ergebnis doppelt ist, aber wenn sie beide int sind, wird ganzzahlige Division durchgeführt, was definitiv nicht was ist Sie wollen. (Zum Beispiel ist 3/(double) 2 1.5, aber 3/2 ist genau 1.)
+0

Sorry zu sagen, aber es funktioniert nicht, da die Skalierung sehr, sehr groß oder zu klein sein kann, da nur ein Hintergrund sichtbar ist, aber der Schnittpunkt zeigt, dass sie irgendwo sichtbar sind (die Bilder). Ich mag diesen Ansatz, weil es für alle Bilder in Do-Zeichnung funktioniert, aber schließlich ist etwas mit der Skala falsch – tdbr

+0

EDIT: Nach einigen Recherchen, Intersticion tritt auf, aber keine Bilder sind sichtbar ... Ich müde, die Skala um 0,5 oder 2 zu multiplizieren wenn es Bilder zu klein oder zu groß macht, kann ich sie nicht sehen, aber sie sind unsichtbar ... – tdbr

0

Jedes Bild muss wie folgt gezeichnet werden:

double fct=1.0*image.getWidth()/getWidth(); 
    double fct2=1.0*image.getHeight()/getHeight(); 
    if(fct2>fct) fct=fct2; 
    g2.drawImage(image, x, y, (int)(1.0*image.getWidth()/fct), (int)(1.0*image.getHeight()/fct), this); 

Dies wird viel leeren Bereich verlassen - aber das ist, wenn Sie das Seitenverhältnis beibehalten möchten.

-

das Bild zu zentrieren Sie Folgendes tun:

int newWidth=(int)(1.0*image.getWidth()/fct); 
int newHeight=(int)(1.0*image.getHeight()/fct); 
g2.drawImage(image, getWidth()/2-newWidth()/2, getHeight()/2-newHeight()/2, newWidth, newHeight, this); 
+0

funktioniert gut, da es den visuellen Teil tatsächlich ändert die Größe. Es gibt ein Problem mit rechteckigen Grenzen, die ich aus dem Bild nehme, sie werden nicht geändert. Kannst du sagen, wie man es macht? – tdbr

+0

auch, der Inhalt ist links schwebend, können Sie sagen, wie man das jpanel zentriert? – tdbr

Verwandte Themen