/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.arretados.leveleditor; import com.arretados.leveleditor.entities.Box; import com.arretados.leveleditor.entities.BoxItem; import com.arretados.leveleditor.entities.BoxPanel; import com.arretados.leveleditor.entities.Breakable; import com.arretados.leveleditor.entities.BreakablePanel; import com.arretados.leveleditor.entities.Coin; import com.arretados.leveleditor.entities.CoinPanel; import com.arretados.leveleditor.entities.Entity; import com.arretados.leveleditor.entities.Flag; import com.arretados.leveleditor.entities.Fluid; import com.arretados.leveleditor.entities.FluidPanel; import com.arretados.leveleditor.entities.Hole; import com.arretados.leveleditor.entities.OneWayWall; import com.arretados.leveleditor.entities.OneWayWallPanel; import com.arretados.leveleditor.entities.Player; import com.arretados.leveleditor.entities.Spike; import com.arretados.leveleditor.entities.SpikePanel; import com.arretados.leveleditor.entities.TreeLog; import com.arretados.leveleditor.entities.TreeLogPanel; import com.arretados.leveleditor.entities.layer.Grass; import com.arretados.leveleditor.entities.layer.GrassPanel; import com.arretados.leveleditor.entities.layer.Shrub; import com.arretados.leveleditor.entities.layer.ShrubPanel; import com.arretados.leveleditor.entities.layer.Tree; import com.arretados.leveleditor.entities.layer.TreePanel; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; /** * * @author bruno */ public class GameCanvas extends JPanel implements MouseMotionListener, MouseListener{ public static final float METER_TO_PIXELS = 50f; // px = 1meter private LevelEditorView mainView; private short playersAdded = 0; private int groundHeight = 50; private List<Entity> entities = new ArrayList<Entity>(); private List<int[]> groundPos = new ArrayList<int[]>(); private Entity selectedEntity = null; private Flag flag; private DrawMode insertionMode = null; public GameCanvas() { addMouseListener(this); addMouseMotionListener(this); } public void setFlag(Flag f) { this.flag = f; } public void setMainView(LevelEditorView mainView) { this.mainView = mainView; } // Created to LevelLoader public void addEntities(Entity e){ entities.add(e); } public int getGroundHeight() { return groundHeight; } public void setGroundHeight(int groundHeight) { this.groundHeight = groundHeight; } @Override protected void paintComponent(Graphics g) { g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); if (selectedEntity != null) drawSelection(selectedEntity); drawGround(g); for (Entity e : entities) { e.drawMyself(g); } if (flag != null) { flag.drawMyself(g); } } public void drawGroundLine(int x,int y){ groundPos.add(new int[]{0, 1000}); groundPos.add(new int[]{100000000, 1000}); int lastPointX = 0; if (groundPos.size() > 0) lastPointX = groundPos.get(groundPos.size()-1)[0]; //Gets the last point else groundPos.add(new int[]{0, y}); if (x >= lastPointX) //Verify if the point that will be created comes after the last point groundPos.add(new int[]{x, y}); repaint(); } private void drawFlag(int x, int y) { flag = new Flag(x,y,10); repaint(); } public Flag getFlag(){ return flag; } public List<int[]> getLinesPos(){ return groundPos; } public List<Entity> getEntitiesPos() { return entities; } public void clearObjectsList(){ this.groundPos.clear(); this.entities.clear(); this.flag = null; } private Entity checkClickOn(int x, int y) { if (flag != null && flag.collides(x, y)) { return flag; } for (int i = 0; i < entities.size() ; i++) { if (entities.get(i).collides(x, y)) return entities.get(i); } return null; } public void switchEntityPanelToSelectedEntity() { mainView.switchEntityPanel(selectedEntity.getEntityPanel()); if (mainView.getEntityPanel() != null) { mainView.getEntityPanel().setEntity(selectedEntity); } } public void mouseClicked(MouseEvent e) { Entity clickedEntity = checkClickOn(e.getX(), e.getY()); if (clickedEntity != null) { selectedEntity = clickedEntity; switchEntityPanelToSelectedEntity(); return ; } if (insertionMode != null) { // Inserts.. Entity entityToAdd = null; switch (insertionMode) { case BOX: float sizeBox = ((BoxPanel)mainView.getEntityPanel()).getCurrentSize(); float weightBox = ((BoxPanel)mainView.getEntityPanel()).getCurrentWeight(); entityToAdd = new Box(e.getX(), e.getY(), sizeBox); ((Box)entityToAdd).setWeight(weightBox); break; case TREE_LOG: float sizeLog = ((TreeLogPanel)mainView.getEntityPanel()).getCurrentSize(); float weightLog = ((TreeLogPanel)mainView.getEntityPanel()).getCurrentWeight(); entityToAdd = new TreeLog(e.getX(), e.getY(), sizeLog); ((TreeLog)entityToAdd).setWeight(weightLog); break; case COIN: float coinValue = ((CoinPanel)mainView.getEntityPanel()).getCurrentValue(); entityToAdd = new Coin(e.getX(), e.getY()); ((Coin)entityToAdd).setValue((int) coinValue); break; case ONEWAY_WALL: float owwWidth = ((OneWayWallPanel)mainView.getEntityPanel()).getCurrentWidth(); float owwHeight = ((OneWayWallPanel)mainView.getEntityPanel()).getCurrentHeight(); entityToAdd = new OneWayWall(e.getX(), e.getY(), owwWidth, owwHeight); break; case FLUID: float fluidWidth = ((FluidPanel)mainView.getEntityPanel()).getCurrentWidth(); float fluidHeight = ((FluidPanel)mainView.getEntityPanel()).getCurrentHeight(); float fluidDensity = ((FluidPanel)mainView.getEntityPanel()).getCurrentDensity(); entityToAdd = new Fluid(e.getX(), e.getY()); ((Fluid)entityToAdd).setWidth(fluidWidth); ((Fluid)entityToAdd).setHeight(fluidHeight); ((Fluid)entityToAdd).setDensity(fluidDensity); break; case BREAKABLE: float widthBreakable = ((BreakablePanel)mainView.getEntityPanel()).getCurrentWidth(); float heightBreakable = ((BreakablePanel)mainView.getEntityPanel()).getCurrentHeight(); float hitUntilBreak = ((BreakablePanel)mainView.getEntityPanel()).getCurrentHitsUntilBreak(); entityToAdd = new Breakable(e.getX(), e.getY()); ((Breakable)entityToAdd).setWidth(widthBreakable); ((Breakable)entityToAdd).setHeight(heightBreakable); ((Breakable)entityToAdd).setHitsUntilBreak(hitUntilBreak); break; case TREE: float treeType = ((TreePanel)mainView.getEntityPanel()).getCurrentTreeType(); entityToAdd = new Tree(e.getX(), e.getY()); ((Tree)entityToAdd).setTreeType((int) treeType); break; case GRASS: float grassType = ((GrassPanel)mainView.getEntityPanel()).getCurrentGrassType(); entityToAdd = new Grass(e.getX(), e.getY()); ((Grass)entityToAdd).setGrassType((int) grassType); break; case SHRUB: float shrubType = ((ShrubPanel)mainView.getEntityPanel()).getCurrentShrubType(); entityToAdd = new Shrub(e.getX(), e.getY()); ((Shrub)entityToAdd).setShrubType((int) shrubType); break; case SPIKE: float sizeSpike = ((SpikePanel)mainView.getEntityPanel()).getCurrentSize(); float weightSpike = ((SpikePanel)mainView.getEntityPanel()).getCurrentWeight(); // TODO: set Weight entityToAdd = new Spike(e.getX(), e.getY(), sizeSpike); ((Spike)entityToAdd).setWeight(weightSpike); case LIANA: //drawLiana(e.getX(), e.getY(), e.getX(), e.getY()); break; case PLAYER: if (playersAdded == 0) { entityToAdd = new Player(e.getX(), e.getY(), "player1"); playersAdded++; } else if (playersAdded == 1) { entityToAdd = new Player(e.getX(), e.getY(), "player2"); playersAdded++; } break; case FLAG: drawFlag(e.getX(), e.getY()); break; case HOLE: entityToAdd = new Hole(e.getX(), e.getY()); break; case BOX_ITEM: entityToAdd = new BoxItem(e.getX(), e.getY()); break; } if (entityToAdd != null) { entities.add(entityToAdd); if (mainView.getEntityPanel() != null) mainView.getEntityPanel().setEntity(entityToAdd); } repaint(); } } public void mousePressed(MouseEvent e) { selectedEntity = checkClickOn(e.getX(), e.getY()); if (selectedEntity != null) switchEntityPanelToSelectedEntity(); } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseDragged(MouseEvent e) { if (selectedEntity != null) { selectedEntity.setX(e.getX()); selectedEntity.setY(e.getY()); repaint(); validate(); } } public void mouseMoved(MouseEvent e) { } private void drawGround(Graphics g) { g.setColor(new Color(153, 76, 0)); g.fillPolygon( new int[] {0, 0, getWidth(), getWidth()}, new int[] {getHeight(), getHeight() - groundHeight, getHeight() - groundHeight, getHeight()}, 4); } private void drawSelection(Entity selectedEntity) { } public void changeMode(DrawMode drawMode) { insertionMode = drawMode; } public List<Entity> getEntities(){ return entities; } }