org.newdawn.slick.CanvasGameContainer Maven / Gradle / Ivy
package org.newdawn.slick;
import java.awt.Canvas;
import javax.swing.SwingUtilities;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.newdawn.slick.util.Log;
/**
* A game container that displays the game on an AWT Canvas.
*
* @author kevin
*/
public class CanvasGameContainer extends Canvas {
/** The actual container implementation */
protected Container container;
/** The game being held in this container */
protected Game game;
/**
* Create a new panel
*
* @param game The game being held
* @throws SlickException Indicates a failure during creation of the container
*/
public CanvasGameContainer(Game game) throws SlickException {
this(game, false);
}
/**
* Create a new panel
*
* @param game The game being held
* @param shared True if shared GL context should be enabled. This allows multiple panels
* to share textures and other GL resources.
* @throws SlickException Indicates a failure during creation of the container
*/
public CanvasGameContainer(Game game, boolean shared) throws SlickException {
super();
this.game = game;
setIgnoreRepaint(true);
requestFocus();
setSize(500,500);
container = new Container(game, shared);
container.setForceExit(false);
}
/**
* Start the game container rendering
*
* @throws SlickException Indicates a failure during game execution
*/
public void start() throws SlickException {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
Input.disableControllers();
try {
Display.setParent(CanvasGameContainer.this);
} catch (LWJGLException e) {
throw new SlickException("Failed to setParent of canvas", e);
}
container.setup();
scheduleUpdate();
} catch (SlickException e) {
e.printStackTrace();
System.exit(0);
}
}
});
}
/**
* Schedule an update on the EDT
*/
private void scheduleUpdate() {
if (!isVisible()) {
return;
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
container.gameLoop();
} catch (SlickException e) {
e.printStackTrace();
}
container.checkDimensions();
scheduleUpdate();
}
});
}
/**
* Dispose the container and any resources it holds
*/
public void dispose() {
}
/**
* Get the GameContainer providing this canvas
*
* @return The game container providing this canvas
*/
public GameContainer getContainer() {
return container;
}
/**
* A game container to provide the canvas context
*
* @author kevin
*/
private class Container extends AppGameContainer {
/**
* Create a new container wrapped round the game
*
* @param game
* The game to be held in this container
* @param shared True if shared GL context should be enabled. This allows multiple panels
* to share textures and other GL resources.
* @throws SlickException Indicates a failure to initialise
*/
public Container(Game game, boolean shared) throws SlickException {
super(game, CanvasGameContainer.this.getWidth(), CanvasGameContainer.this.getHeight(), false);
width = CanvasGameContainer.this.getWidth();
height = CanvasGameContainer.this.getHeight();
if (shared) {
enableSharedContext();
}
}
/**
* Updated the FPS counter
*/
protected void updateFPS() {
super.updateFPS();
}
/**
* @see org.newdawn.slick.GameContainer#running()
*/
protected boolean running() {
return super.running() && CanvasGameContainer.this.isDisplayable();
}
/**
* @see org.newdawn.slick.GameContainer#getHeight()
*/
public int getHeight() {
return CanvasGameContainer.this.getHeight();
}
/**
* @see org.newdawn.slick.GameContainer#getWidth()
*/
public int getWidth() {
return CanvasGameContainer.this.getWidth();
}
/**
* Check the dimensions of the canvas match the display
*/
public void checkDimensions() {
if ((width != CanvasGameContainer.this.getWidth()) ||
(height != CanvasGameContainer.this.getHeight())) {
try {
setDisplayMode(CanvasGameContainer.this.getWidth(),
CanvasGameContainer.this.getHeight(), false);
} catch (SlickException e) {
Log.error(e);
}
}
}
}
}