Altered animation manager to draw directly to the target's graphics
context. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@191 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,8 +1,9 @@
|
|||||||
//
|
//
|
||||||
// $Id: AnimationManager.java,v 1.8 2001/08/07 18:29:18 shaper Exp $
|
// $Id: AnimationManager.java,v 1.9 2001/08/08 00:10:50 shaper Exp $
|
||||||
|
|
||||||
package com.threerings.miso.sprite;
|
package com.threerings.miso.sprite;
|
||||||
|
|
||||||
|
import java.awt.Graphics;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
@@ -84,6 +85,13 @@ public class AnimationManager implements Interval, PerformanceObserver
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <code>IntervalManager</code> calls this method as often as
|
||||||
|
* we've requested to obtain our desired frame rate. Since we'd
|
||||||
|
* like to avoid messy thread-synchronization between the AWT
|
||||||
|
* thread and other threads, here we just add the tick task to the
|
||||||
|
* AWT thread for later execution.
|
||||||
|
*/
|
||||||
public void intervalExpired (int id, Object arg)
|
public void intervalExpired (int id, Object arg)
|
||||||
{
|
{
|
||||||
if (requestTick()) {
|
if (requestTick()) {
|
||||||
@@ -92,6 +100,10 @@ public class AnimationManager implements Interval, PerformanceObserver
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <code>tick</code> method handles updating sprites and
|
||||||
|
* repainting the target display.
|
||||||
|
*/
|
||||||
protected void tick ()
|
protected void tick ()
|
||||||
{
|
{
|
||||||
// call tick on all sprites
|
// call tick on all sprites
|
||||||
@@ -104,8 +116,27 @@ public class AnimationManager implements Interval, PerformanceObserver
|
|||||||
// pass the dirty-rects on to the scene view
|
// pass the dirty-rects on to the scene view
|
||||||
_view.invalidateRects(rects);
|
_view.invalidateRects(rects);
|
||||||
|
|
||||||
// refresh the display
|
// refresh the display.
|
||||||
_target.paintImmediately(_target.getBounds());
|
|
||||||
|
// since we know the target panel is always opaque and not
|
||||||
|
// dependent on swing's double-buffering, we bypass the
|
||||||
|
// antics that <code>paintImmediately()</code> performs in
|
||||||
|
// the interest of better performance and grab the
|
||||||
|
// target's graphics object straightaway.
|
||||||
|
|
||||||
|
Graphics g = null;
|
||||||
|
try {
|
||||||
|
Graphics pcg = _target.getGraphics();
|
||||||
|
g = pcg.create();
|
||||||
|
pcg.dispose();
|
||||||
|
} catch(NullPointerException e) {
|
||||||
|
g = null;
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g != null) {
|
||||||
|
_target.paint(g);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// update refresh-rate information
|
// update refresh-rate information
|
||||||
@@ -129,7 +160,7 @@ public class AnimationManager implements Interval, PerformanceObserver
|
|||||||
protected Runnable _ticker;
|
protected Runnable _ticker;
|
||||||
|
|
||||||
/** The desired number of refresh operations per second. */
|
/** The desired number of refresh operations per second. */
|
||||||
protected static final int FRAME_RATE = 20;
|
protected static final int FRAME_RATE = 40;
|
||||||
|
|
||||||
/** The milliseconds to sleep to obtain desired frame rate. */
|
/** The milliseconds to sleep to obtain desired frame rate. */
|
||||||
protected static final long REFRESH_INTERVAL = 1000 / FRAME_RATE;
|
protected static final long REFRESH_INTERVAL = 1000 / FRAME_RATE;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: IsoSceneView.java,v 1.27 2001/08/07 18:29:17 shaper Exp $
|
// $Id: IsoSceneView.java,v 1.28 2001/08/08 00:10:50 shaper Exp $
|
||||||
|
|
||||||
package com.threerings.miso.scene;
|
package com.threerings.miso.scene;
|
||||||
|
|
||||||
@@ -61,10 +61,19 @@ public class IsoSceneView implements EditableSceneView
|
|||||||
Shape oldclip = gfx.getClip();
|
Shape oldclip = gfx.getClip();
|
||||||
gfx.setClip(0, 0, _model.bounds.width, _model.bounds.height);
|
gfx.setClip(0, 0, _model.bounds.width, _model.bounds.height);
|
||||||
|
|
||||||
// draw the full scene into the offscreen image buffer
|
if (_dirty.size() == 0) {
|
||||||
//renderSceneInvalid(gfx);
|
// render the full scene
|
||||||
renderScene(gfx);
|
renderScene(gfx);
|
||||||
drawDirtyRects(gfx);
|
|
||||||
|
} else {
|
||||||
|
// render only dirty tiles
|
||||||
|
renderSceneInvalid(gfx);
|
||||||
|
|
||||||
|
// draw frames of dirty tiles and rectangles
|
||||||
|
drawDirtyRegions(gfx);
|
||||||
|
|
||||||
|
clearDirtyRegions();
|
||||||
|
}
|
||||||
|
|
||||||
// draw an outline around the highlighted tile
|
// draw an outline around the highlighted tile
|
||||||
paintHighlightedTile(gfx, _htile.x, _htile.y);
|
paintHighlightedTile(gfx, _htile.x, _htile.y);
|
||||||
@@ -76,13 +85,19 @@ public class IsoSceneView implements EditableSceneView
|
|||||||
gfx.setClip(oldclip);
|
gfx.setClip(oldclip);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void drawDirtyRects (Graphics2D gfx)
|
protected void clearDirtyRegions ()
|
||||||
|
{
|
||||||
|
_dirty.clear();
|
||||||
|
_dirtyRects.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void drawDirtyRegions (Graphics2D gfx)
|
||||||
{
|
{
|
||||||
// draw the dirty tiles
|
// draw the dirty tiles
|
||||||
gfx.setColor(Color.cyan);
|
gfx.setColor(Color.cyan);
|
||||||
int size = _dirty.size();
|
int size = _dirty.size();
|
||||||
for (int ii = 0; ii < size; ii++) {
|
for (int ii = 0; ii < size; ii++) {
|
||||||
int dinfo[] = (int[])_dirty.remove(0);
|
int dinfo[] = (int[])_dirty.get(ii);
|
||||||
gfx.draw(getTilePolygon(dinfo[0], dinfo[1]));
|
gfx.draw(getTilePolygon(dinfo[0], dinfo[1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +105,7 @@ public class IsoSceneView implements EditableSceneView
|
|||||||
gfx.setColor(Color.red);
|
gfx.setColor(Color.red);
|
||||||
size = _dirtyRects.size();
|
size = _dirtyRects.size();
|
||||||
for (int ii = 0; ii < size; ii++) {
|
for (int ii = 0; ii < size; ii++) {
|
||||||
Rectangle rect = (Rectangle)_dirtyRects.remove(0);
|
Rectangle rect = (Rectangle)_dirtyRects.get(ii);
|
||||||
gfx.draw(rect);
|
gfx.draw(rect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -102,13 +117,11 @@ public class IsoSceneView implements EditableSceneView
|
|||||||
*/
|
*/
|
||||||
protected void renderSceneInvalid (Graphics2D gfx)
|
protected void renderSceneInvalid (Graphics2D gfx)
|
||||||
{
|
{
|
||||||
Log.info("renderSceneInvalid.");
|
|
||||||
|
|
||||||
int size = _dirty.size();
|
int size = _dirty.size();
|
||||||
for (int ii = 0; ii < size; ii++) {
|
for (int ii = 0; ii < size; ii++) {
|
||||||
|
|
||||||
// retrieve the next dirty tile coordinates
|
// retrieve the next dirty tile coordinates
|
||||||
int[] dinfo = (int[])_dirty.remove(0);
|
int[] dinfo = (int[])_dirty.get(ii);
|
||||||
int tx = dinfo[0], ty = dinfo[1];
|
int tx = dinfo[0], ty = dinfo[1];
|
||||||
|
|
||||||
// get the tile's screen position
|
// get the tile's screen position
|
||||||
@@ -425,6 +438,11 @@ public class IsoSceneView implements EditableSceneView
|
|||||||
_scene = scene;
|
_scene = scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getShowCoordinates ()
|
||||||
|
{
|
||||||
|
return _model.showCoords;
|
||||||
|
}
|
||||||
|
|
||||||
public void setShowCoordinates (boolean show)
|
public void setShowCoordinates (boolean show)
|
||||||
{
|
{
|
||||||
_model.showCoords = show;
|
_model.showCoords = show;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: SceneViewPanel.java,v 1.2 2001/08/06 18:57:39 shaper Exp $
|
// $Id: SceneViewPanel.java,v 1.3 2001/08/08 00:10:50 shaper Exp $
|
||||||
|
|
||||||
package com.threerings.miso.scene;
|
package com.threerings.miso.scene;
|
||||||
|
|
||||||
@@ -43,12 +43,20 @@ public class SceneViewPanel extends JPanel
|
|||||||
_view.setScene(scene);
|
_view.setScene(scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the scene managed by the panel.
|
||||||
|
*/
|
||||||
|
public SceneView getSceneView ()
|
||||||
|
{
|
||||||
|
return _view;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render the panel and the scene view to the given graphics object.
|
* Render the panel and the scene view to the given graphics object.
|
||||||
*/
|
*/
|
||||||
public void paintComponent (Graphics g)
|
public void paintComponent (Graphics g)
|
||||||
{
|
{
|
||||||
super.paintComponent(g);
|
// super.paintComponent(g);
|
||||||
_view.paint(g);
|
_view.paint(g);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user