Hello again,
Posted my latest game attempt in the “Your games here” topic, but there seems to be a few wrinkles that need to ironed out so I thought I’d start a new thread here and fling some code at you.
The thread:
http://www.java-gaming.org/cgi-bin/JGNetForums/YaBB.cgi?board=Announcements;action=display;num=1091819583
The game:
http://home.chello.no/~ttollefs/game/scroller/scroller.html
or
http://student.iu.hio.no/~s113388/SpaceStationII.jnlp
Sooo … where to start. As I understood it the game speed was all over the place and some of the tiles didn’t have the good sense to stay in one place. I’ve changed the game loop since then from using Thread.sleep()
public void run()
{
while (true)
{
try
{ sleep(m_iFrameDelay); }
catch(InterruptedException ie)
{ System.err.println("m_iFrameDelay was interrupted"); }
ref.gameCycle();
}
}
to the following (posted in forums.java.sun.com)
public void run()
{
final int MILLI_FRAME_LENGTH = 1000/30;
long startTime = System.currentTimeMillis();
int frameCount = 0;
while(true)
{
ref.gameCycle();
frameCount++;
while((System.currentTimeMillis()-startTime)/MILLI_FRAME_LENGTH <frameCount)
{ Thread.yield(); }
if (ref.getKeyState(KeyEvent.VK_ESCAPE))
break;
}
ref.destroy();
}
The original version used java 1.5’s System.nanoTime()
which I changed to currentTimeMillis(). the gameCycle() method updates what needs to be updated and calls repaint(). My update() method looks like this:
public void update(Graphics g)
{
// Paint game graphics to off-screen image
renderGameOffscreen();
// Draw the off-screen image to on-screen
do
{
int returnCode = vImgOffscreen.validate(getGraphicsConfiguration());
if (returnCode == VolatileImage.IMAGE_RESTORED)
{
// Contents need to be restored
renderGameOffscreen(); // restore contents
}
else if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE)
{
// old vImgOffscreen doesn't work with new GraphicsConfig; re-create it
vImgOffscreen = createVolatileImage(Constants.GAMEWIDTH, Constants.GAMEHEIGHT + Constants.BOTTOM_Y_OFFSET);
renderGameOffscreen();
}
g.drawImage(vImgOffscreen, 0, 0, this);
}
while (vImgOffscreen.contentsLost());
}
// Method renders all game graphics to an off screen volatile image
public void renderGameOffscreen()
{
do
{
if (vImgOffscreen.validate(getGraphicsConfiguration()) == VolatileImage.IMAGE_INCOMPATIBLE)
{
// old vImgOffscreen doesn't work with new GraphicsConfig; re-create it
vImgOffscreen = createVolatileImage(Constants.GAMEWIDTH, Constants.GAMEHEIGHT + Constants.BOTTOM_Y_OFFSET);
}
Graphics2D g = vImgOffscreen.createGraphics();
switch (m_iGameState)
{
... paints what needs to be painted based on the current game state ...
}
g.dispose();
}
while (vImgOffscreen.contentsLost());
}
Been having a hard time trying to figure out what could be wrong because I don’t have any real problems with speed or weirdo tile placements on this end … so anything seem wrong with the game loop or my drawing routine?