Archief - JAVA Pac-Xon spel

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Frederik.89

Legacy Member
Hallo,

Als taak voor school heb ik het spel Pac-Xon gekozen. Dit moeten we in BLUEJ programmeren.
Pac-xon spel - FunnyGames.be

Ik heb in feite niet zoveel java kennis, sinds dit jaar krijgen we pas java (hogeschool).


Mijn 2 vragen (heb al verschillende dagen er tijd ingestoken maar zit nu toch wel vast)
- Hoe kan ik het veld achter mijn 'Pacman' speler kleuren in het licht blauw (CYAN). Ik heb al geprobeerd met mijn huidigeX en huidigeY te werken, maar krijg er geen goed resultaat van.

- Hoe kan ik ervoor zorgen dat de controller op het zwart veld bij het aanraken van een toets blijft gaan en op het blauw ingesloten veld vakje per vakje gaat? (Heb al gewerkt met booleans zoals bv isKleurbaar en dan dit neergeschreven bij de beweging van de pacman maar zonder enig resultaat).


Als ik dees 2 vragen weet kan ik verder, heb al veel geprobeerd :) .

Het is de bedoeling om wegwijs te geraken.


neg4r5.png



Code (View):
Code:
import java.awt.*;
import javax.swing.ImageIcon;
import java.awt.event.*;
import java.awt.geom.*;

public class View extends Canvas
{
    private Spelbord spelbord;
    private int b, h; // breedte en hoogte van elk vakje
    private int marge;

    private Image buffer;  
    /**
     * Constructor for objects of class View
     */
    public View(Spelbord spelbord)
    {
        this.spelbord = spelbord;
        b = 0; 
        h = 0; 
        marge = 25;
    }

    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) 
    {
        // standaard: eerst wissen, dan tekenen
        // nu nog alleen tekenen
        paint(g);    
    }

    private void teken(Graphics g) 
    {   
        g.clearRect(0,0, getWidth(), getHeight()); 

        b = getWidth()/spelbord.getBreedte();
        h = (getHeight()-marge)/spelbord.getHoogte();

        g.setColor(Color.BLACK);
        g.drawString("Aantal levens: " + spelbord.getLevens() + "                             " + "Score: " + spelbord.getPunten() + "                             " + "Progressie: " + spelbord.getProgressie() + "/" + "80%",
            10, 15);

        for (int i=0; i < spelbord.getBreedte(); i++) 
        {
            for (int j=0; j < spelbord.getHoogte(); j++) 
            {
                Voorwerp vw = spelbord.getVoorwerpOp(i, j);
                if (vw == null) 
                {
                    g.setColor(Color.BLACK);
                    g.fillRect(i*b,j*h+marge, b,h);
                }
                else if (vw instanceof Omkadering) 
                {
                    tekenOmkadering(g, i*b,j*h+marge);   
                }
                else if (vw instanceof Speler) 
                {
                    tekenSpeler(g, i*b,j*h+marge);   
                }
                else if (vw instanceof Inbeslagname) 
                {
                    tekenInbeslagname(g, i*b,j*h+marge);   
                }
                else if (vw instanceof Spook) 
                {
                    tekenSpook(g, i*b,j*h+marge);   
                }
                g.setColor(Color.WHITE);
                g.drawRect(i*b,j*h+marge, b,h);
            }
        }

        // Komende 4 alineas zijn voor de omkadering te tekenen
        for (int i=0; i < spelbord.getBreedte(); i++) 
        {
            for (int j=29; j < spelbord.getHoogte(); j++) 
            {
                Voorwerp vw = spelbord.getVoorwerpOp(i, j);
                if (vw == null) 
                {
                    tekenOmkadering(g, i*b,j*h+marge);   
                }
                g.setColor(Color.WHITE);
                g.drawRect(i*b,j*h+marge, b,h);
            }
        }

        for (int i=29; i < spelbord.getBreedte(); i++) 
        {
            for (int j=0; j < spelbord.getHoogte(); j++) 
            {
                Voorwerp vw = spelbord.getVoorwerpOp(i, j);
                if (vw == null) 
                {
                    tekenOmkadering(g, i*b,j*h+marge);   
                }
                g.setColor(Color.WHITE);
                g.drawRect(i*b,j*h+marge, b,h);
            }
        }

        for (int i=0; i < spelbord.getBreedte(); i++) 
        {
            int j = 0;
            Voorwerp vw = spelbord.getVoorwerpOp(i, j);
            if (vw == null) 
            {
                tekenOmkadering(g, i*b,j*h+marge);   
            }
            g.setColor(Color.WHITE);
            g.drawRect(i*b,j*h+marge, b,h);
        }

        for (int j=0; j < spelbord.getHoogte(); j++) 
        {
            int i = 0;
            Voorwerp vw = spelbord.getVoorwerpOp(i, j);
            if (vw == null) 
            {
                tekenOmkadering(g, i*b,j*h+marge);   
            }
            g.setColor(Color.WHITE);
            g.drawRect(i*b,j*h+marge, b,h);
        }
    }

    private void tekenOmkadering(Graphics g, int x, int y) 
    {
        g.setColor(Color.BLUE);
        g.fill3DRect(x,y, b, h,true);
    }

    private void tekenInbeslagname(Graphics g, int x, int y) 
    {
        g.setColor(Color.CYAN);
        g.fillRect(x,y, b, h);
    }

    private void tekenSpeler(Graphics g, int x, int y) 
    {
        g.setColor(Color.YELLOW);
        g.fillOval(x,y, b, h);
    }

    private void tekenSpook(Graphics g, int x, int y) 
    {
        g.setColor(Color.RED);
        g.fillOval(x,y, b, h);
    }
}

Code (Spelbord):
Code:
import javax.swing.JOptionPane;
public class Spelbord
{
    private Voorwerp[][] rooster;

    // private Level 1;
    private int breedte, hoogte;
    private int progressie, levens, punten;
    private int huidigeX, huidigeY;

    private Speler pac;
    private Inbeslagname kleuren;

    private boolean dood;

    /**
     * Constructor for objects of class Spelbord
     */
    public Spelbord()
    {
        hoogte = 30;
        breedte = 30;
        rooster = new Voorwerp[breedte][hoogte];

        rooster[15][12] = new Spook();

        kleuren = new Inbeslagname();

        pac = new Speler();

        huidigeX = 0;
        huidigeY = 0;
        rooster[huidigeX][huidigeY] = pac;
        progressie = 0;
        levens = 3;
    }

    /**
     * Geeft de breedte van het spelbord
     * 
     * @return de breedte (in aantal vakjes)
     */
    public int getBreedte() {
        return breedte;    
    }

    /**
     * Geeft de hoogte van het spelbord
     * 
     * @return de hoogte (in aantal vakjes)
     */
    public int getHoogte() {
        return hoogte;    
    }

    /**
     * welk voorwerp ligt er op vakje (x,y)?
     * 
     * @param x de x-coordinaat van het gewenste vakje
     * @param y de y-coordinaat van het gewenste vakje
     * @return het voorwerp, null als er niks ligt
     */
    public Voorwerp getVoorwerpOp(int x, int y) {
        // implementatiebeslissing: fool proof maken
        if (x < 0 || x >= breedte || y < 0 || y >= hoogte) return null;

        return rooster[x][y];    
    }

    /**
     *  Hoeveel procent heeft de speler al veroverd?
     * 
     * @return de progressie
     */
    public int getProgressie() {
        return progressie;    
    }

    /**
     *  Hoeveel levens heeft de speler?
     * 
     * @return het aantal levens
     */
    public int getLevens() {
        return levens;    
    }

    /**
     *  Hoeveel punten heeft de speler al behaald?
     * 
     * @return het aantal punten
     */
    public int getPunten() {
        return punten;    
    }

    // setters
    public void rechts() {
        beweeg(1,0);
    }

    public void links() {
        beweeg(-1,0);
    }

    public void onder() {
        beweeg(0,1);
    }

    public void boven() {
        beweeg(0,-1);
    }

    private void GameOver () {

        String options [] = {"Yes", "No"};
        int option = JOptionPane.showOptionDialog(null, "Game Over !!" + "\n\n Play again?", "Pac-Xon v1.0 - GAME OVER", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE, null, options, options[0]);

        if (option == JOptionPane.YES_OPTION) {
            NieuwSpel();
            System.out.println ("Nieuw spel starten");
        }
        else {
            System.exit (0);
        }
    }

    private void NieuwSpel() {

    }

    private void beweeg(int dx, int dy) {
        if (dood) return; // niks doen als het manneke dood is 

        int doelX = huidigeX + dx;
        int doelY = huidigeY + dy;

        // niet buiten het rooster lopen
        if (doelX < 0) return;
        if (doelX >= breedte) return;
        if (doelY < 0) return;
        if (doelY >= hoogte) return;

        if (rooster[doelX][doelY] == null) {
            if(rooster[doelX][doelY] == rooster[15][12]){
                levens--;
                if(levens<0){
                    GameOver();
                }
                return;
            }
            rooster[huidigeX][huidigeY] = null;

            huidigeX = doelX;
            huidigeY = doelY;
            rooster[doelX][doelY] = pac;

        }
        else {
            Voorwerp vw = rooster[doelX][doelY];

            if(rooster[doelX][doelY] == rooster[15][12]){
                levens--;
                if(levens<0){
                    GameOver();
                }
                return;
            }

            if (vw.isBetreedbaar()){

                rooster[huidigeX][huidigeY] = null;

                huidigeX = doelX;
                huidigeY = doelY;
                rooster[doelX][doelY] = pac;

            }
        }
    }
}

Code (Controller):
Code:
import java.awt.event.*;

public class Controller implements KeyListener
{
    private Spelbord spelbord;
    private View view;

    /**
     * Constructor for objects of class Controller
     */
    public Controller(Spelbord spelbord, View view)
    {
        this.spelbord = spelbord;
        this.view = view;
        view.addKeyListener(this);
    }

    public void keyPressed(KeyEvent e) {
                    switch (e.getKeyCode()) {
                case KeyEvent.VK_RIGHT:
                spelbord.rechts();
                break;     
                case KeyEvent.VK_LEFT:
                spelbord.links();
                break;     
                case KeyEvent.VK_UP:
                spelbord.boven();
                break;     
                case KeyEvent.VK_DOWN:
                spelbord.onder();
                break;     
            }
            view.repaint();
        
        
    }

    public void keyReleased(KeyEvent e) {}

    public void keyTyped(KeyEvent e) {}

}

Het spel van wat ik tot nu toe al heb:
https://rapidshare.com/files/228893149/Pac-Xon_v1.0.rar


Alvast bedankt!

Frederik

Lethall

Legacy Member
Frederik.89 zei:
Mijn 2 vragen (heb al verschillende dagen er tijd ingestoken maar zit nu toch wel vast)
- Hoe kan ik het veld achter mijn 'Pacman' speler kleuren in het licht blauw (CYAN). Ik heb al geprobeerd met mijn huidigeX en huidigeY te werken, maar krijg er geen goed resultaat van.

- Hoe kan ik ervoor zorgen dat de controller op het zwart veld bij het aanraken van een toets blijft gaan en op het blauw ingesloten veld vakje per vakje gaat? (Heb al gewerkt met booleans zoals bv isKleurbaar en dan dit neergeschreven bij de beweging van de pacman maar zonder enig resultaat).

Als ge uw speelveld tekent in in die loop zoiets doet als:
Code:
loop x
{
    loop y
    {
         if(x == playerPosX && y == playerPosY)
             Draw(x, y, cyan)
         else
             Draw(x,y,zwart)
    }
}
gewoon even een heel simpele half pseudocode versie, maar op deze manier zou het toch moeten werken.




Ik weet nie hoe keyhandling werkt in java, aangezien ik er zelf geen ervaring mee heb.

Maar als het blijven bewegen bij het inhouden van een toets het standaard is (en het mogelijk een keyReleased event achtig iets te zien).

Code:
bool isKeyReleased == true (als initialisatie)

if(KeyDown == Key.Left)
{
    if(PlayerPosX-1 == Zwart kotje)
           PlayerPosX -= 1

    if(PlayerPosX-1 == Blauw kotje)
    {  
        if(IskeyReleased == true)
              PlayerPosX-1
              IsKeyReleased == false
    }
}
Het concept zijnde dus, als de speler de linkertoets loslaat dan komt die bool op true.
Dus het is enkel maar mogelijk een stap naar links te nemen nadat de key gereleased geweest is.


Maar een eerste idee, mss helpt het.

Frederik.89

Legacy Member
Bedankt.

Maar ik heb volgend probleem. Mijn pacman en spook worden altijd op witte achtergrond weergegeven in plaats van het zwarte en het blauwe (dit is het speeldveld).
Nu kan ik geen onderscheid maken tussen de kleuren.

Hoe kan ik ervoor zorgen dat de kleur van het veld achter mijn getekende pacman blijft?

YaMo

Legacy Member
Zorg er in elk geval al voor dat de achtergrond van je pacman afbeelding transparant is.
En zou het hier niet simpeler zijn om gewoon met een GridLayout te werken?

Frederik.89

Legacy Member
NeverwinterX zei:
Lijkt verdacht veel op het probleem hier: https://www.beyondgaming.be/archive/web-design-programming.237/java-spel-opdracht.854819
Als je eerst de achtergrond tekent en dan de speler dan zal de achtergrond wel te zien zijn. Nu teken je alleen de speler.

Dat is een standaard code van bij ons op school.
Daar gaan we mee verder voor onze opdracht, daarmee trekt het op mijn beginversie. Maar nu heb ik het verder uitgewerkt.

Maar ik heb nog 2 vraagjes,
- Hoe kan ik het beste mijn spook laten bewegen? Want men veld wordt ingekort door de muur en heb daarbij geen vaste waarden.
- Hoe kan ik het gedeelte dat ingesloten is door de speler en waar de spook zich niet bevind ook blauw (=muur) maken?

Ik heb mijn spel toegevoegd via een link omdat de code anders te lang is om zo te posten. Het is voor BLUEJ.

https://rapidshare.com/files/791325322/PacXon_-_Frederik_Comhair_-_21_04_2012_v2.rar

Alvast bedankt voor te reageren!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan