Added support for using sprites that are fixed in relation to a

potentially scrolling view. Also added a means for non-sprites and
animations to hear about view scrolls.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3209 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2004-11-11 23:52:43 +00:00
parent 512663e482
commit cd51c78619
4 changed files with 94 additions and 15 deletions
@@ -1,5 +1,5 @@
//
// $Id: AbstractMedia.java,v 1.12 2004/08/27 02:12:37 mdb Exp $
// $Id: AbstractMedia.java,v 1.13 2004/11/11 23:52:43 mdb Exp $
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
@@ -39,6 +39,11 @@ import com.samskivert.util.StringUtil;
public abstract class AbstractMedia
implements Shape
{
/** A {@link #_renderOrder} value at or above which, indicates that this
* media is in the HUD (heads up display) and should not scroll when the
* view scrolls. */
public static final int HUD_LAYER = 65536;
/**
* Instantiate an abstract media object.
*/
@@ -173,6 +178,8 @@ public abstract class AbstractMedia
* appropriate manager and must not change while the manager is
* managing it. If you wish to change the render order, remove the
* media from the manager, change the order and add it back again.
*
* @see #HUD_LAYER
*/
public void setRenderOrder (int renderOrder)
{
@@ -203,6 +210,29 @@ public abstract class AbstractMedia
}
}
/**
* Called by the {@link AbstractMediaManager} when we are in a
* {@link VirtualMediaPanel} that just scrolled.
*/
public void viewLocationDidChange (int dx, int dy)
{
if (_renderOrder >= HUD_LAYER) {
setLocation(_bounds.x + dx, _bounds.y + dy);
}
}
/**
* Dumps this media to a String object.
*/
public String toString ()
{
StringBuffer buf = new StringBuffer();
buf.append(StringUtil.shortClassName(this));
buf.append("[");
toString(buf);
return buf.append("]").toString();
}
/**
* Initialize the media.
*/
@@ -269,18 +299,6 @@ public abstract class AbstractMedia
}
}
/**
* Dumps this media to a String object.
*/
public String toString ()
{
StringBuffer buf = new StringBuffer();
buf.append(StringUtil.shortClassName(this));
buf.append("[");
toString(buf);
return buf.append("]").toString();
}
/**
* This should be overridden by derived classes (which should be sure
* to call <code>super.toString()</code>) to append the derived class
@@ -1,5 +1,5 @@
//
// $Id: AbstractMediaManager.java,v 1.13 2004/08/27 02:12:37 mdb Exp $
// $Id: AbstractMediaManager.java,v 1.14 2004/11/11 23:52:43 mdb Exp $
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
@@ -139,6 +139,21 @@ public abstract class AbstractMediaManager
return _media.contains(media);
}
/**
* Called by a {@link VirtualMediaPanel} when the view that contains our
* media is scrolled.
*
* @param dx the scrolled distance in the x direction (in pixels).
* @param dy the scrolled distance in the y direction (in pixels).
*/
public void viewLocationDidChange (int dx, int dy)
{
// let our media know
for (int ii = 0, ll = _media.size(); ii < ll; ii++) {
((AbstractMedia)_media.get(ii)).viewLocationDidChange(dx, dy);
}
}
/**
* Calls {@link AbstractMedia#tick} on all media to give them a chance
* to move about, change their look, generate dirty regions, and so
@@ -0,0 +1,18 @@
//
// $Id: ViewTracker.java,v 1.1 2004/11/11 23:52:43 mdb Exp $
package com.threerings.media;
/**
* An interface used by entities that wish to respond to the scrolling of a
* {@link VirtualMediaPanel}.
*
* @see VirtualMediaPanel#addViewTracker
*/
public interface ViewTracker
{
/**
* Called by a {@link VirtualMediaPanel} when it scrolls.
*/
public void viewLocationDidChange (int dx, int dy);
}
@@ -1,5 +1,5 @@
//
// $Id: VirtualMediaPanel.java,v 1.28 2004/10/29 19:33:16 mdb Exp $
// $Id: VirtualMediaPanel.java,v 1.29 2004/11/11 23:52:43 mdb Exp $
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved
@@ -25,6 +25,7 @@ import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.SwingUtilities;
@@ -101,6 +102,21 @@ public class VirtualMediaPanel extends MediaPanel
return _vbounds;
}
/**
* Adds an entity that will be informed when the view scrolls.
*/
public void addViewTracker (ViewTracker tracker)
{
_trackers.add(tracker);
}
/**
* Removes an entity from the view trackers list.
*/
public void removeViewTracker (ViewTracker tracker)
{
_trackers.remove(tracker);
}
/**
* Instructs the view to follow the supplied pathable; ensuring that
* the view's coordinates are adjusted according to the follow mode.
@@ -256,6 +272,15 @@ public class VirtualMediaPanel extends MediaPanel
sdirty.translate(-dx, -dy);
dirtyScreenRect(sdirty);
}
// inform our view trackers
for (int ii = 0, ll = _trackers.size(); ii < ll; ii++) {
((ViewTracker)_trackers.get(ii)).viewLocationDidChange(dx, dy);
}
// let our sprites and animations know what's up
_animmgr.viewLocationDidChange(dx, dy);
_spritemgr.viewLocationDidChange(dx, dy);
}
/**
@@ -417,4 +442,7 @@ public class VirtualMediaPanel extends MediaPanel
/** We need to know our absolute coordinates in order to work around
* the Windows copyArea() bug. */
protected Rectangle _abounds = new Rectangle();
/** A list of entities to be informed when the view scrolls. */
protected ArrayList _trackers = new ArrayList();
}