Avatar billede wirehead Nybegynder
28. april 2005 - 21:51 Der er 7 kommentarer

Graphics2d problemer

Hej...
Jeg sidder med bakser rundt med Graphics2D og skal have lavet en flok robotter der bevæger sig rundt på skærmen.
Robot klassen indholder infor om robottens position og retning.
Jeg ville så gerne have at klasen kunne "tegnes" direkte på et Graphics2d. Så jeg har prøvet at implementere paint() (så den placere robotten korrekt og drejer denne med transform) men jeg kan ikke helt få det til at virke. Robotternes position ændre sig hele tiden så det skulle gerne virke sådan at en timer sørger for gentagene kald til repaint så det hele blev animeret..
Nogen der kan smide lidt kode op ?
Avatar billede arne_v Ekspert
28. april 2005 - 21:57 #1
Du laver:
  - en paint som tegner udfra nogle variable
  - en selvstændig Thread som:
      - opdaterer disse variabel
      - kalder repaint
    med et bestemt interval
Avatar billede wirehead Nybegynder
28. april 2005 - 22:17 #2
Her er hvad jeg har so far...
SimulatorView.java (JFramen til til applikationen)
import javax.swing.*;   
import java.awt.event.*;

public class SimulatorView extends JFrame {
   
    public SimulatorView( String title ) {
        super( title );
        System.out.println("SimulatorView: Stating GUI");

        //Add canvas
        WorldView vw = new WorldView();
        getContentPane().add(vw);
       
        addWindowListener( new ApplicationTerminator() );
        Timer t = new Timer(200,vw);
        t.start();
        setSize( 500, 500 );
        setVisible( true );
      }
    }

    class ApplicationTerminator extends WindowAdapter {
      public void windowClosing( WindowEvent e ) {
        System.out.println("Normal System exit(Main window close)");
        System.exit(0);
      }
    }


WorldView.java (Et JPanel til Graphic2D kanvaset)
mport javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class WorldView extends JPanel implements ActionListener{
   
    int robox = 20;
    int roboy=20;
    RobotIcon robo = new RobotIcon(200,200,33);
   
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
       
       
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(Color.black);
        g2d.fill(robo);
       
       
       
       
           
    }
    public void actionPerformed(ActionEvent event) {
        robo.offsetPosition(10,10); //Flyt lidt på robotten
        repaint();
       
    }

RobotIcon.java (Indkapsling af rendering innformationen til robboterne)

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
public class RobotIcon extends Area {
   
   
    Point location, centre;
    double direction;
   
    public RobotIcon(int x, int y, int direction)
    {
        this.direction = Math.toRadians(direction);
        location = new Point(x,y);
        centre = new Point(x+4,y+4);
        Ellipse2D.Double body = new Ellipse2D.Double(location.x, location.y, 8, 8);
        Rectangle2D.Double heading = new Rectangle2D.Double(centre.x, centre.y, 10,2);
        Area bodyArea = new Area(body);
        Area headingArea = new Area(heading);
       
        add(bodyArea);
        add(headingArea);
    } // end primary constructor
   
    public void paint(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g.create();
       
        g2.translate(location.x, location.y);
        g2.rotate(direction, centre.x, centre.y);
       
        g2.fill(this);
       
        g2.dispose();
    }
   
    public void offsetPosition(int x, int y) {
        location.translate(x,y);
        centre.translate(x,y);
    }
   
}

Der er to problemer... robotten bliver ikke roteret... og der er ingen animation...
nogen ideer?
Avatar billede arne_v Ekspert
28. april 2005 - 22:33 #3
det ligger vist lidt ud over min viden
Avatar billede arne_v Ekspert
28. april 2005 - 22:34 #4
Men du kan spare din WindowAdapter med en:

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Avatar billede wirehead Nybegynder
28. april 2005 - 22:37 #5
jep... men det er dog ikke helt problemet... :)
Avatar billede arne_v Ekspert
28. april 2005 - 22:39 #6
Det ved jeg godt.

Jeg tror at du skl have Carsten eller en af de andre GUI kyndige til at kigge på det.
Avatar billede wirehead Nybegynder
28. april 2005 - 22:52 #7
ahh... det her virkede...
Tak for forsøget arne_v
public class WorldView extends JPanel implements ActionListener{
   
    int robox = 20;
    int roboy=20;
    RobotIcon robo = new RobotIcon(20,20,180);
   
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
       
       
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(Color.black);
        robo.paint(g);
       
       
       
       
           
    }
    public void actionPerformed(ActionEvent event) {
        robo.offsetPosition(1,1);
        repaint();
       
    }
   

}
public class RobotIcon  extends Area {
   
   
    Point location, centre;
    double direction;
   
    public RobotIcon(int x, int y, int direction)
    {
        this.direction = Math.toRadians(direction);
        location = new Point(x,y);
        centre = new Point(x+4,y+4);
        Ellipse2D.Double body = new Ellipse2D.Double(location.x, location.y, 8, 8);
        Rectangle2D.Double heading = new Rectangle2D.Double(centre.x, centre.y, 2,10);
        Area bodyArea = new Area(body);
        Area headingArea = new Area(heading);
       
        add(bodyArea);
        add(headingArea);
    } // end primary constructor
   
    public void paint(Graphics g)
    {
        System.out.println("Called!");
        Graphics2D g2 = (Graphics2D) g.create();
       
        g2.translate(location.x, location.y);
        g2.rotate(direction, centre.x, centre.y);
       
        g2.fill(this);
       
        g2.dispose();
    }
   
    public void offsetPosition(int x, int y) {
        location.translate(x,y);
        centre.translate(x,y);
    }
   
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester