/***********************************************************************
* mt4j Copyright (c) 2008 - 2010 Christopher Ruff, Fraunhofer-Gesellschaft All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
***********************************************************************/
package advanced.puzzle;
import org.mt4j.MTApplication;
import org.mt4j.components.MTComponent;
import org.mt4j.components.TransformSpace;
import org.mt4j.components.visibleComponents.font.FontManager;
import org.mt4j.components.visibleComponents.font.IFont;
import org.mt4j.components.visibleComponents.shapes.AbstractShape;
import org.mt4j.components.visibleComponents.shapes.MTRoundRectangle;
import org.mt4j.components.visibleComponents.shapes.MTRectangle.PositionAnchor;
import org.mt4j.components.visibleComponents.widgets.MTBackgroundImage;
import org.mt4j.components.visibleComponents.widgets.MTList;
import org.mt4j.components.visibleComponents.widgets.MTListCell;
import org.mt4j.components.visibleComponents.widgets.MTTextArea;
import org.mt4j.input.gestureAction.DefaultButtonClickAction;
import org.mt4j.input.inputProcessors.IGestureEventListener;
import org.mt4j.input.inputProcessors.MTGestureEvent;
import org.mt4j.input.inputProcessors.componentProcessors.tapProcessor.TapEvent;
import org.mt4j.input.inputProcessors.componentProcessors.tapProcessor.TapProcessor;
import org.mt4j.input.inputProcessors.globalProcessors.CursorTracer;
import org.mt4j.sceneManagement.AbstractScene;
import org.mt4j.sceneManagement.IPreDrawAction;
import org.mt4j.util.MT4jSettings;
import org.mt4j.util.MTColor;
import org.mt4j.util.math.ToolsMath;
import org.mt4j.util.math.Vector3D;
import processing.core.PImage;
public class PuzzleScene extends AbstractScene{
private PuzzleFactory pf;
/** The images path. */
private String imagesPath = "advanced"+MTApplication.separator+"puzzle"+MTApplication.separator+"data"+MTApplication.separator;
/** The images names. */
private String[] imagesNames = new String[]{
"Pyramids.jpg",
"Grass.jpg",
"Heidelberg.jpg"
};
private MTComponent puzzleGroup;
private int horizontalTiles = 4;
private int verticalTiles = 3;
private MTList list;
private MTRoundRectangle loadingScreen;
public PuzzleScene(MTApplication mtApplication, String name) {
super(mtApplication, name);
if (!MT4jSettings.getInstance().isOpenGlMode()){
System.err.println(this.getName() + " is only usable with the OpenGL renderer.");
}
this.setClearColor(new MTColor(55,55,55));
this.registerGlobalInputProcessor(new CursorTracer(mtApplication, this));
this.getCanvas().setDepthBufferDisabled(true); //to avoid display errors because everything is 2D
MTBackgroundImage background = new MTBackgroundImage(mtApplication, mtApplication.loadImage(imagesPath + "webtreats_wood-pattern1-512d.jpg") , true);
this.getCanvas().addChild(background);
this.puzzleGroup = new MTComponent(mtApplication);
this.getCanvas().addChild(puzzleGroup);
//Puzzle tile factory
this.pf = new PuzzleFactory(getMTApplication());
IFont font = FontManager.getInstance().createFont(mtApplication, "SansSerif", 16, MTColor.WHITE, MTColor.WHITE, false);
//New Puzzle button
MTRoundRectangle r = getRoundRectWithText(0, 0, 120, 35, "New Puzzle", font);
r.registerInputProcessor(new TapProcessor(getMTApplication()));
r.addGestureListener(TapProcessor.class, new DefaultButtonClickAction(r));
r.addGestureListener(TapProcessor.class, new IGestureEventListener() {
public boolean processGestureEvent(MTGestureEvent ge) {
TapEvent te = (TapEvent)ge;
if (te.isTapped()){
if (list.isVisible()){
list.setVisible(false);
}else{
list.setVisible(true);
}
}
return false;
}
});
r.setPositionGlobal(new Vector3D(r.getWidthXY(TransformSpace.GLOBAL)/2f + 3 , r.getHeightXY(TransformSpace.GLOBAL)/2f + 3));
this.getCanvas().addChild(r);
//Image list
float cellWidth = 180;
float cellHeight = 40;
MTColor cellFillColor = new MTColor(MTColor.BLACK);
MTColor cellPressedFillColor = new MTColor(new MTColor(105,105,105));
list = new MTList(r.getWidthXY(TransformSpace.GLOBAL) + 5, 0, cellWidth+2, imagesNames.length* cellHeight + imagesNames.length*3, getMTApplication());
list.setNoFill(true);
list.setNoStroke(true);
list.unregisterAllInputProcessors();
list.setAnchor(PositionAnchor.UPPER_LEFT);
// list.setPositionGlobal(Vector3D.ZERO_VECTOR);
list.setVisible(false);
for (int i = 0; i < imagesNames.length; i++) {
String imageName = imagesNames[i];
list.addListElement(this.createListCell(imageName, font, cellWidth, cellHeight, cellFillColor, cellPressedFillColor));
}
this.getCanvas().addChild(list);
//Loading window
this.loadingScreen = getRoundRectWithText(0, 0, 130, 45, " Loading...", font);
this.loadingScreen.setFillColor(new MTColor(0,0,0,200));
this.loadingScreen.setStrokeColor(new MTColor(0,0,0,200));
this.loadingScreen.setPickable(false);
this.loadingScreen.setPositionGlobal(MT4jSettings.getInstance().getWindowCenter());
this.loadingScreen.setVisible(false);
this.getCanvas().addChild(loadingScreen);
}
private MTRoundRectangle getRoundRectWithText(float x, float y, float width, float height, String text, IFont font){
MTRoundRectangle r = new MTRoundRectangle(x, y, 0, width, height, 12, 12, getMTApplication());
r.unregisterAllInputProcessors();
r.setFillColor(MTColor.BLACK);
r.setStrokeColor(MTColor.BLACK);
MTTextArea rText = new MTTextArea(getMTApplication(), font);
rText.unregisterAllInputProcessors();
rText.setPickable(false);
rText.setNoFill(true);
rText.setNoStroke(true);
rText.setText(text);
r.addChild(rText);
rText.setPositionRelativeToParent(r.getCenterPointLocal());
return r;
}
private MTListCell createListCell(final String imageName, IFont font, float cellWidth, float cellHeight, final MTColor cellFillColor, final MTColor cellPressedFillColor){
final MTListCell cell = new MTListCell(cellWidth, cellHeight, getMTApplication());
cell.setFillColor(cellFillColor);
MTTextArea listLabel = new MTTextArea(getMTApplication(), font);
listLabel.setNoFill(true);
listLabel.setNoStroke(true);
listLabel.setText(imageName);
cell.addChild(listLabel);
listLabel.setPositionRelativeToParent(cell.getCenterPointLocal());
cell.unregisterAllInputProcessors();
cell.registerInputProcessor(new TapProcessor(getMTApplication(), 15));
cell.addGestureListener(TapProcessor.class, new IGestureEventListener() {
public boolean processGestureEvent(MTGestureEvent ge) {
TapEvent te = (TapEvent)ge;
switch (te.getTapID()) {
case TapEvent.BUTTON_DOWN:
cell.setFillColor(cellPressedFillColor);
break;
case TapEvent.BUTTON_UP:
cell.setFillColor(cellFillColor);
break;
case TapEvent.BUTTON_CLICKED:
//System.out.println("Button clicked: " + label);
cell.setFillColor(cellFillColor);
list.setVisible(false);
loadingScreen.setVisible(true);
registerPreDrawAction(new IPreDrawAction() {
public void processAction() {
getMTApplication().invokeLater(new Runnable() {
public void run() {
loadNewPuzzle(imageName, horizontalTiles, verticalTiles);
loadingScreen.setVisible(false);
}
});
}
public boolean isLoop() {return false;}
});
break;
}
return false;
}
});
return cell;
}
private void loadNewPuzzle(String imageName, int horizontalTiles, int verticalTiles){
for (MTComponent c : puzzleGroup.getChildren()){
c.destroy();
}
PImage p = getMTApplication().loadImage(imagesPath + imageName);
AbstractShape[] tiles = pf.createTiles(p, this.horizontalTiles, this.verticalTiles);
for (int i = 0; i < tiles.length; i++) {
final AbstractShape sh = tiles[i];
//Delay to smooth the animation because of loading hickups
final float x = ToolsMath.getRandom(0, MT4jSettings.getInstance().getWindowWidth());
final float y = ToolsMath.getRandom(0, MT4jSettings.getInstance().getWindowHeight());
registerPreDrawAction(new IPreDrawAction() {
public void processAction() {
getMTApplication().invokeLater(new Runnable() {
public void run() {
registerPreDrawAction(new IPreDrawAction() {
public void processAction() {
getMTApplication().invokeLater(new Runnable() {
public void run() {
puzzleGroup.addChild(sh);
sh.tweenTranslateTo(x, y, 0, 400, 0f, 1.0f);
}
});
}
public boolean isLoop() {return false;}
});
}
});
}
public boolean isLoop() {return false;}
});
sh.rotateZ(sh.getCenterPointRelativeToParent(), ToolsMath.getRandom(0, 359));
}
}
@Override
public void init() {}
@Override
public void shutDown() {}
}