2015-06-01 5 views
0

Я создал случайную игру генератора лабиринтов и хочу, чтобы в лабиринте двигался небольшой блок. В настоящее время у меня проблема, когда я добавляю два объекта в JFrame, отображается только последний введенный, а другой переопределяется. Я попытался использовать JPanels, но я не могу заставить его работать, может кто-то пролить свет на мою проблему?Maze Generator и Player Help Me Please

Вот что у меня есть для игры:

Это создает и управляет игрок:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class keyer extends JPanel implements ActionListener, KeyListener 
{ 
//This Creates and controls the player 
Timer times = new Timer(5, this); 
double x = 0; 
double y = 0; 
double movx = 0; 
double movy = 0; 
// flag for if left key is down 
public boolean left_key_down = false; 
// flag for if right key is down 
public boolean right_key_down = false; 
// flag for if up key is down 
public boolean up_key_down = false; 
// flag for if down key is down 
public boolean down_key_down = false; 

public keyer() 
{ 
    times.start(); 
    addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(true); 
} 

// Draws/Paints 
public void paintComponent(Graphics g) 
{ 

    super.paintComponent(g); 
    Graphics2D gg = (Graphics2D) g; 
    Image img = Toolkit.getDefaultToolkit().createImage("clear.jpg"); 
    gg.drawImage(img, 0, 0, null); 
    gg.fill(new Rectangle.Double(x, y, 20, 20)); 
} 

public void actionPerformed(ActionEvent input) 
{ 
    if (x > 1259) 
    { 
     movx = 0; 
     x = 1259; 
    } 
    if (y < 0) 
    { 
     movy = 0; 
     y = 0; 
    } 
    if (y > 940) 
    { 
     movy = 0; 
     y = 940; 
    } 
    if (x < 0) { 
     movx = 0; 
     x = 0; 
    } 

    x = x + movx; 
    y = y + movy; 
    repaint(); 
} 

// the keys (up is negative down is positive) 
public void up() 
{ 
    movy = -3; 
    movx = 0; 
} 

public void down() 
{ 
    movy = 3; 
    movx = 0; 
} 

public void left() 
{ 
    movx = -3; 
    movy = 0; 
} 

public void right() 
{ 
    movx = 3; 
    movy = 0; 
} 

public void upleft() 
{ 
    movx = -3; 
    movy = -3; 
} 

public void downleft() 
{ 
    movx = -3; 
    movy = 3; 
} 

public void upRight() 
{ 
    movx = 3; 
    movy = -3; 
} 

public void downRight() 
{ 
    movx = 3; 
    movy = 3; 
} 

// this sets up how you know which key is used 
public void keyPressed(KeyEvent input) 
{ 
    int code = input.getKeyCode(); 

    if (code == KeyEvent.VK_RIGHT) 
    { 
     right_key_down = true; 
    } 
    else if (code == KeyEvent.VK_LEFT) 
    { 
     left_key_down = true; 
    } 
    else if (code == KeyEvent.VK_UP) 
    { 
     up_key_down = true; 
    } 
    else if (code == KeyEvent.VK_DOWN) 
    { 
     down_key_down = true; 
    } 

    if (up_key_down == true && left_key_down == true) 
    { 
     upleft(); 
    } 
    else if (down_key_down == true && left_key_down == true) 
    { 
     downleft(); 
    } 
    else if (up_key_down == true && right_key_down == true) 
    { 
     upRight(); 
    } 
    else if (down_key_down == true && right_key_down == true) 
    { 
     downRight(); 
    } 
    else 
    { 
     if (code == KeyEvent.VK_UP) 
     { 
      up(); 
     } 
     if (code == KeyEvent.VK_DOWN) 
     { 
      down(); 
     } 
     if (code == KeyEvent.VK_RIGHT) 
     { 
      right(); 
     } 
     if (code == KeyEvent.VK_LEFT) 
     { 
      left(); 
     } 
    } 
} 

public void keyTyped(KeyEvent key) 
{ 

} 

public void keyReleased(KeyEvent key) 
{ 
    int keys = key.getKeyCode(); 

    if (keys == KeyEvent.VK_RIGHT) 
    { 
     right_key_down = false; 
    } else if (keys == KeyEvent.VK_LEFT) 
    { 
     left_key_down = false; 
    } else if (keys == KeyEvent.VK_UP) 
    { 
     up_key_down = false; 
    } else if (keys == KeyEvent.VK_DOWN) 
    { 
     down_key_down = false; 
    } 

    movx = 0; 
    movy = 0; 
} 

}

Эти следующие классы порождают лабиринт:

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.util.*; 
import javax.swing.*; 

public class Maze extends JPanel 
{ 
private Room[][] mazerooms; 
private ArrayList<Wall> walls; 
private Random randomnum; 
private int height; 
private int width; 
private int num; 
private JoinRoom join; 
private int AreaX; 
private int AreaY; 
private int roomSize; 
private int random; 

public Maze(int height, int width) 
{ 
    this.height = height; 
    this.width = width; 
    mazerooms = new Room[height][width]; 
    walls = new ArrayList<Wall>((height) * (width)); 
    generateRandomMaze(); 
    setPreferredSize(new Dimension(800, 700)); 
} 

private void generateRandomMaze() 
{ 
    generateInitialRooms(); 


    join = new JoinRoom(width * height); 

    randomnum = new Random(); 

    num = width * height; 

    while (num > 1) 
    { 
     random = randomnum.nextInt(walls.size()); 

     Wall temp = walls.get(random); 

     int roomone = temp.currentRoom.y + temp.currentRoom.x * width; 
     int roomtwo = temp.nextRoom.y + temp.nextRoom.x * width; 

     //This checks to see if roomone and roomtwo are taken already 
     if (join.find(roomone) != join.find(roomtwo)) 
     { 
      walls.remove(random); 

      join.unionRooms(join.find(roomone), join.find(roomtwo)); 

      temp.confirmGone = true; 

      temp.currentRoom.nextTo.add(temp.nextRoom); 

      temp.nextRoom.nextTo.add(temp.currentRoom); 
      num--; 
     } 
    } 
} 

private int roomNumber = 0; 

private void generateInitialRooms() 
{ 
    for (int a = 0; a < height; a++) 
    { 
     for (int b = 0; b < width; b++) 
     { 
      // create up walls 
      mazerooms[a][b] = new Room(a, b); 

      if (a == 0) { 
       mazerooms[a][b].up = new Wall(mazerooms[a][b]); 
      } 
      else 
      { 
       mazerooms[a][b].up = new Wall(mazerooms[a - 1][b], mazerooms[a][b]); 
       walls.add(mazerooms[a][b].up); 
      } 
      if (a == height - 1) 
      { 
       mazerooms[a][b].down = new Wall(mazerooms[a][b]); 
      } 
      if (b == 0) 
      { 
       mazerooms[a][b].left = new Wall(mazerooms[a][b]); 
      } 
      else 
      { 
       mazerooms[a][b].left = new Wall(mazerooms[a][b - 1], mazerooms[a][b]); 
       walls.add(mazerooms[a][b].left); 
      } 
      if (b == width - 1) 
      { 
       mazerooms[a][b].right = new Wall(mazerooms[a][b]); 
      } 
      mazerooms[a][b].roomName = roomNumber++; 
     } 
    } 

    mazerooms[0][0].left.confirmGone = true; 

    mazerooms[0][0].roomName = 0; 

    mazerooms[height - 1][width - 1].down.confirmGone = true; 

    mazerooms[height - 1][width - 1].roomName = (height * width); 
} 

public void paintComponent(Graphics g) 
{ 
    AreaX = 5; 
    AreaY = 5; 
    roomSize = (width - AreaX)/width + 50; 

    // temp variables used for painting 
    int x = AreaX; 
    int y = AreaY; 
    for (int a = 0; a <= height - 1; a++) 
    { 
     for (int b = 0; b <= width - 1; b++) 
     { 
      if (!(mazerooms[a][b].up.confirmGone)) 
      { 
       g.drawLine(x, y, x + roomSize, y); 
      } 
      if (mazerooms[a][b].left.confirmGone == false) 
      { 
       g.drawLine(x, y, x, y + roomSize); 
      } 
      if ((a == height - 1) && mazerooms[a][b].down.confirmGone == false) 
      { 
       g.drawLine(x, y + roomSize, x + roomSize, y + roomSize); 
      } 
      if ((b == width - 1) && mazerooms[a][b].right.confirmGone == false) 
      { 
       g.drawLine(x + roomSize, y, x + roomSize, y + roomSize); 
      } 
      x += roomSize; 
     } 
     x = AreaX; 
     y += roomSize; 
    } 
} 

}

public class Wall 
{ 
public Room currentRoom, nextRoom; 
public boolean confirmGone = false; 

public Wall(Room a, Room b) 
{ 
    currentRoom = a; 
    nextRoom = b; 
} 

public Wall(Room r) 
{ 
    currentRoom = r; 
    nextRoom = null; 
} 

}

import java.util.*; 

public class Room 
{ 
public Wall up, right, down, left; 
public int x, y; 
public int roomName; 
public Room prev; 
public List<Room> nextTo; 

public Room(int x, int y) 
{ 
    this.x = x; 
    this.y = y; 
    nextTo = new LinkedList<Room>(); 
    prev = null; 
    roomName = 0; 
} 

public int getRoomName() 
{ 
    return roomName++; 
} 

}

public class JoinRoom 
{ 
private int[] set; 

public JoinRoom(int num) 
{ 
    set = new int[num]; 

    for (int i = 0; i < set.length; i++) 
    { 
     set[i] = -1; 
    } 
} 
public void unionRooms(int roomnum1, int roomnum2) 
{ 
    if (set[roomnum1] > set[roomnum2]) 
    { 
     set[roomnum1] = roomnum2; 
    } 
    else 
    { 
     if (set[roomnum2] == set[roomnum1]) 
     { 
      set[roomnum1]--; 
     } 
     set[roomnum2] = roomnum1; 
    } 
} 

public int find(int rec) 
{ 
    if (set[rec] < 0) 
    { 
     return rec; 
    } 
    else 
    { 
     return set[rec] = find(set[rec]); 
    } 
} 

}

Наконец, Вот главный класс:

import javax.swing.*; 

public class Main 
{ 
public static void main(String[] args) 
{ 
    JFrame frame = new JFrame(); 
    Maze one = new Maze(17, 25); 
    keyer Key = new keyer(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setTitle("2D Maze Game"); 
    frame.add(one); 
    frame.add(Key); 
    frame.setVisible(true); 
} 

}

ответ

1

, когда я добавить два объекта к JFrame только последний введенный показан и другой переопределяется

Панель контента из JFrame использует BorderLayout - добавление компонентов без указания местоположения по умолчанию добавляет в CENTER, который может содержать только один компонент. Некоторые опции:

  1. Используйте другой LayoutManager,
  2. Добавьте их в JPanel (с соответствующим Layout), который затем добавляется к JFrame
  3. Добавьте их в разных местах.

Например, используя (3):

frame.add(one);//adds to CENTER 
frame.add(Key, BorderLayout.SOUTH); 
+0

Спасибо, но с тем, что плеер помещается в нижней части, и он не может войти в лабиринт, что мне нужно для того, чтобы быть в Лабиринт. Большое вам спасибо, хотя я не думал, что так быстро получаю ответ. – WyTech

+1

Это зависит от вас, как вы хотите, чтобы ваш макет, с которым вы должны играть, чтобы получить макет, который вы ищете, - без особых подробностей, о которых мы можем только догадываться. Если вы хотите иметь перекрытие JPanel (?), Подумайте о том, чтобы сделать обычную роспись в рамках одного компонента. И в будущем подумайте о отправке кода в качестве [MCVE] (http://stackoverflow.com/help/mcve) – copeg

+0

Спасибо, я посмотрю, что это было для меня болью, и помощь очень ценится. Также спасибо вам за то, что сообщили мне о MCVE, я опубликую на этом основании с этого момента. – WyTech