Package ch.sahits.game.graphic.display

Source Code of ch.sahits.game.graphic.display.MainGameView

package ch.sahits.game.graphic.display;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;

import ch.sahits.game.event.Event;
import ch.sahits.game.graphic.display.gameplay.GameStatus;
import ch.sahits.game.graphic.display.gameplay.MainMenu;
import ch.sahits.game.graphic.display.gameplay.MainView;
import ch.sahits.game.graphic.display.gameplay.MapView;
import ch.sahits.game.graphic.display.gameplay.SubMenu;
import ch.sahits.game.graphic.display.gameplay.ViewStatus;
import ch.sahits.game.graphic.display.notice.NoticeView;
import ch.sahits.game.graphic.image.DisplayImageDIResolver;
import ch.sahits.game.graphic.image.IImageLoader;
import ch.sahits.game.graphic.image.IOpenPatricianPainter;
import ch.sahits.game.openpatrician.client.IClient;
import ch.sahits.game.rendering.AbstractRenderPart;
/**
* This is the main in game view. The main part of this class is to delegate further down
* and to draw the frame borders over the delegated stuff.
* @author Andi Hotz, (c) Sahits GmbH, 2011
* Created on Sep 30, 2011
*
*/
public class MainGameView extends AbstractRenderPart {
  /** Height of the map overview */
  private static final int MAP_OVERVIEW_HEIGHT = 207;
  /** Width of the left panels (without borders) */
  private static final int LEFT_STATUS_PANEL_WIDTH = 250;
  /** Height of the top status bar */
  private static final int TOP_STATUS_HEIGHT = 70;
  /** Width/height of the border */
  private static final int BORDER_SPACING = 10;
  /** Height of the horizontal fries */
  private static final int HORIZONTAL_DECO_HEIGHT = 20;
  /** Height of the menu bar */
  private static final int MENU_HEIGHT = 71;
  /** Height of the notice view */
  private static final int NOTICE_HEIGHT = 250;
  /** Width og the left panels inclusive borders */
  private static final int LEFT_PANEL_WIDTH = 310;
  /** The minimal height the display must have */
  public static final int MINMIMAL_DISPLAY_HEIGHT = TOP_STATUS_HEIGHT+MAP_OVERVIEW_HEIGHT+MENU_HEIGHT+TOP_STATUS_HEIGHT+NOTICE_HEIGHT-2;
  /** View holding the sea or city overview map */
  private final MapView mapOverview;
  /** View holding the main menu */
  private final MainMenu mainMenu;
  /** View holding the sub menu (ship or city) menu */
  private final SubMenu subMenu;
  /** View holding notices and state information */
  private final NoticeView noticeView;
  /** View status holding money and time */
  private final GameStatus gameStatus;
  /** Status view of the fleet or city */
  private final ViewStatus viewStatus;
  /** Main view of the map or the city */
  private final MainView mainView;
  /**
   * Image loader to retrieve the images
   */
  private final IImageLoader loader;
  /** Cached background image */
  private final BufferedImage background;
//  private final IClient client;

 
  public MainGameView(Rectangle rect,IClient cl) {
    super(rect);
//    client=cl;
    if (cl==null){
      throw new NullPointerException("Client instance may not be null");
    }
    Rectangle rectangle = new Rectangle(rect.x+BORDER_SPACING, rect.y+HORIZONTAL_DECO_HEIGHT, LEFT_STATUS_PANEL_WIDTH, TOP_STATUS_HEIGHT-HORIZONTAL_DECO_HEIGHT);
   
    DisplayImageDIResolver resolver = DisplayImageDIResolver.getInstance();
   
    loader = resolver.getMainScreenLoader(); // loader from the txt file
    background = createBackground(resolver);
     
    gameStatus = new GameStatus(rectangle,cl);
    gameStatus.setEnabled(true);   
    rectangle = new Rectangle(rect.x+LEFT_PANEL_WIDTH, rect.y+HORIZONTAL_DECO_HEIGHT, rect.width-(LEFT_PANEL_WIDTH+BORDER_SPACING), TOP_STATUS_HEIGHT-HORIZONTAL_DECO_HEIGHT);
    viewStatus = new ViewStatus(rectangle,cl);
    viewStatus.setEnabled(true);
    rectangle = new Rectangle(rect.x+5, rect.y+TOP_STATUS_HEIGHT+8, 236, 192); // inner heights
    mapOverview = new MapView(rectangle);
    mapOverview.setEnabled(true);
    // Main menu in over tiled background
    rectangle = new Rectangle();
    rectangle.x=rect.x+15;
    rectangle.y=rect.y+TOP_STATUS_HEIGHT+MAP_OVERVIEW_HEIGHT+10;
    rectangle.height=48; // inner height
    rectangle.width=221; // inner width
    mainMenu = new MainMenu(rectangle);
    mainMenu.setEnabled(true);
    // Sub menu over architrave
    rectangle = new Rectangle();
    rectangle.x=rect.x+BORDER_SPACING;
    rectangle.y=rect.y+TOP_STATUS_HEIGHT+MAP_OVERVIEW_HEIGHT+MENU_HEIGHT+HORIZONTAL_DECO_HEIGHT;
    rectangle.height=TOP_STATUS_HEIGHT-HORIZONTAL_DECO_HEIGHT;
    rectangle.width=LEFT_STATUS_PANEL_WIDTH;
    subMenu = new SubMenu(rectangle);
    subMenu.setEnabled(true);
    // notice board
    rectangle = new Rectangle();
    rectangle.x=rect.x+5;
    rectangle.y=rect.y+TOP_STATUS_HEIGHT+MAP_OVERVIEW_HEIGHT+MENU_HEIGHT+TOP_STATUS_HEIGHT+6;
    rectangle.height=238;
    rectangle.width=236;
    noticeView = new NoticeView(rectangle,loader);
    noticeView.setEnabled(true);
    rectangle = new Rectangle();
    rectangle.x=rect.x+LEFT_PANEL_WIDTH;
    rectangle.y=rect.y+TOP_STATUS_HEIGHT;
    rectangle.height=rect.height-(rectangle.y+BORDER_SPACING);
    rectangle.width=rect.width-(LEFT_PANEL_WIDTH+BORDER_SPACING);
    mainView = new MainView(rectangle,loader,cl);
    mainView.setEnabled(true);

  }


  @Override
  public void gameRender(Graphics gScr) {
    Color oldColor = gScr.getColor();
    // For testing
//    gScr.setColor(Color.ORANGE);
//    gScr.fillRect(rect.x, rect.y, rect.width, rect.height);

    gScr.drawImage(background, 0, 0, null);
   
    // render the view
    gameStatus.gameRender(gScr);
    viewStatus.gameRender(gScr);
    mapOverview.gameRender(gScr);
    mainMenu.gameRender(gScr);
    subMenu.gameRender(gScr);
    noticeView.gameRender(gScr);
    mainView.gameRender(gScr);
    gScr.setColor(oldColor);
  }


  /**
   * Create the background image
   * @return
   */
  private BufferedImage createBackground(DisplayImageDIResolver resolver) {
    BufferedImage background = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_4BYTE_ABGR);
    IOpenPatricianPainter opPainter = resolver.getOpenPatricianPainter();
    Graphics gScr = background.getGraphics();
    // Render the frame
    BufferedImage img = loader.getImage("FrameLayout");
    int width = img.getWidth();
    gScr.drawImage(img, rect.x, rect.y, null);
    // Compute the top fringe
    int remWidth = rect.width-width;
    img = loader.getImage("topDeco");
    int decoWidth = img.getWidth();
    int countComplete = remWidth/decoWidth; // number the deco can be drawn complete
    int partialWidth = remWidth-(countComplete*decoWidth);
    for (int i=0;i<countComplete;i++){
      int startX = rect.x+width+(i*decoWidth);
      gScr.drawImage(img, startX, rect.y, null);
    }
    int startX = rect.x+width+(countComplete*decoWidth);
    gScr.drawImage(img, startX, rect.y, partialWidth, img.getHeight(), null);
   
    // draw right border
    final  int cornerDim = 10;
    final int mortarDim = 12;
    final int defaultPlateding = 200;
    countComplete = (int)Math.round((rect.height-TOP_STATUS_HEIGHT-1.5*cornerDim)/(mortarDim+defaultPlateding));
    // compute the scale in y direction
    int constantBuffer = cornerDim+cornerDim/2+mortarDim*countComplete-mortarDim;
    int platingDestDim =  rect.height-TOP_STATUS_HEIGHT-constantBuffer;
    img = loader.getImage("reightBorderMiddle");
    int platingOrigDim = countComplete*img.getHeight();
    double scale = platingDestDim*1.0/platingOrigDim;
    BufferedImage plate = opPainter.scaleY(img, (int)Math.rint(img.getHeight()*scale));
    startX = rect.x+rect.width-img.getWidth();
    int startY = rect.y+TOP_STATUS_HEIGHT;
    // draw top right corner
    img = loader.getImage("rightTopBorderCorner");
    img = img.getSubimage(0, img.getHeight()/2, img.getWidth(), img.getHeight()/2);
    gScr.drawImage(img, startX, startY, null);
    startY += img.getHeight();
    img = loader.getImage("reightBorderMortar");
    for (int h=0;h<countComplete;h++){
      if (h<countComplete-1){
        gScr.drawImage(plate, startX, startY, null);
        startY += plate.getHeight();
        gScr.drawImage(img, startX, startY, null);
        startY += img.getHeight();
      } else {
        // fill all the excessive space
        int height = rect.height-cornerDim-startY;
        img = loader.getImage("reightBorderMiddle"); // overriding since there is no more mortar to be drawn
        plate = opPainter.scaleY(img, height);
        gScr.drawImage(plate, startX, startY, null);
        startY += height;
      }
    }
    img = loader.getImage("rightBottomBorderCorner");
    gScr.drawImage(img, startX, startY, null);
   
    // Draw the bottom border
    countComplete = (int)Math.round((rect.width-LEFT_PANEL_WIDTH-1.5*cornerDim)/(mortarDim+defaultPlateding));
    // compute the scale in x direction
    platingDestDim =  rect.width-LEFT_PANEL_WIDTH-constantBuffer;
    img = loader.getImage("bottomBorderMiddle");
    platingOrigDim = countComplete*img.getWidth();
    scale = platingDestDim*1.0/platingOrigDim;
    plate = opPainter.scaleX(img, (int)Math.rint(img.getWidth()*scale));
    startX = rect.x+LEFT_PANEL_WIDTH;
    // startY must not be adjusted is correct from above
    // draw top right corner
    img = loader.getImage("leftBottomBorderCorner");
    img = img.getSubimage(img.getWidth()/2, 0, img.getWidth()/2, img.getHeight());
    gScr.drawImage(img, startX, startY, null);
    startX += img.getWidth();
    img = loader.getImage("bottomBorderMortar");
    for (int w=0;w<countComplete;w++){
      if (w<countComplete-1){
        gScr.drawImage(plate, startX, startY, null);
        startX += plate.getWidth();
        gScr.drawImage(img, startX, startY, null);
        startX += img.getWidth();
      } else {
        // fill all the excessive space
        width = rect.width-cornerDim-startX;
        img = loader.getImage("bottomBorderMiddle"); // overriding since there is no more mortar to be drawn
        plate = opPainter.scaleX(img, width);
        gScr.drawImage(plate, startX, startY, null);
        startX += width;
      }
    }
    // render deco under left side panel
    int height = rect.height-MINMIMAL_DISPLAY_HEIGHT-rect.y;
    String ornamentName="Ornament310x310";
    if (height<125){
      ornamentName="Ornament310x94";
    } else if (height<158){
      ornamentName="Ornament310x155";
    } else if (height<173){
      ornamentName="Ornament310x162";
    } else if (height<298){
      ornamentName="Ornament310x185";
    }
    img = loader.getImage(ornamentName);
    img = opPainter.scaleY(img, height);
    gScr.drawImage(img, rect.x, rect.y+MINMIMAL_DISPLAY_HEIGHT, null);
   
    return background;
  }
  @Override
  public void gameUpdate(Event e, Object notice) {
    // TODO Auto-generated method stub
   
  }


}
TOP

Related Classes of ch.sahits.game.graphic.display.MainGameView

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.