1. #1

    Registered
    04/04/12
    Location
    Hasselt
    Posts
    16
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0

    JAVA spel (opdracht)

    Hallo,

    Onderstaande foto is hetgeen wat ik heb gemaakt, en heel eronder een stuk code van het spel.
    Het roze is een mannetje en het gele is gewoon een oppervlak.
    De vraag is hoe kan ik het gele laten staan als het mannetje erover heen gaat?
    (Telkens als ik erover heen ga wordt het vakje terug zwart.)




    Met de code heb ik gebruik gemaakt van dubbel buffering.

    Code:
    import java.awt.*;
    
    public class View extends Canvas
    {
        private Doolhof doolhof;
        private int b, h;
        private int marge;
    
        private Image buffer;
        /**
         * Constructor for objects of class View
         */
        public View(Doolhof doolhof)
        {
            this.doolhof = doolhof;
            b = 20;
            h = 20;
            marge = 18;
        }
    
        public void paint(Graphics g) {
            if (buffer == null ||
            buffer.getWidth(this) < getWidth() ||
            buffer.getHeight(this) < getHeight() 
            ) {
                buffer = createImage(getWidth(), getHeight());
            }
            // teken op de buffer ipv op de canvas
            teken(buffer.getGraphics());
            // teken de buffer op de canvas
            g.drawImage(buffer, 0, 0, this);
        }
    
        public void update(Graphics g) {
            paint(g);    
        }
    
        public void teken(Graphics g) {   
            g.clearRect(0,0, getWidth(), getHeight()); 
            b = getWidth()/doolhof.getBreedte();
            h = (getHeight()-marge)/doolhof.getHoogte();
            g.drawString(doolhof.getPunten() + "/" + doolhof.getTeBehalenPunten(),
                10, 15);
    
            for (int i=0; i < doolhof.getBreedte(); i++) {
                for (int j=0; j < doolhof.getHoogte(); j++) {
                    Voorwerp vw = doolhof.getVoorwerpOp(i, j);
                    if (vw == null) {
                        g.setColor(Color.BLACK);
                        g.fillRect(i*b,j*h+marge, b,h);
                    }
                    else if (vw instanceof Aarde) {
                        tekenAarde(g, i*b,j*h+marge);   
                    }
                    else if (vw instanceof Speler) {
                        tekenSpeler(g, i*b,j*h+marge);   
                    }
                    g.setColor(Color.WHITE);
                    g.drawRect(i*b,j*h+marge, b,h);
                }
            }
        }
    
        private void tekenAarde(Graphics g, int x, int y) {
            g.setColor(Color.YELLOW);
            g.fillRect(x,y, b, h);
        }
    
        private void tekenSpeler(Graphics g, int x, int y) {
            g.setColor(Color.PINK);
            g.fillRect(x,y, b, h);
        }
    }
    Alvast bedankt!!
    no votes  

  2. #2
    NeverwinterX's Avatar
    Registered
    27/08/04
    Location
    Leuven
    Posts
    930
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    11/38
    Dat gebeurt omdat het aarde voorwerp in die positie in het doolhof verwijderd wordt als het mannetje erin wordt gestoken.
    I am thee and thou art me and all of one is the other.
    TED talk: Richard Dawkins on militant atheism
    no votes  

  3. #3

    Registered
    04/04/12
    Location
    Hasselt
    Posts
    16
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0
    Quote Originally Posted by NeverwinterX View Post
    This quote is hidden because you are ignoring this member. Show
    Dat gebeurt omdat het aarde voorwerp in die positie in het doolhof verwijderd wordt als het mannetje erin wordt gestoken.
    Hoe kan ik dat dan anders schrijven? Wanneer het mannetje dezelfde positie heeft het mannetje wordt afgebeeld en als het verder gaat dan terug het aarde voorwerp wordt weergegeven.
    no votes  

  4. #4
    Lethall's Avatar
    Registered
    05/04/06
    Location
    Zwijnaarde
    Posts
    1,749
    iTrader
    9 (91%)
    Mentioned
    0 Post(s)
    Eerste idee dat in mijn hoofd opkomt is gewoon:

    Een array dat uw doolhof voorstelt, en dus bepaalde plaatsen zijn dan muren (of wat het exact is in het spel, die gele oppervlakken).

    Dan hebt ge uw "manneke", maar de array van uw doolhof houd niet bij waar uw manneke zit, uw manneke heeft gewoon een x en y positie dat overeenkomt met een bepaalde positie.

    Dan tekent ge eerst uw doolhof, en dan daarna uw manneke op zijn positie. (x * breedte van 1 tile, y * breedte van 1 tile).


    Als ge het echt op uw manier wilt doen.
    Iedere keer als uw manneke op een tile gaat staan, bijhouden in een aparte variabele welk type dat is, en ene keer hij weggaat van die tile die tile terugzetten naar zijn oorspronkelijke staat (dat ge hebt bijgehouden in die variabele).
    Maar imo is dat meer een oplossing zoeken voor een probleem dat er niet moet zijn.
    Want naar mijn mening moet uw array van uw doolhof niet bijhouden waar uw manneke staat, die moet enkel bijhouden op welke posities muren staan, etc.
    no votes  

  5. #5

    Registered
    04/04/12
    Location
    Hasselt
    Posts
    16
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0
    Quote Originally Posted by Lethall View Post
    This quote is hidden because you are ignoring this member. Show
    Eerste idee dat in mijn hoofd opkomt is gewoon:

    Een array dat uw doolhof voorstelt, en dus bepaalde plaatsen zijn dan muren (of wat het exact is in het spel, die gele oppervlakken).

    Dan hebt ge uw "manneke", maar de array van uw doolhof houd niet bij waar uw manneke zit, uw manneke heeft gewoon een x en y positie dat overeenkomt met een bepaalde positie.

    Dan tekent ge eerst uw doolhof, en dan daarna uw manneke op zijn positie. (x * breedte van 1 tile, y * breedte van 1 tile).


    Als ge het echt op uw manier wilt doen.
    Iedere keer als uw manneke op een tile gaat staan, bijhouden in een aparte variabele welk type dat is, en ene keer hij weggaat van die tile die tile terugzetten naar zijn oorspronkelijke staat (dat ge hebt bijgehouden in die variabele).
    Maar imo is dat meer een oplossing zoeken voor een probleem dat er niet moet zijn.
    Want naar mijn mening moet uw array van uw doolhof niet bijhouden waar uw manneke staat, die moet enkel bijhouden op welke posities muren staan, etc.
    Het doolhof heb ik gemaakt uit een array, de gele oppervlakten zijn daar als bestaande waarden ingegeven. Maar ik krijg het niet voor elkaar om die plaatsen te behouden wanneer het 'mannetje' erover is gegaan.
    no votes  

  6. #6
    Lethall's Avatar
    Registered
    05/04/06
    Location
    Zwijnaarde
    Posts
    1,749
    iTrader
    9 (91%)
    Mentioned
    0 Post(s)
    Ofwel ben ik onduidelijk of ge moet mijn uitleg beter lezen.

    Maar nog even kort.
    In plaats van in die array bij te houden waar uw manneke staat.
    Houd ge de positie van uw manneke bij in een aparte variabele of variabelen.

    Lees dan nog eens men uitleg (eerste gedeelte), geen idee eigenlijk hoe ik het anders kan uitleggen.
    no votes  

  7. #7

    Registered
    20/09/04
    Location
    Kortrijk / Gent
    Posts
    7,177
    iTrader
    1 (100%)
    Mentioned
    0 Post(s)
    Reputation
    3/43
    Quote Originally Posted by Ismael View Post
    This quote is hidden because you are ignoring this member. Show
    Het doolhof heb ik gemaakt uit een array, de gele oppervlakten zijn daar als bestaande waarden ingegeven. Maar ik krijg het niet voor elkaar om die plaatsen te behouden wanneer het 'mannetje' erover is gegaan.
    Dan is uw datamodel verkeerd.
    Met uw view zie ik niet direct iets verkeerds.

    Als een mannetje over een geel oppervlak gaat, maar dat geel daarom logisch gezien niet verdwijnt (gewoon onzichtbaar is doordat het mannetje erop staat), dan is het onlogisch om dat te verwijderen.

    Zoals aangehaald, één mogelijkheid is om in uw tabel enkel het speelveld te tekenen. Je laat uw dubbele for lus staan in uw methode teken(Graphics g) en NA die dubbele lus doe je iets in volgende aard:

    tekenAarde(g, doolhof.getSpelerX()*b,doolhof.getSpelerX()*h+marg e);
    no votes  

  8. #8

    Registered
    04/04/12
    Location
    Hasselt
    Posts
    16
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    0/0
    Bedankt Lethall, MilM en NeverwinterX voor jullie antwoord, het is mij gelukt!
    Last edited by Ismael; 06-04-2012 at 20:11.
    no votes  

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in