Java-Gaming.org Java4K winners: [ by our judges | by the community ]         
Featured games (67)
games approved by the League of Dukes
Games in Showcase (∞)
games submitted by our members



News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  Print  
  Scrolling problems  (Read 813 times)
0 Members and 1 Guest are viewing this topic.
Offline 2DGamer

JGO n00b
*

Posts: 9


Java games rock!


« on: 2004-08-16 06:51:24 »

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()

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)
      {
            // 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?
Pages: [1]
  Print  
 
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Page created in 0.248 seconds with 20 queries.