package com.opticalcobra.storybear.game;
import java.awt.Color;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.sql.SQLException;
import java.util.Timer;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.SwingConstants;
import com.opticalcobra.storybear.db.Database;
import com.opticalcobra.storybear.debug.Debugger;
import com.opticalcobra.storybear.editor.StoryInfo;
import com.opticalcobra.storybear.main.OSTimer;
import com.opticalcobra.storybear.main.User;
import com.opticalcobra.storybear.menu.LoadingPanel;
import com.opticalcobra.storybear.menu.Menu;
import com.opticalcobra.storybear.res.Button;
import com.opticalcobra.storybear.res.FontCache;
import com.opticalcobra.storybear.res.Imagelib;
import com.opticalcobra.storybear.res.MusicButton;
import com.opticalcobra.storybear.res.Ressources;
import com.opticalcobra.storybear.res.StoryBearRandom;
public class Window extends JFrame {
private JLayeredPane baseLayer; // base Layer on witch all other displaying is done
private Timer timer;
private GameLayer fg1;
private GameLayer fg2;
private GameLayer mg;
private GameLayer bg;
private GameLayer clouds;
private InteractionLayer ia;
private int stepCounter = 1;
private int stepCounterLayer = 0;
private Control controle;
private MusicButton buttonMenu;
private Button buttonBreak;
private Button buttonExit;
private JLabel labelScore = new JLabel();
public StoryInfo level = null;
public char heroType;
private Database db = new Database();
DummyRenderer renderer;
RendererFG2 rendererfg2;
DummyRendererMG rendererMG;
BackgroundRenderer rendererBG;
CloudRenderer rendererCloud;
InteractionRenderer rendererInteraction;
RenderThreadWrapper rtw;
private boolean over = false;
public Window(){
this(7, 'b'); //Change here default Level
}
public Window(int level_num, char heroType){
this.level = new Database().getStoryInfoFromDatabase(level_num);
this.level.setId(level_num);
this.heroType = heroType;
this.timer = new Timer();
//init Randoom
// StoryBearRandom.getInstance().setSeed(level.getHash());
StoryBearRandom.getInstance().setSeed(StoryBearRandom.hash(level.getStory().getText()));
this.baseLayer = new JLayeredPane();
this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
this.setCursor(Ressources.CURSORNORMAL);
this.setResizable(false);
this.setUndecorated(true);
// initialize Controle
this.controle = new Control(this);
this.addKeyListener(this.controle);
initComponents();
this.setFocusable(true);
timer.scheduleAtFixedRate(new OSTimer(this),Ressources.GAMESPEED, Ressources.GAMESPEED);
this.setVisible(true);
}
/**
* @author Tobias
*/
private void initComponents() {
rtw= RenderThreadWrapper.getInstance(new LoadingPanel("Laden..."));
//create remderer
renderer = new DummyRenderer(level);
rendererfg2 = new RendererFG2(renderer.getTileQue(), level); //renderer.getRingbuffer(),
rendererMG = new DummyRendererMG(this.level);
rendererBG = new BackgroundRenderer();
rendererCloud = new CloudRenderer();
rendererInteraction = new InteractionRenderer(renderer.getTileQue(), level.getElements());
baseLayer.setBackground(Ressources.SKYCOLOR);
getContentPane().setBackground(Color.BLACK);
//Letzte Einstellungen zum Fenster
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this.getContentPane());
this.getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
this.baseLayer, javax.swing.GroupLayout.DEFAULT_SIZE,
Ressources.SCREEN.width, Short.MAX_VALUE));
layout.setVerticalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
this.baseLayer, javax.swing.GroupLayout.DEFAULT_SIZE,
Ressources.SCREEN.height, Short.MAX_VALUE));
baseLayer.setBounds(0, 0, Ressources.WINDOW.width, Ressources.WINDOW.height); // TODO : Fenster mittig anzeigen
add(baseLayer);
this.pack();
if(Ressources.DEBUG){
Debugger.main(null);
}
//initialize Buttons
BufferedImage[] normal = {Imagelib.getInstance().loadDesignImage("game_sound_normal_on"),
Imagelib.getInstance().loadDesignImage("game_sound_hover_on"),
Imagelib.getInstance().loadDesignImage("game_sound_click_on")};
BufferedImage[] mute = {Imagelib.getInstance().loadDesignImage("game_sound_normal_mute"),
Imagelib.getInstance().loadDesignImage("game_sound_hover_mute"),
Imagelib.getInstance().loadDesignImage("game_sound_click_mute")};
this.buttonMenu = new MusicButton(normal, mute, (int)(Ressources.BUTTONDISTANCE*Ressources.SCALE), (int)(Ressources.BUTTONDISTANCE*Ressources.SCALE));
this.baseLayer.add(this.buttonMenu);
this.buttonExit = new Button("close",
Imagelib.getInstance().menuImage(Imagelib.GAME_BUTTON_EXIT_BLACK),
Imagelib.getInstance().menuImage(Imagelib.GAME_BUTTON_EXIT_WHITE),
Imagelib.getInstance().menuImage(Imagelib.GAME_BUTTON_EXIT_GREY),
Imagelib.getInstance().menuImage(Imagelib.GAME_BUTTON_EXIT_BLACK),
(int)((2*Ressources.BUTTONDISTANCE+Ressources.BUTTONSIZE)*Ressources.SCALE), (int)(Ressources.BUTTONDISTANCE*Ressources.SCALE)
);
this.buttonExit.setFocusable(false);
this.buttonExit.addActionListener(controle);
this.baseLayer.add(this.buttonExit);
//initialize Label for Highscore
this.labelScore.setBounds(Ressources.WINDOW.width - Ressources.SCOREDISTANCERIGHT - 200,
Ressources.SCOREDISTANCEUP, 200, Ressources.SCORETEXTSIZE);
this.labelScore.setFont(FontCache.getInstance().getFont("Fontin_R",Ressources.SCORETEXTSIZE));
this.labelScore.setText(((Integer)(Hero.getInstance().getHighscore())).toString());
this.labelScore.setHorizontalAlignment(SwingConstants.RIGHT);
this.labelScore.setVisible(true);
this.baseLayer.add(this.labelScore);
fg1=new GameLayer(renderer);
fg1.setSize(Ressources.WINDOW.width, Ressources.WINDOW.height);
fg1.setLocation(0, 0);
fg2=new GameLayer(rendererfg2);
fg2.setSize(Ressources.WINDOW.width, Ressources.WINDOW.height);
fg2.setLocation(0, 0);
ia=new InteractionLayer(rendererInteraction);
ia.setSize(Ressources.WINDOW.width, Ressources.WINDOW.height);
ia.setLocation(0, 0);
//ia can just be rendered after fg1 was renderd. therefore we need a initializemethod
ia.initialize(renderer.getTileQue());
mg=new GameLayer(rendererMG);
mg.setSize(Ressources.WINDOW.width, Ressources.WINDOW.height);
mg.setLocation(0, 0); //TODO: -100 entfernen
bg=new GameLayer(rendererBG);
bg.setSize(Ressources.WINDOW.width, Ressources.WINDOW.height);
bg.setLocation(0, 0); //TODO: -100 entfernen
clouds=new GameLayer(rendererCloud);
clouds.setSize(Ressources.WINDOW.width, Ressources.WINDOW.height);
clouds.setLocation(0, 0); //TODO: -100 entfernen
Thread.yield();
Hero.getInstance().setTileQue(renderer.getTileQue());
Hero.getInstance().initHero(heroType);
//Add in Order:
baseLayer.add(fg2);
// initialize Hero
//this.hero = new Hero('b'); //TODO: einlesen, welcher hero-Typ vom User ausgew�hlt wurde
baseLayer.add(Hero.getInstance());
baseLayer.add(ia);
baseLayer.add(fg1);
baseLayer.add(mg);
baseLayer.add(bg);
baseLayer.add(clouds);
}
/*
* @author Miriam
* is called if game is won/lost or if the user exits the game
*/
public void saveHighscore() throws SQLException{
this.db.addHighscore(User.getCurrentUser().getId(), this.level.getId(), Hero.getInstance().getHighscore());
}
/**
* the different layers are moving in different speeds
*
* @author Martika
*/
private void layerStep(){
fg1.step();
fg2.step();
ia.step();
if(stepCounterLayer % 2 == 0)
mg.step();
if(stepCounterLayer % 4 == 0){
bg.step();
}
if(stepCounterLayer % 6 == 0){
clouds.step();
}
Hero.getInstance().setInRunFreazing(true);
Hero.getInstance().runFreazing(stepCounterLayer);
this.labelScore.setText(((Integer)(Hero.getInstance().getHighscore())).toString());
stepCounterLayer++;
}
/*
* @author Miriam
*/
public void checkEnding(){
if(Hero.getInstance().checkIfHeroReachedEnding(this.level.getNumberOfBlocks())){
if(!over) {
over = true;
dispose();
}
}
}
/**
* @throws SQLException
*
*/
public synchronized void step(){
if(stepCounter % 6 == 0){
clouds.step();
}
//Navigation of the hero via the right, left, up and down keys
if(stepCounter % 4 == 0){
Hero.getInstance().heroStep(stepCounterLayer);
this.labelScore.setText(((Integer)(Hero.getInstance().getHighscore())).toString());
}
Hero.getInstance();
//Hero klebt an der unsichtbaren Wand an Kachel 5
if(Hero.getInstance().getRunDirection() == 'r' && Hero.getInstance().getX() + (Hero.getInstance().getWidth()/2) >= Ressources.RASTERSIZE*5){
if (Hero.getInstance().getX()+ (Hero.getInstance().getWidth()/2) == Ressources.RASTERSIZE*5 && !Hero.getInstance().isInRunFreazing()
&& stepCounterLayer%Ressources.RASTERSIZE < Ressources.RUNCONSTANT){
// Hero.getInstance().setQueCounter(Hero.getInstance().getQueCounter()+1);
}
layerStep();
}
stepCounter++;
repaint();
this.checkEnding();
}
public synchronized void dispose() {
// start Menu
// save highscore
try {
saveHighscore();
} catch (SQLException e) {
e.printStackTrace();
}
@SuppressWarnings("unused")
Menu m = new Menu(level.getId());
// cleanup
this.timer.cancel();
Hero.getInstance().cleanup();
rtw.cleanup();
DummyRenderer.cleanup();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Window.super.dispose();
}});
}
}