package com.esir.sr.sweetsnake.component; import java.awt.Dimension; import java.util.LinkedHashMap; import java.util.Map; import javax.swing.JComponent; import javax.swing.JPanel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.esir.sr.sweetsnake.api.IComponent; import com.esir.sr.sweetsnake.constants.GameConstants; public class GameBoardPanel extends JPanel { /********************************************************************************************** * [BLOCK] STATIC FIELDS **********************************************************************************************/ /** The serial version UID */ private static final long serialVersionUID = 8531962414769780455L; /** The logger */ private static final Logger log = LoggerFactory.getLogger(GameBoardPanel.class); /********************************************************************************************** * [BLOCK] FIELDS **********************************************************************************************/ /** The map width */ private final int width; /** The map height */ private final int height; /** The components */ private final Map<String, IComponent> components; /** The current player's number */ private final int playerNb; /********************************************************************************************** * [BLOCK] CONSTRUCTOR **********************************************************************************************/ /** * * @param _width * @param _height * @param _nbSweets * @param _isFirstPlayer */ public GameBoardPanel(final int _width, final int _height, final int _playerNb) { super(); width = _width; height = _height; playerNb = _playerNb; components = new LinkedHashMap<String, IComponent>(); setLayout(null); setOpaque(false); } /********************************************************************************************** * [BLOCK] PUBLIC METHODS **********************************************************************************************/ /** * * @param component */ public void addComponent(final IComponent component) { log.debug("Adding component {} on the map", component); if (component != null) { components.put(component.getId(), component); final JComponent jcomponent = (JComponent) component; int x = component.getXPos(), y = component.getYPos(); // map translation (everybody sees himself on the top left corner) switch (playerNb) { case 2: x = width - 1 - component.getXPos(); y = height - 1 - component.getYPos(); break; case 3: final int oldX = x; x = width - 1 - y; y = oldX; break; case 4: final int oldY = y; y = height - 1 - x; x = oldY; break; default: break; } jcomponent.setLocation(x * GameConstants.CELL_SIZE, y * GameConstants.CELL_SIZE); add(jcomponent); } } /** * * @param component */ public void moveComponent(final IComponent component) { log.debug("Moving component {} on the map", component); if (component != null) { final JComponent jcomponent = (JComponent) component; int x = component.getXPos(), y = component.getYPos(); // map translation (everybody sees himself on the top left corner) switch (playerNb) { case 2: x = width - 1 - component.getXPos(); y = height - 1 - component.getYPos(); break; case 3: final int oldX = x; x = width - 1 - y; y = oldX; break; case 4: final int oldY = y; y = height - 1 - x; x = oldY; break; default: break; } jcomponent.setLocation(x * GameConstants.CELL_SIZE, y * GameConstants.CELL_SIZE); } } /** * * @param component */ public void removeComponent(final IComponent component) { log.debug("Removing component {} from the map", component); if (component != null) { components.remove(component.getId()); remove((JComponent) component); } } /** * * @param id * @return */ public IComponent getComponentById(final String id) { return components.get(id); } /********************************************************************************************** * [BLOCK] GETTERS **********************************************************************************************/ /* * (non-Javadoc) * * @see java.awt.Component#getSize() */ @Override public Dimension getSize() { return new Dimension(GameConstants.CELL_SIZE * width, GameConstants.CELL_SIZE * height); } /* * (non-Javadoc) * * @see javax.swing.JComponent#getPreferredSize() */ @Override public Dimension getPreferredSize() { return new Dimension(GameConstants.CELL_SIZE * width, GameConstants.CELL_SIZE * height); } }