import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; public class WorldScene extends Scene { private ArrayList actors = new ArrayList(); private Map map; private int tileSize; private int panX = 0; private int panY = 0; public WorldScene(Dimension gridSize, int tileSize) { this.tileSize = tileSize; map = new Map(gridSize); // TODO remove hardcoded stuff Actor player = new Actor("pipo", 100, Actor.Type.PLAYER, gridSize); player.equipWeapon(new Weapon(1000, 10, 1, 0)); Actor enemy = new Actor("marco", 100, Actor.Type.ENEMY, gridSize); enemy.move(5, 5); this.actors.add(player); this.actors.add(enemy); } private Composite makeAlpha(Graphics2D g2d, float alpha) { Composite originalComposite = g2d.getComposite(); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); return originalComposite; } @Override public void zoom(int value) { if (this.tileSize > 5 || value > 0) { this.tileSize = this.tileSize + value; } } @Override public void pan(int x, int y) { this.panX += x; this.panY += y; } @Override public void render(Graphics g) { Graphics2D g2d = (Graphics2D) g; // draw tiles for (Tile tile : this.map.grid) { switch (tile.type) { case GRASS: g2d.setColor(Palette.GREEN); break; case WATER: g2d.setColor(Palette.BLUE); break; } g2d.fillRect( this.tileSize * tile.x + this.panX, this.tileSize * tile.y + this.panY, this.tileSize, this.tileSize ); Composite originalComposite = makeAlpha(g2d, .5f); if (tile.selected) { g2d.setColor(Palette.RED); g2d.fillRect( this.tileSize * tile.x + this.panX, this.tileSize * tile.y + this.panY, this.tileSize, this.tileSize ); } // draw grid (with composite) g2d.setPaint(Palette.BLACK); g2d.drawRect( this.tileSize * tile.x + this.panX, this.tileSize * tile.y + this.panY, this.tileSize, this.tileSize ); g2d.setComposite(originalComposite); } // draw actors for (Actor actor : this.actors) { switch (actor.type) { case PLAYER: g2d.setColor(Palette.ORANGE); break; case ENEMY: g2d.setColor(Palette.RED); break; } int gap = this.tileSize / 10; g2d.fillRect( (this.tileSize * actor.getX()) + gap + this.panX, (this.tileSize * actor.getY()) + gap + this.panY, this.tileSize - gap * 2, this.tileSize - gap * 2 ); if (!actor.isAlive()) { g2d.setColor(Palette.BLUE); g2d.fillRect( (this.tileSize * actor.getX()) + gap + this.panX, (this.tileSize * actor.getY()) + this.tileSize/4 + this.panY, this.tileSize - gap * 2, this.tileSize/4 ); } } } @Override public void mouseClicked(int x, int y) { //TODO fix mouse tracking with pan this.updateTiles(); Tile tile = map.getTile( (int) ((x + this.panX)/(double)this.tileSize), (int) ((y + this.panY)/(double)this.tileSize) ); tile.selected = !tile.selected; //TODO remove test stuff if (tile.getActor() != null) { Actor actor = tile.getActor(); Actor player = this.actors.get(0); player.shoot(actor, 1); } } // ugh, performance public void updateTiles() { for (Tile tile : this.map.grid) { tile.clearActor(); } for (Actor actor : this.actors) { Tile tile = map.getTile(actor.getX(), actor.getY()); tile.setActor(actor); } } }