[JAVA] paint in een andere class

  • Onderwerp starter Onderwerp starter Juzzz
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Juzzz

Gebruiker
Lid geworden
15 jan 2008
Berichten
281
Ik ben een game applet aan het maken en wil het verdelen onder meerdere classen.

nu weet ik het één en ander wel van meerder classen maar niet met applets en graphics.

wat ik wil een een aparte classe waar je de plaatje mee inlaad.
achtergonden en knoppen waar je natuurlijk ook op kunt klikken.

wat ik heb (wat het niet doet):

main.java
Code:
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;

public class Gundam extends Applet
{
    
    public void init()
    {
	
    }
    
    public void start()
    {

    }

    public void paint(Graphics g)
    {
	Graphics.background(g);
    }
}

Graphics.java
Code:
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;


public class Graphics extends Applet
{
    private Image imgBackground;

    private void getImg(String path)
    {
	imgBackground = getImage(getCodeBase(), path);
    }

    public void background(Graphics g)
    {
	//getImg("images/background.png");
	imgBackground = getImage(getCodeBase(), "images/background.png");
	g.drawImage(imgBackground, 0, 0, this);
	
    }

}

*ik heb er al een beetje mee zitten spelen dus er kunnen wat stomme fouten in zitten

alvast bedankt

EDIT:

omdat niemand reageert constateer ik dat mijn vraag te onduidelijk was.

Vraag
Ik wil een game maken, daar heb je meerdere schermen (bv. main, single player, opties, etc)

hoe maak ik die schermen en knoppen en hoe roep ik deze dan op?

voorbeeld:
screen_start.png
screen_singleplayer.png


een tip van mijn java leraar was om verschillende classes (files) te maken met een JPanel en die adden of removen?

..kon het niet vinden op het net.. en zelf kon hij ook geen voorbeeld geven.

kan iemand mij daar een voorbeeld voor geven?
 
Laatst bewerkt:
Maar 1 klasse zou Applet moeten extenden. Je andere klasse zou niets hoeven te extenden.

Pas wel op me je klasse Graphics te noemen. Dit is ook een Java klasse en als je dan ook wildcards gaat gebruiken in je import.
Kan het gebeuren dat je denkt dat je eigen klasse wordt gebruikt maar eigenlijk de java klasse. I

Ik zal ook het laden van je plaatje in de constructor zetten. Het plaatje hoeft je maar 1x in te laden..en niet bij elke paint..

succes.
 
Maar 1 klasse zou Applet moeten extenden. Je andere klasse zou niets hoeven te extenden.

Pas wel op me je klasse Graphics te noemen. Dit is ook een Java klasse en als je dan ook wildcards gaat gebruiken in je import.
Kan het gebeuren dat je denkt dat je eigen klasse wordt gebruikt maar eigenlijk de java klasse. I

Ik zal ook het laden van je plaatje in de constructor zetten. Het plaatje hoeft je maar 1x in te laden..en niet bij elke paint..

succes.

zou jij voor mij een klein voorbeetje kunnen maken?
hoeft maar met één achtergrond en 2 plaatjes (als knoppen) bijvoorbeeld.

dan begrijp ik het wat sneller

alvast bedankt
 
sorry voor de dubbel post..

omdat niemand reageert constateer ik dat mijn vraag te onduidelijk was.

Vraag
Ik wil een game maken, daar heb je meerdere schermen (bv. main, single player, opties, etc)

hoe maak ik die schermen en knoppen en hoe roep ik deze dan op?

voorbeeld:
screen_start.png
screen_singleplayer.png


een tip van mijn java leraar was om verschillende classes (files) te maken met een JPanel en die adden of removen?

..kon het niet vinden op het net.. en zelf kon hij ook geen voorbeeld geven.

kan iemand mij daar een voorbeeld voor geven?
 
hierbij een klein voorbeeld.. de uitleg staat in de code...

succes

ps. gebruik altijd Swing dus JApplet/JPanel ed. ipv AWT (Applet, Panel). AWT is verouderd en Swing kan veel meer. :)

Code:
package nl.helpmij.applet;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Applet extends JApplet {

    private GraphicsPanel paneel; //dit paneel tekent van het plaatje.

     @Override
    public void init() {
        //gebruik de init() functie van de applet voor zware opdrachten zoals plaatje inladen.
        paneel = new GraphicsPanel("http://www.google.com/images/logo_plain.png");
    }

    @Override
    public void start() {
        //
        setLayout(new BorderLayout());
        add(paneel, BorderLayout.CENTER); //het plaatje komt in centrale deel van het scherm

        //twee knoppen die bijna het zelfde doen.. dus is hulp functie die de knoppen aanmaakt.
        JButton roteerLinks = createButton("Roteer linksom", -45);
        JButton roteerRechts = createButton("Roteer rechtsom", 45);

        //een paneel voor de knoppen.
        JPanel knopPaneel = new JPanel(new GridLayout(1, 2));  //1 row, 2 columns
        knopPaneel.add(roteerLinks);
        knopPaneel.add(roteerRechts);

        add(knopPaneel, BorderLayout.SOUTH); //de knoppen komen onderin het scherm.
    }

    //hulp functie maakt een knop aan.
    private JButton createButton(final String tekst, final int graden) {
        JButton knop = new JButton(tekst);
        knop.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //op knop gedrukt. geeft het paneel de opdracht het plaatje te roteren.
                paneel.roteer(graden);
            }
        });
        return knop;
    }

    //deze class mag ook in eigen file staan.
    public static class GraphicsPanel extends JPanel {

        private Image plaatje;
        private int graden = 0;

        //constructor van het paneel, laadt het plaatje.
        public GraphicsPanel(String url) {
            plaatje = null;
            try {
                plaatje = ImageIO.read(new URL(url));
            } catch (IOException e) {
                //hier moet nog extra code, het plaatje laden lukte niet.. dus moeten een
                //waarschuwing laten zien.
            }
        }

        @Override
        public void paintComponent(Graphics g) { // hier wordt het paneel getekend. 
            super.paintComponent(g); // leegt de achtergrond
            Graphics2D g2 = (Graphics2D) g; // ik wil java 2d gebruiken ipv standaard swin.

            double hplaatje = plaatje.getHeight(null); // ipv null zou hier een imageobserver moeten staan.
            double bplaatje = plaatje.getWidth(null);  // het kan zijn dan het plaatje nog niet is ingeladen
                                                       // de imageobserver wordt dan aangeroepen als het inladen klaar is.
            double hpaneel = getHeight(); //maten van het paneel
            double bpaneel = getWidth();

            AffineTransform transform = new AffineTransform(); //we willen het plaatje transformeren
            transform.rotate(Math.toRadians(graden),bpaneel / 2, hpaneel /2);  //eerst roteren.
            transform.scale(bpaneel/bplaatje, hpaneel/hplaatje);  //dan scalen...

            g2.drawImage(plaatje, transform, null); //we teken & transformeren het plaatje.
        }

        private void roteer(int graden) {
            this.graden += graden;
            repaint(); //teken het plaatje opnieuw
        }
    }
}
 
hierbij een klein voorbeeld.. de uitleg staat in de code...

succes

ps. gebruik altijd Swing dus JApplet/JPanel ed. ipv AWT (Applet, Panel). AWT is verouderd en Swing kan veel meer. :)

Code:
  code..

super bedankt voor het voorbeeld alleen is het niet helemaal wat ik wil.

ik wil een achtergrond plaatje met daar IN knoppen (lieftst als plaatje) waardoor het scherm veranderd wordt naar een ander scherm met daarin weer andere knoppen.

dus zoals in een spel.. met verschillende vensters als de main, opties, single player, etc.


bedankt.
 
zo iets ?? Ik heb veel code van de vorige hergebruikt. Alleen de info knop laat nu een ander
scherm zien...

succes.

Code:
package nl.helpmij.applet;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JPanel;

public class Applet extends JApplet {

    private GraphicsPanel paneel; //dit paneel tekent van het plaatje.
    private InfoPanel info;

    private CardLayout layout;
    private final static String GRAPHICS = "Graphics";
    private final static String INFO = "Info";

    @Override
    public void init() {
        //gebruik de init() functie van de applet voor zware opdrachten zoals plaatje inladen.
        paneel = new GraphicsPanel("http://www.google.com/images/logo_plain.png", this);
        info = new InfoPanel("http://www.google.com/corporate/", this);
    }

    @Override
    public void start() {
        //card layout kan je meerdere panels toevoegen, en later nog kiezen 
        //welke panel zichtbaar is.
        layout = new CardLayout();
        Container container = getContentPane();
        container.setLayout(layout);
        container.add(paneel, GRAPHICS);  //GRAPHICS is de naame v/h paneel
        container.add(info, INFO);
        showGraphics();
    }

    public void showGraphics() {
        layout.show(getContentPane(), GRAPHICS);
    }

    public void showInfo() {
        layout.show(getContentPane(), INFO);
    }

    public static class InfoPanel extends JPanel {

        private JEditorPane info;

        public InfoPanel(String url, Applet applet) {
            try {
                info = new JEditorPane(url);
            } catch (IOException ex) {
                info = new JEditorPane();
                info.setText("Kan pagina niet vinden");
            }
            info.setEditable(false);

            JButton terugKnop = createTerugKnop(applet);

            setLayout(new BorderLayout());
            add(info, BorderLayout.CENTER);  //info tekst komt in het midden.
            add(terugKnop, BorderLayout.SOUTH); //terug knop onderaan.
        }

        private JButton createTerugKnop(final Applet applet) {
            JButton knop = new JButton("Terug");
            knop.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    applet.showGraphics(); //laat applet graphics scherm weer voor zetten.
                }
            });
            return knop;
        }
    }

    public static class GraphicsPanel extends JPanel {

        private Image plaatje;
        private int graden = 0;

        //constructor van het paneel, laadt het plaatje.
        public GraphicsPanel(final String url, final Applet applet) {
            plaatje = null;
            try {
                plaatje = ImageIO.read(new URL(url));
            } catch (IOException e) {
                //hier moet nog extra code, het plaatje laden lukte niet.. dus moeten een
                //waarschuwing laten zien.
            }

            //twee knoppen die bijna het zelfde doen.. dus is hulp functie die de knoppen aanmaakt.
            JButton roteerLinks = createButton("Roteer linksom", -45);
            JButton roteerRechts = createButton("Roteer rechtsom", 45);
            JButton helpKnop = createAboutKnop(applet);

            //maakt knoppen even groot.
            roteerLinks.setPreferredSize(roteerRechts.getPreferredSize()); 

            //code om de knoppen een beetje uit te lijnen.
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();  
            gbc.anchor = GridBagConstraints.CENTER;
            gbc.fill = GridBagConstraints.NONE;
            gbc.insets = new Insets(10, 10, 10, 10); //ruimt om de knop
            add(roteerLinks, gbc);
            gbc.gridx = 1;
            add(roteerRechts, gbc);
            gbc.gridy = 1;
            gbc.gridx = 1;
            gbc.anchor = GridBagConstraints.EAST;
            add(helpKnop, gbc);
        }

        //hulp functie maakt een knop aan.
        private JButton createButton(final String tekst, final int graden) {
            JButton knop = new JButton(tekst);
            knop.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    roteer(graden);
                }
            });
            return knop;
        }

        private JButton createAboutKnop(final Applet applet) {
            JButton knop = new JButton("Info");
            knop.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    applet.showInfo(); //vraagt applet om info paneel te laten zien.
                }
            });
            return knop;
        }

        @Override
        public void paintComponent(Graphics g) { // hier wordt het paneel getekend.
            super.paintComponent(g); // leegt de achtergrond
            Graphics2D g2 = (Graphics2D) g; // ik wil java 2d gebruiken ipv standaard swin.

            double hplaatje = plaatje.getHeight(null); // ipv null zou hier een imageobserver moeten staan.
            double bplaatje = plaatje.getWidth(null);  // het kan zijn dan het plaatje nog niet is ingeladen
            // de imageobserver wordt dan aangeroepen als het inladen klaar is.
            double hpaneel = getHeight(); //maten van het paneel
            double bpaneel = getWidth();

            AffineTransform transform = new AffineTransform(); //we willen het plaatje transformeren
            transform.rotate(Math.toRadians(graden), bpaneel / 2, hpaneel / 2);  //eerst roteren.
            transform.scale(bpaneel / bplaatje, hpaneel / hplaatje);  //dan scalen...

            g2.drawImage(plaatje, transform, null); //we teken & transformeren het plaatje.
        }

        private void roteer(int graden) {
            this.graden += graden;
            repaint(); //teken het plaatje opnieuw
        }
    }
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan