Grafik zeichnen

BDG

Aktives Mitglied
Hey Leute,
kann mir jemand sagen, wie ich auf dem besten Weg eine Grfik in Java zeichne ? ich will ein Jump and Run Spiel programmieren, mit Editor und so.
Hab das schon in c# gemacht, aber jetzt will ich das gleiche in Java versuchen ^^
Also kann mir jemand sagen wie ich einfach eine Grafik zeichne ?
So ganz normal ? Die Figur, die Tiles etc. ?

MfG, BDG
 
Kommt drauf an ob du mit AWT oder Swing arbeitest (wobei ich dir Swing dringend empfehlen würde).
In AWT erbst du du Component und überschreibst public void pain(Graphics) und zeichnest dann auf das Graphics-Objekt mit den verfügbaren Methoden.
Bei Swing analog : public void paintComponent(Graphics) und von JComponent erben.
 
Oke. Hast du irgendwelche Beispiele ? Wie ich Grafiken lade ? Und wie ich die dann wo zeichne ?
Oder irgendwelche Links ?


Und ja, ich wollte es mit Swing machen ^^
 
Oh man... Ich wusste ja schon immer das Java nicht gerade unkompliziert ist, aber das ich es in 2 Jahren nicht schaffe eine Grafik zu zeichnen ?!!!!
in den Links wird ja nur gezeigt wie man Sachen zeichnet also Kreise und Frbverläufe und so...
Aber ich will wissen wie Ich richtige Bilder zeichne ^^
 
Das ist auch nicht kompliziert sondern benötigt, abgesehen vom Erstellen des Fensters mit Swing, genau 3 Zeilen Code.

Schau dir mal [JAPI]http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/Graphics.html[/JAPI] und [JAPI]http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/Toolkit.html[/JAPI] an.

Sollte in den nächsten 2 Jahren machbar sein 😉
 
Falls du nicht schon selbst danach gesucht und es gefunden hast..

[JAPI]http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html[/JAPI] und [JAPI]http://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html[/JAPI]
 
Naja... So wies aussieht kommt das mit den 2 Jahren noch hin...
Denn da habe ich zwar eine Methode, die aussieht als whäre sie hilfreich (drawImage), aber die ganzen Parameter bring ich nicht zusammen... Hat nicht jemand dieses besagten 3 Zeilen Code zufällig grad da ? ;D
 
ich hab jetzt ein bisschen, aber es funktioniert noch nicht...
bei der paintComponent Methode sagt er immer :
The method paintComponent(Graphics) of type Game1 must override or implement a supertype method

^^
So sieht es bis jetzt aus :

Java:
import java.awt.*;

import javax.swing.*;

public class Game1 extends JFrame
{
	private Image image;
	
	
      public Game1()
      {
              super("Fenster");
              setSize(300,300);
              setLocation(300,300);
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              setVisible(true);
              
              LoadImage();
      }

      @Override
      protected void paintComponent( Graphics g )
      {  
    	  

    	  
      }
      
       public static void main(String[] args)
       {
    	   
           Game1 g = new Game1();
               
       }
       
       public  void LoadImage()
       {
    	   image = Toolkit.getDefaultToolkit().getImage("Bomber1.png");
    	      	   
       }
       
       
       

}
 
da wurden einige Links zu Tutorials gepostet mit sicher perfekten fertigen Beispielprogrammen
und du kommst mit einer hoffentlich nirgendwo auf der Welt schon mal vorgeschlagenen Variante und möchtest nun die Fehler korrigiert haben?
das ist doch nicht gerade das optimale Vorgehen, oder?
 
Eine Methode, die es in der Superklasse nicht gibt lässt sich auch nicht überschreiben.
Schau dir die Tutorials an, wie SlaterB schon geschrieben hat.

Und wenn dir die Java API zu
Code:
drawImage()
nichts sagt, dann frag ich mich wie du das Spiel in C# hinbekommen hast.
 
In c# und XNA geht alles ganz einfach...

Code:
Texture2D texture;
texture = game.Content.Load<Texture2D>("blablabla");
spriteBatch.Draw(texture, new Vector2(0, 0), Color.White);

Aber ich guck mir nochmal das besagte Tutorial an ^^
 
Uuuuund : Sorry, aber ich finde da keine Tutorials... ich sehe nur eine Liste mit Methode, und Beispielen wie man die verwendet....
und wo sollen beispielprogramme und tutorials sein ?
 
Ja, das ist ja super toll, wenn ich irgendwann mal ein starkes Bedürfnis nach bunten kreisen habe, aber eigentlich ging es mir darum ein Bild/eine Grafik anzeigen zu lassen...
 
und ich sage dir, dass du ein strukturelles Problem hast,
erst brauchst du ein laufenden JFrame mit einer akzeptierten paintComponent-Methode, eben nach Referenz-Beispielen mit JPanel, nicht im JFrame,
dann kannst du die einzelnen Zeichenbefehle beliebig austauschen

wenn du ein grünes Auto mit 3 Dachfenstern haben willst, lohnt es sich trotzdem noch, erstmal Fahrzeugbau grundlegend anzuschauen,
damit unten die 4 Räder und der Motor richtig sitzen, nicht willkürlich Klassen und Methoden zusammenstellen,
jedenfalls nicht bei paintComponent, das muss exakt sein,
welche Methoden danach untergeordnet dazukommen usw. ist dann Spielerei

überdenke übrigens bitte deinen Ton
 
Zuletzt bearbeitet von einem Moderator:
Ich hab es jetzt nochmal versucht, mit dem Code aus dem Tutorial nur etwas abgeändert :
Java:
import java.awt.*;

import javax.swing.*;
 
public class SwingPaintDemo {
 
	
	
    public SwingPaintDemo() {
    	
    }
 
    public static void createAndShowGui() {
        JFrame f = new JFrame("Aim For the Center");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container panel = new BullsEyePanel();
        f.getContentPane().add(panel, BorderLayout.CENTER);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
 
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
 
            @Override
            public void run() {
                createAndShowGui();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
 
    /**
     * A Swing container that renders a bullseye background
     * where the area around the bullseye is transparent.
     */
    private static class BullsEyePanel extends JPanel {
 
    	private  Image imageo;
    	
        BullsEyePanel() {
            super();
            setOpaque(false); // we don't paint all our bits
            setLayout(new BorderLayout());
            setBorder(BorderFactory.createLineBorder(Color.black));
            imageo = Toolkit.getDefaultToolkit().getImage("Bomber1.png");
        }
 
        @Override
        public Dimension getPreferredSize() {
            // Figure out what the layout manager needs and
            // then add 200 to the largest of the dimensions
            // in order to enforce a 'round' bullseye
            Dimension layoutSize = super.getPreferredSize();
            int max = Math.max(layoutSize.width, layoutSize.height);
            return new Dimension(max + 200, max + 200);
        }
 
        @Override
        protected void paintComponent(final Graphics g) {
            super.paintComponent(g);
            Dimension size = getSize();
            int x = 0;
            int y = 0;
            int i = 0;
            
                
                g.drawImage(imageo, 0, 0, this);
            
        }
    }
}

Funktioniert natürlich nicht... Wird einfach nichts gezeichnet....
 
siehe auch mein Posting zwischendurch, aber passt ja nun dazu

-------

ein Bild von der Festplatte zu laden ist immer kritisch, für andere nicht am Code nachvollziebar ob das bei dir überhaupt existiert,
an der richtigen Stelle sitzt um gefunden zu werden usw.,

füge folgende drei Zeilen in deine main-Methode ein, dürften klar sein:
Java:
        File f = new File("Bomber1.png");
        System.out.println(f.exists());
        System.out.println(f.getAbsolutePath());

und verwende zum Bilder-Laden lieber:
Java:
new ImageIcon("Bomber1.png").getImage()
 
probiere mal anstelle des png-Bildes ein jpg, bzw. jpeg..

[edit]warum auch immer, mit png und Zugriff auf der Festplatte klappt es zumindest bei mir auch nicht....per URL haut das hin

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Game1 {

	public Game1() {

	}

	public static void createAndShowGui() {
		JFrame f = new JFrame("Aim For the Center");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container panel = new BullsEyePanel();
		f.getContentPane().add(panel, BorderLayout.CENTER);
		f.pack();
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}

	public static void main(final String[] args) {
		Runnable gui = new Runnable() {

			@Override
			public void run() {
				createAndShowGui();
			}
		};
		// GUI must start on EventDispatchThread:
		SwingUtilities.invokeLater(gui);
	}

	/**
	 * A Swing container that renders a bullseye background where the area
	 * around the bullseye is transparent.
	 */
	private static class BullsEyePanel extends JPanel {

		private Image imageo;

		BullsEyePanel() {
			super();
			setOpaque(false); // we don't paint all our bits
			setLayout(new BorderLayout());
			setBorder(BorderFactory.createLineBorder(Color.black));
			try {
				imageo = new ImageIcon(
						new URL(
								"http://openclipart.org/image/250px/svg_to_png/4982/laurent_bomber.png"))
						.getImage();
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		@Override
		public Dimension getPreferredSize() {
			// Figure out what the layout manager needs and
			// then add 200 to the largest of the dimensions
			// in order to enforce a 'round' bullseye
			Dimension layoutSize = super.getPreferredSize();
			int max = Math.max(layoutSize.width, layoutSize.height);
			return new Dimension(max + 200, max + 200);
		}

		@Override
		protected void paintComponent(final Graphics g) {
			super.paintComponent(g);
			Dimension size = getSize();
			int x = 0;
			int y = 0;
			int i = 0;
			System.out.println(imageo);
			g.drawImage(imageo, 0, 0, this);

		}
	}
}
[/edit]
 
Zuletzt bearbeitet:
Deinen Pfad zum Bild angeben und es sollte funktionieren. Bei mir tut es das jedenfalls.

Code:
import java.awt.Image;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.BorderLayout;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageExample {
	private Image image;
	private JFrame window;
	private JPanel panel;
	
	public ImageExample() {
		this.image = Toolkit.getDefaultToolkit().createImage("smiley.png");
		
		createGUI();
	}
	
	public static void main(String[] args) {
		ImageExample ie = new ImageExample();
	}
	
	private void createGUI() {
		window = new JFrame("Image Draw Test");
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		panel = new JPanel() {
			@Override
			public void paintComponent(final Graphics g) {
				super.paintComponent(g);
				
				g.drawImage(image, 0, 0, this);
			}
		};
		
		panel.setPreferredSize(new Dimension(300,300));
		
		window.getContentPane().add(panel, BorderLayout.CENTER);
		window.pack();
		window.setVisible(true);
		
	}
}
 
Zuletzt bearbeitet:
Danke schonmal... Also es wird noch nichts gezeichnet. Wo muss ich denn das Bild hinlegen ? ich habe es in Eclipse links bei der Ordnerstruktur zu default Package, da wo auch die Klasse drin ist, reingetan ^^
 
und ich habe dir drei Zeilen gepostet:
Java:
        File f = new File("Bomber1.png");
        System.out.println(f.exists());
        System.out.println(f.getAbsolutePath());
ausnahmsweise ohne dazuzuschreiben wofür, nicht zu erraten?
lege die Datei so, dass der angezeigte Pfad stimmt, ergo exists() true ergeben wird, dann könnte es schon weitaus eher klappen
 
Ich leg immer nen neues Package an mit Namen "images" oder sowas in die Richtung und leg darein eine Klasse namens "ImageLoader" - Die sieht dann z.B. so aus:
Java:
public class ImageLoader {

    public static BufferedImage load(String s) {

        try {
            return ImageIO.read(ImageLoader.class.getResourceAsStream(s));
        } catch(Exception e) { return null; }
    }
}

Dann einfach die Bilder in das "images" package legen und mit [c]ImageLoader.load("Bomber1.png");[/c] laden 😉

Wenn du mehrfachladen schneller machen willst, dann benutze das:

Java:
public class ImageLoader {

    private HashMap<String, BufferedImage> imgs = new HashMap<String, BufferedImage>();
    public static BufferedImage load(String s) {

        try {
            if(!imgs.containsKey(s))
                imgs.put(s, ImageIO.read(ImageLoader.class.getResourceAsStream(s)));
        } catch(Exception e) { }

        return imgs.get(s);
    }
}
 

Neue Themen


Zurück
Oben