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=1091819583The game:
http://home.chello.no/~ttollefs/game/scroller/scroller.htmlor
http://student.iu.hio.no/~s113388/SpaceStationII.jnlpSooo ... 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()
1 2 3 4 5 6 7 8 9 10 11 12
| 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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public void update(Graphics g) { renderGameOffscreen();
do { int returnCode = vImgOffscreen.validate(getGraphicsConfiguration()); if (returnCode == VolatileImage.IMAGE_RESTORED) { renderGameOffscreen(); } else if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE) { vImgOffscreen = createVolatileImage(Constants.GAMEWIDTH, Constants.GAMEHEIGHT + Constants.BOTTOM_Y_OFFSET); renderGameOffscreen(); } g.drawImage(vImgOffscreen, 0, 0, this); } while (vImgOffscreen.contentsLost()); }
public void renderGameOffscreen() { do { if (vImgOffscreen.validate(getGraphicsConfiguration()) == VolatileImage.IMAGE_INCOMPATIBLE) { 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?