Toon posts:

[Java] Tekenen, de beste manier

Pagina: 1
Acties:

Verwijderd

Topicstarter
Iedereen die met java werkt heeft natuurlijk wel getekent. Meestal op het begin, gaat dat dmv paint methode van het applet. Later door middel van je klassen een eigen paint methode te geven. NOu ben ik ook wel eens aan het tekenen met java, maar zit ik met de vraag in mn maag, wat is nou de beste manier. De manieren die ik heb gebruikt zijn

- Een hoofdklasse maken die van canvas overerft en het grapics object aan de paint methodes van de andere objecten meegeven waarmee getekent wordt.

- De klassen die getekent kunnen worden van component laten erfen(beetje overkill)

- ehh, kan er even niet opkomen, maar volgens mij zijn er nog meerdere manieren.

Maar mijn vraag is dus, wat is de beste manier om je klassen te maken als je veel kleine dingen hebt die getekent moeten worden dus bijvoorbeeld een spel met player, enemy etcetera.

Een ander probleem waar ik wel eens tegen ben gelopen hiermee, is dat soms maar een enkel object verplaatst en ik het te duur vind om het hele scherm te repainten, daarvoor had ik bedacht om met de achtergrondkleur (bijv zwart)het hele object in te kleuren en dan het verplaatste object weer te tekenen. bij

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


    private GameObjectModel oldModel;


    public BallView( MutableGameObjectModel model ){
        super( model );
        oldModel = GameObjectModel.getGameObjectModel( model );
    }

    public void paint(Graphics g) {
        g.setColor( Color.BLACK );
        g.fillOval( oldModel.getX(), oldModel.getY(), oldModel.getWidth(), oldModel.getHeight());
        g.setColor( Color.YELLOW );
        g.fillOval( model.getX(), model.getY(), model.getWidth(), model.getHeight() );
        oldModel = GameObjectModel.getGameObjectModel( model );
    }


iemand nog tips of links voor de betse manier om met dit soort dingen om te gaan, want in de meeste boeken hierover staan alleen maar smerige code examples


[edit]kwam opeens op nog iets wat ik wel eens gebruikte
namelijk bijhouden of het model veranderd is en als alle objecten gerepaint worden wordt er niks getekent bij die objecten(zie onder)

Java:
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
public class WallView extends View implements ModelListener{

     private boolean updated = true;
    
    /**
     * @param model
     */
    public WallView(Wall model) {
        super(model);
        model.attachListener( this );
    }

    /* (non-Javadoc)
     * @see balspelletje.View#paint(java.awt.Graphics)
     */
    public void paint(Graphics g) {     
        if( updated ){
        g.setColor( Color.BLACK );
        g.fillRect( model.getX(), model.getY(), model.getWidth(), model.getHeight() );
        Wall wall = (Wall)model;
        List list =  wall.getBlocks();
        for( Iterator it = list.iterator(); it.hasNext(); ){
            AbstractBlock block = (AbstractBlock)it.next();
            View blockview = null;
            if( block instanceof DefaultBlock ){
                 blockview = new DefaultBlockView( block );
            }else if(block instanceof DoubleBlock ){
                 blockview = new DoubleBlockView( block );              
            }else if(block instanceof LargerBlock ){
                 blockview = new LargerBlockView( block );              
            }               
            blockview.paint( g );           
        }
            updated = false;
        }
    }

    public void update( GameObjectModel model ){
           updated = true;
    }



}

[ Voor 27% gewijzigd door Verwijderd op 21-07-2005 21:48 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21:38

Robtimus

me Robtimus no like you

Meestal gebruik ik hiervoor gewoon JPanels, override paintComponent en doe het tekenen daarin. Dan geef ik idd vaak de objecten die getekend moeten worden zelf een draw(Graphics) method aangezien ze zelf het beste weten hoe ze getekend moeten worden ;)

Wat ik trouwens vaker doe als het een plaatje is, zeker als dat moet kunnen bewegen, is een JLabel nemen en die een image icon geven van het plaatje. Doet Java al het werk voor me, en kan ik de listeners gewoon aan het JLabel hangen. Hoef ik ook niet te achterhalen welk plaatje een event getriggerd heeft.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
geen andere suggesties?

  • Johnny
  • Registratie: December 2001
  • Laatst online: 24-04 11:10

Johnny

ondergewaardeerde internetguru

Voor dingen die niet meteen op je scherm moeten kun je heel goed BufferedImage gebruiken samen met Graphics2D, het is een heel stuk flexibeler dan Paint & Graphics en geeft je een heleboel controle.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Verwijderd

Zoek maar 'ns naar het Model View Controller paradigma...

Verwijderd

Topicstarter
sja kijk naar mn code dan, heb mvc toegepast.

  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

Wat me opvalt in je 2e code voorbeeld is dat je iedere keer als er gepaint wordt voor elk AbstractBlock een nieuw View object instantieerd.
Het lijkt me handiger als je in AbstractBlock een getView() method o.i.d. aanmaakt zodat je die instanties ook kunt cachen. Dat scheelt de garbage collector ook weer een hoop werk.

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 00:59

alienfruit

the alien you never expected

Uuh, blitten?
Pagina: 1