java grafik hjälp - konvertera 2dimensionellarray till spelplan

Tråden skapades och har fått 6 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2004-09-25 23:39

Bygger ett spel (inlämningsuppgift i skolan) som kommer vara väldigt likt Tron.
Hur som helst så har jag tänkt mig att servern ska skicka en tvådimensionell-array till alla anslutna klienter och utifrån den arrayen ska klienternas GUI kunna rita upp hur spelplanen ser ut. Alternativt ska servern skicka ut förändringarna av arrayen.

Hur som helst, igen, så har jag tänkt mig att arrayen för spelplanen skulle se ut ungefär så här

// namn för int:s på spelplanen
private final int WALL = -1;
private final int FREE = 0;
private final int P1 = 10; // symboliserar en ruta tagen av player1
private final int P2 = 20; // symboliserar en ruta tagen av player2

// spelplanen ska vara större än 10x10 i riktiga versionen
private int map[10][10] =
{ WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL },
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL };

sen när spelet har körts en stund så kanske spelplanen ser ut så här

// map har modifierats och ser ut såhär
{ WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL },
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, P1  , FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, P1  , FREE, FREE, FREE, FREE, WALL},
{ WALL, P1  , P1  , P1  , P1  , FREE, FREE, P2  , P2  , WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, P2  , FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, P2  , P2  , P2  , FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, WALL},
{ WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL };

Nu undrar jag.. hur gör jag för att rita ut hela spelplanen? Tänkte att varje ruta i map-arrayen ska ta up ett fast antal px (tex 10px, dvs en 10x10 spelplan blir 100x100 px stor).

Nu vill jag ha en GameBoard.java som har denna array... GameBoard.java ska sen rita upp spelplanen utifrån den här arrayen.

Här följer två exempelbilder för att försöka förtydliga ytterligare

Senast redigerat 2004-09-26 06:13
  • Medlem
  • Stockholm
  • 2004-09-26 18:54

Hittade kodsnutt från en nätverksbrädspel jag kodade för ett tag sedan. Koden är mer av ett hack därav kvaliteten. Det löser inte ditt problem men borde ge en del pekare. Koden nedan är från paint-metoden i en Panel som används för uppritning av spelbrädet.

public void paint(Graphics g) {
        
        if(!init) {
            g.drawString("Waiting for data", 20, 20);
        } else {
            tileWidth = this.getWidth() / board.width;
            tileHeight = this.getHeight() / board.height;
            
            for(int i = 0; i < board.width; i++) {
                for(int j = 0; j < board.height; j++) {
                    switch(board.board[i][j]) {
                        case Board.HIT:
                            g.setColor(Color.RED);
                            break;
                        case Board.MISS:
                            g.setColor(Color.BLUE);
                            break;
                        case Board.SHIP:
                            g.setColor(Color.GREEN);
                            break;
                        default:
                            g.setColor(Color.WHITE);
                    }
                    g.fillRect(tileWidth * i, tileHeight * j, tileWidth, tileHeight);
                    g.setColor(Color.GRAY);
                    g.drawRect(tileWidth * i, tileHeight * j, tileWidth, tileHeight);
                    
                    if(board.board[i][j] == Board.MISS && squareInfo) {
                        g.setColor(Color.WHITE);
                        g.drawString("" + boardData[i][j], tileWidth * (i), tileHeight * (j+1));
                    }
                }
            }
        }
        
  • Medlem
  • Stockholm
  • 2004-09-26 22:14

Jamen visst! Fan vad härligt, det där gav absolut någonting. Hade länge funderat på att ha en GameFrame och sen just en GameBoard (extends JPanel) vilket det nu alltså blev.

En annan grej, om man har ritat ut rutan och sedan förstorar fönstret så vill jag att det utritade ska förflyttas i proportion med hur mycket man förstorar fönstret. Antingen förflyttas eller att rutan växer (egentligen kanske växer är mer lämpligt?)

  • Medlem
  • Stockholm
  • 2004-09-27 19:42
Ursprungligen av ivar:

Jamen visst! Fan vad härligt, det där gav absolut någonting. Hade länge funderat på att ha en GameFrame och sen just en GameBoard (extends JPanel) vilket det nu alltså blev.)

Vilket typ av svar hade du tänkt dig?

/Kalle

  • Medlem
  • Stockholm
  • 2004-09-27 22:07

Öhm, missförstå inte. Jag är väldigt tacksam. Du är den enda som kommit med förslag på hur man kan göra för att rita upp det hela.

Flera saker snurrar runt i huvudet just nu
1. Hur kan man uppdatera och rita till en kvadrat till en redan utritad jpanel?
2. Varför körs paintComponent() 4ggr?
3. Finns det alternativa metoder som kan vara snabbare? (typ gridlayout med massa JPanels, troligen inte snabbre dock)

  • Medlem
  • Stockholm
  • 2004-09-28 11:35

Fick till slut tag på den bästa länken EVER!

Java Games Programming Techniques som är en bok som O'Reilly ska släppa i början av 2005. Den går visserligen att hämta hem i PDF-form kapitel för kapitel just nu.

Citat:

The placing of game behaviour inside paintComponent() is a common mistake. This will mean that the animation will be driven forward by its animation loop and by the JVM repainting the window

  • Medlem
  • Uppsala
  • 2004-10-05 19:15

Jag har också gjort ett sånt spel i skolan... Vill du ha koden kan du säga till, den är för lång för att posta här.

1
Bevaka tråden