Java-Gaming.org Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (538)
Games in Android Showcase (132)
games submitted by our members
Games in WIP (600)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Game Loop and Rendering  (Read 1176 times)
0 Members and 1 Guest are viewing this topic.
Offline kutucuk

Senior Devvie


Medals: 5
Exp: 3 years



« Posted 2013-03-23 05:33:38 »

So some of you noticed that I am trying to find my way around game development.

I first tried to comprehend game loops deeply enough to write my own. The same goes for the "best" way of active rendering (If there is one).

Like anyone who reads this, you guess that I keep failing and am getting sick and tired of that.

So first of all I wanted to ask a question; How much Java 2D should we know? I did not plan to ask this, but I saw some libgdx tutorials and image drawing was nothing like Java 2D. The other reason of this question is that I am getting tired of Java 2D, not because it's slow etc., I still get very frustrating errors Cheesy

Anyway, I have a code snippet to be used as a skeleton (or let's say a template) for my practices. I figured that if I keep staying on these two topics and don't go further, I'd get bored. So for now I am going to use this to make something 'visible' and I am hoping to learn and understand why there are so many methods to do these things.

But I have some questions regarding the code snippet. It is not written by me. I guess I took it from Killer Game Programming in Java book. It uses active rendering and has a basic game loop.

The first two question is about active rendering. In the book, he does that like this (Comments are written by me to understand what's going on):
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  
//These are defined in the class
   private Graphics dbg; // For double buffering
        private Image dbImage = null; // For double buffering as well

//This is one method:
   private void gameRender() {
      if (dbImage == null) { // second image for double buffer
         dbImage = createImage(PWIDTH, PHEIGHT);
         dbg = dbImage.getGraphics();
      }
      // Clear the screen
      dbg.setColor(Color.white);
      dbg.fillRect(0, 0, PWIDTH, PHEIGHT);
      // Draw all other stuff
      dbg.drawImage(dbImage, 0,0, this);
   }

//Then this:
private void paintScreen(){                          //Active rendering -- No need for repaint or paintComponent
      Graphics g;            // Also considered to be more efficient
      try {
         g = this.getGraphics(); // It says JVM may clear this, so every time we run this, we
                           //   have to get graphics
         if ((g != null) && (dbImage != null))
            g.drawImage(dbImage, 0, 0, null);                                    
         g.dispose();         //Why do we dispose that?
      } catch (Exception e) {
         System.out.println("Graphics context error: " + e);
      }
   }

Game loop goes like this: update method, gameRender, paintScreen and calculations.

Why did he use two methods to do the drawing? Is this correct?
And why do we dispose the g Graphics object?

Second is about game loop. In the book he says this one might cause problems, but this is as good as I can understand, nothing further. But still there is something...
There is a "period" variable (actually I don't know what it is) and he never defined it anywhere. But he explains it before the code:
Quote
A popular measure of how fast an animation progresses is frames per second (FPS). For GamePanel, a frame corresponds to a single pass through the update-render-sleep loop inside run(). Therefore, the desired 100 FPS imply that each iteration of the loop should take 1000/100 == 10 ms. This iteration time is stored in the periodvariable inGamePanel.

I could not understand what he means. Can anyone please explain it? And how does he plan to use that?

And here is the full code (Not the finished one - he says it is to be improved, but I just couldn't understand, so that is it Smiley )
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  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
88  
89  
90  
91  
92  
93  
94  
95  
96  
97  
98  
99  
100  
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

//This will be embedded into a frame or applet
public class GamePanel extends JPanel implements Runnable {
   private static final int PWIDTH = 500; // panel dimensions
   private static final int PHEIGHT = 400;
   private Thread animator; // animation thread
   private volatile boolean running = false;    // user just shuts the game
   private volatile boolean gameOver = false; // game ends as a result of user's fault or level ends
   private Graphics dbg; // For double buffering
   private Image dbImage = null; // For double buffering as well

   // more variables, if needed
   
   public GamePanel() {
      setBackground(Color.white);
      setPreferredSize(new Dimension(PWIDTH, PHEIGHT));
      // create game components
   }

   private void startGame() {
      if (animator == null || !running) {
         animator = new Thread(this);
         animator.start();
      }
   }

   public void stopGame() {
      running = false;
   }

   public void run() {
     
      long beforeTime, timeDiff, sleepTime; // To determine sleep time of the thread?
      beforeTime = System.currentTimeMillis();
     
      running = true;
      while (running) {
         gameUpdate();
         gameRender();
         paintScreen(); // This makes active rendering. So I don't need to use repaint etc.
         
         // This loop is said to be problematic, but haven't figured out yet
         timeDiff = System.currentTimeMillis() - beforeTime;
         sleepTime = period - timeDiff; // what's period? Never used or declared even.
         if (sleepTime <= 0) // if drawing took longer than animation (One line up)
         sleepTime = 5; //
         try {
            Thread.sleep(sleepTime); // ms
         } catch (InterruptedException ex) {
         }
         beforeTime = System.currentTimeMillis();
      }
      System.exit(0);
   } // end of run()
   
   @Override
   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (dbImage != null)
         g.drawImage(dbImage, 0, 0, null);
   }
   
   private void paintScreen(){ //Active rendering -- No need for repaint or paintComponent
      Graphics g;            // Also considered to be more efficient
      try {
         g = this.getGraphics(); // It says JVM may clear this, so every time we run this, we
                           //   have to get graphics
         if ((g != null) && (dbImage != null))
            g.drawImage(dbImage, 0, 0, null);                                    
         g.dispose();         //Why do we dispose that?
      } catch (Exception e) {
         System.out.println("Graphics context error: " + e);
      }
   }
 
   private void gameRender() {
      if (dbImage == null) { // second image for double buffer
         dbImage = createImage(PWIDTH, PHEIGHT);
         dbg = dbImage.getGraphics();
      }
      // Clear the screen
      dbg.setColor(Color.white);
      dbg.fillRect(0, 0, PWIDTH, PHEIGHT);
      // Draw all other stuff
      dbg.drawImage(dbImage, 0,0, this);
   }

   private void gameUpdate() {
      if (!gameOver) {
         // update game state if it is not over
      }
      // This is only a skeleton
   }
}


And this is a kind wish for who could read so far: Comment on the code - considering that it is obvious that it is not finished. Like, why it will cause problems etc.
Offline ClickerMonkey

JGO Coder


Medals: 20


Game Engineer


« Reply #1 - Posted 2013-03-23 05:45:12 »

I have a blog post on the game loop with a little engine that uses Java2D - check it out, hopefully it's helpful. It also does "active" rendering like you're trying to do above.

http://www.gameprogblog.com/generic-game-loop/

Offline kutucuk

Senior Devvie


Medals: 5
Exp: 3 years



« Reply #2 - Posted 2013-03-23 05:52:02 »

From the way you put active rendering, I guess it is not that active  Grin

I searched for days for a good explanation to these problems. Clicked every link on google... I guess your blog is new.

I'll read it and hopefully understand at least some parts of it Cheesy Thanks for the link.
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline Sparky83

Senior Devvie


Medals: 6
Projects: 1



« Reply #3 - Posted 2013-03-23 09:03:13 »

First of all: I think that you are doing the right thing, the way you try to learn everything and understand it as deeply as possible. Doing it like that you will be able to find your way through all this on your own very soon. It always takes a little while, but as you go further in learning you will get a better overview of what is going on. Smiley So, you are on the right path.

Now to your questions:
Quote
How much Java 2D should we know? I did not plan to ask this, but I saw some libgdx tutorials and image drawing was nothing like Java 2D.
That's right, libgdx uses OpenGL. With OpenGL, 2D graphics work very much different than Java2D. I mean, it is not from outer space and works with buffers full of pixel color and alpha definitions and all this, but you handle it all in a very different way. With OpenGL you can not like in Java2D simply say: "Hey, let's put an Image here!". It's more like this:
"Hmm, I'll set it up like this with all the right states and the ortho-perspective set up, then I have to load the image file and make a texture out of it. After that I need to create a quad out of four vertices to have a primitive to stick the texture on. This will make it possible to see it, if I have defined the vertices in the correct order or culling is off. And if the texture coordinates are alright, too."
This should explain it the way I have at first experienced it. When I went from Java2D to OpenGL I thought: "Will I ever get this thing working?" Eventually I did. But it took some time to learn. It was worth it.

The good part is: you could try to put all this OpenGL stuff in a shell and create an interface that works pretty much like Java2D if you want that. Or you could just use some library that does it for you.

Quote
The other reason of this question is that I am getting tired of Java 2D, not because it's slow etc., I still get very frustrating errors
Yeah, it is not easy. I had the same problems. Sometimes I asked myself: if I am not able to manage this, how will I ever be able to do some of the really complex things?
After experiencing this, I would say: take it slow, learn from your mistakes and errors. There can be some very nasty errors but you shouldn't give up. Even though you maybe won't need Java2D later, it is a good place to start (not everyone would agree).

Quote
I figured that if I keep staying on these two topics and don't go further, I'd get bored.
If that's the case, maybe you should try to go to more advanced topics or more fun ones. If you have problems motivating yourself to learn thoroughly, you will soon be stuck somewhere. This is mostly meant to be fun, so jump to any topic you think can handle (or handle to learn). And if you run into problems and think you need to take a step back, maybe it gives you some new motivation to learn the tough parts. Wink

Quote
Why did he use two methods to do the drawing? Is this correct?
And why do we dispose the g Graphics object?
You mean gameRender and paintScreen?
GameRender is there to render your visible game objects on your backBuffer. You know, doubleBuffering. After that the Image will be copied to the panel. It is faster copying a finished image than drawing many objects (with calculations between) directly on the panel. This is why you do that.

The reason for disposing the graphics object
1  
         g.dispose();         //Why do we dispose that?

is surely because of the JVM problem the book has mentioned. If you always tell your image to create a new graphics context every frame and don't dispose it, then you will end up with a lot of useless garbage in your memory, I think. For example BufferedImage will call createGraphics() when you call getGraphics(). So I think it literally always creates a new context. Disposing might be a good idea then.

Quote
There is a "period" variable (actually I don't know what it is) and he never defined it anywhere.
You know that you need a value to specify your desired frames per second. So if you want 60 fps, this means that every second your engine has to generate 60 images to display on the screen. This gives your engine about 16,67 milliseconds for every frame to update and render. And exactly THAT value is the period. The amount of time you give your gameloop to calculate a frame. (and sleep when work is done before time is up)

ActiveRendering in the context of Java2D means that you won't rely on the JVM to do the things when you want them to be done, btw. You just say: I will take care of this, instead of sticking it into the queue to be managed by the JVM.

I hope I can help you with this.
Offline StumpyStrust
« Reply #4 - Posted 2013-03-23 09:46:02 »

Bored? Ok. Make a particle engine. Instant visual feedback and it is what will make your game look super pro  Grin

Stuff in java2d is very similar to libgdx. Java2D does all the opengl stuff for you like when you do ImageIO.blablalbah and load an image, it creates the texture. When you say g.drawImage(blah) it binds the image, and renders it to a quad.

Libgdx is a little tough to get loading images if you have never down anything before but rendering is as easy as java2D.

Instead of g.draw it is batch.draw. You still call batch.begin and end much like you call to get the graphics and dispose of it. Big difference is that libgdx is 10x faster and lets you do more advanced thing as you learn. Try getting additive blending in java2D or even tinting images on the fly. Not going to happen. I think that if you are going to spend the time getting into all the tech for game making do NOT do it in java2D as you are learning things that become rather useless later on. At least the code is. If you really want to learn fun stuff, dive into opengl. Get a image to load. Put it on a quad. Put it on a triangle strip. Look into batching.

I got a rather fast java2D image going and it worked very well, but due to the horrible inconsistency and how hard it is to do anything more then sprite rendering I dropped it.

Right now you are going along the rendering a little wrong. Look into Bufferstrategy to do proper double buffering. You say you do calc after rendering? Should be update() render() update() render() etc. FPS is how many frames a sec. The 1000/60 is because you pass in the sleep time in milisec to the Thread.sleep(). 1000 milliseconds is 1 second. Java has horrid sleep accuracy so search up ways to get an actuate sleep time. (libgdx and opengl will do this for you)

I know this is said alot but stay away from java2D. I know there are a whole lot of tutorials for it out there but unless you are doing 4k, you are shooting yourself in the foot with it. If you are scared of opengl, try slick2D very much like java2D but not as hard to load images as libgdx.

Edit:
Here

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  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
public class Window extends JFrame {
   
   public static int mouseX = 0;
   public static int mouseY = 0;
   private static final long serialVersionUID = -803353570990972550L;
   private BufferStrategy bufferstrat = null;
   private Canvas render;
   private Graphics2D g2d = null;

   public Window( int width, int height, String title)
   {
      super();
      setTitle(title);
      setIgnoreRepaint(true);
      setResizable(false);
     
      render = new Canvas();
      render.setIgnoreRepaint(true);
      render.setFocusable(false);
      int nHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        int nWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        nHeight /= 2;
        nWidth /= 2;
        setBounds(nWidth-(width/2), nHeight-(height/2), width, height);
       
      render.setBounds(nWidth-(width/2), nHeight-(height/2), width, height);
     
      //this.setUndecorated(true);
      add(render);
      pack();
      setVisible(true);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
      render.createBufferStrategy(2);
      bufferstrat = render.getBufferStrategy();
      g2d = (Graphics2D) bufferstrat.getDrawGraphics();
   }
   
   public void render()
   {
      do{
         do{
                 g2d = (Graphics2D) bufferstrat.getDrawGraphics();
                 g2d.setClip(0, 0, getWidth(), getHeight());
                 g2d.setColor(Color.black);
                 g2d.fillRect(0, 0, getWidth(), getHeight());
                 //clearing screen above
                 //render stuff here by passing g2d around

                 g2d.dispose();
            }while(bufferstrat.contentsRestored());
             bufferstrat.show();
      }while(bufferstrat.contentsLost());
   }
   
   
}


Sorry for the long post but this basically will setup a window with everything being properly draw. Here is the unstripped version.
http://pastebin.java-gaming.org/793779a8b43
It basically abstracts all rendering junk away from you. If you look it is like opengl. Clear the screen, drawstuff, show buffer and swap to another. As long as all rendering is called between clearScrean() and render(), you are fine. This is basically how libgdx is but with opengl speed.

Offline Sparky83

Senior Devvie


Medals: 6
Projects: 1



« Reply #5 - Posted 2013-03-23 10:21:25 »

I know this is said alot but stay away from java2D. I know there are a whole lot of tutorials for it out there but unless you are doing 4k, you are shooting yourself in the foot with it.
I wouldn't say it this way. It is true that Java2D isn't of much use after switching to OpenGL. But learning game loops with Java2D is ok and you get a good idea of what working with images is like. And my problem always was, that I wanted to do the things myself because I wanted to learn. Java2D helped me a lot to get a good start. So it won't hurt to start with it and your feet will stay healthy, mine are.
And of course, I benefit from Java2D because it comes in handy when programming applications for my computer science course.
Offline kutucuk

Senior Devvie


Medals: 5
Exp: 3 years



« Reply #6 - Posted 2013-03-23 10:27:54 »

Let me say that I like the community here. People actually explain stuff instead of saying "You're wrong" and dumping the right code without explanation.

@Sparky83
Considering doing the right thing, I have decided to learn game loop as much as I can and leave Java 2D after figuring out basic things.
Let's be honest, even if you won't ever release a game, you'd want to learn stuff like libgdx instead of settling with Java2D.

So when I cover the basic Java 2D, I'll try to get my hands on libgdx. But it might take veeeeery long.

And about getting bored, I am not bored yet, but close to it. So while I am trying to learn these, I'll use a good template to experiment some fun stuff.

About using two methods to implement double buffering, I actually wanted to ask that could he not do that in one method? Or is he just 'simplifying' things?

Okay, I am about to pass another threshold (Does this sound normal in English?) about game loops. I guess I did not know how to calculate period until now.
So, is this the math behind FPS and the period in my code?

1 second/period(from my code example) = Desired FPS
So, it is actually ==> period = 1 sec/Desired FPS
Because 1 sec = 1000 ms it translates to;
period = 1000ms/Desired FPS
And if we wanted to calculate it in nanosecond;
period = 1000000ns/Desired FPS
Hence, period = time in which a single frame should be drawn



@StumpyStrust
Haha, I am not bored yet, but I am about to, if I cannot figure out these stuff. I am kinda obsessed.
I mean, dammit my old school uses my program to keep student information locally (Government gave app to do it online) and they have not complaint once (Maybe it might be working a little slow Tongue) but I cannot draw some images and move them?

When I add your comment on top of Sparky83's, I feel like I should just stop with Java 2D. But for the sake of learning mechanism and design of a simple game (hence at least dreaming of a complex one), I think I should stick with Java2D a little more. So, I'll look into BufferStrategy. Actually, expect a question soon Cheesy

I did not look at any OpenGL codes, but I read a tutorial for libgdx (Actually just glanced at the code). It looked fun and I guess it's based on OpenGL. So, maybe because I haven't tried anything yet, but it does not look scary for now.

I see Sparky83 posted another reply Cheesy And I think it supports my decision about Java2D Smiley

Thanks guys.

EDIT: And StumpyStrust edited his post Cheesy
Offline Sparky83

Senior Devvie


Medals: 6
Projects: 1



« Reply #7 - Posted 2013-03-23 10:39:58 »

Let me say that I like the community here. People actually explain stuff instead of saying "You're wrong" and dumping the right code without explanation.
It is great, isn't it. I like this site too. Smiley

Quote
Let's be honest, even if you won't ever release a game, you'd want to learn stuff like libgdx instead of settling with Java2D.
That is totally true.

Quote
Okay, I am about to pass another threshold (Does this sound normal in English?) about game loops. I guess I did not know how to calculate period until now.
So, is this the math behind FPS and the period in my code?
What would be your native language btw? Smiley Just curious.
It seems you know the trick with period now. But there is one mistake:

Quote
And if we wanted to calculate it in nanosecond;
period = 1000000ns/Desired FPS
It is: 1 sec = 1000 ms = 1.000.000 microsec = 1.000.000.000 nanosec
Your forgot the microseconds.

Quote
I see Sparky83 posted another reply Cheesy And I think it supports my decision about Java2D Smiley
This is a highly controversial topic around these forums. You could go on reading about it here:
http://www.java-gaming.org/topics/why-are-people-trying-to-use-java2d-to-make-games/28245/view.html
Offline Vermeer

JGO Coder


Medals: 16



« Reply #8 - Posted 2013-03-23 10:40:29 »

Hi

I don't know if this is any use to you, but this person made some good tutorials about getting a basic game engine going. It is just java 2d tho.

http://m.youtube.com/#/user/DesignsbyZephyr?&desktop_uri=%2Fuser%2FDesignsbyZephyr


Or search in YouTube for Designs by Zephyr

Offline kutucuk

Senior Devvie


Medals: 5
Exp: 3 years



« Reply #9 - Posted 2013-03-23 10:45:44 »

Thanks Vermeer. I'll look into it. Videos seem like they do not teach but make me memorize stuff, so not my first choice. But I'd be lying if I told I never used videos to learn something.

On the other hand, ClickerMonkey has a nice tutorial (http://www.gameprogblog.com/generic-game-loop/) he linked in the second post. I think I will have to translate into Turkish first, then try to read once again. It feels like this is one of the difficult stuff you should read in your own language. I'm gonna PM him if he is okay with it. Not planning to post it somewhere since I do not have a blog or website but still Smiley
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline kutucuk

Senior Devvie


Medals: 5
Exp: 3 years



« Reply #10 - Posted 2013-03-23 14:56:39 »

@StumpyStrust
Could you explain me what you are doing here:
1  
2  
3  
4  
5  
      int nHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        int nWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        nHeight /= 2;
        nWidth /= 2;
        setBounds(nWidth-(width/2), nHeight-(height/2), width, height);

Is this code prevent the graphic objects draw the borders of JFrame?

And is render.setFocusable(false) needed? Is it something you do to prevent canvas getting events and to let JPanel (Or any other class) worry about events?


@Sparky83
I didn't see your last post, I am sorry. I am from Turkey Smiley


That period variable (actually it turns out to be a constant, if I am trying to keep FPS same?) still bugs me. Now, since I read tons of tutorials but only got a little from them, I remember vaguely that I should pass it to the game updating methods, and use it with any time dependent jobs. Like moving an object (locationX += (velocityX + period) maybe?). But why?
Or was it completely something else?
Offline davedes
« Reply #11 - Posted 2013-03-23 16:09:42 »

Quote
Considering doing the right thing, I have decided to learn game loop as much as I can and leave Java 2D after figuring out basic things.
What's the point in learning a game loop and sync? As long as you understand the basic concept -- your render() method is being called N times per second, how to use the update(delta) method, etc -- then you will be fine. There is no need to waste your time struggling with BufferStrategy, GraphicsConfiguration, Thread.yield, etc.

The best use of your time is to skip "how to write the perfect game loop" and instead start learning how to develop games. For a beginner, using a library like LibGDX is generally a better idea than using LWJGL.

Offline HeroesGraveDev

JGO Kernel


Medals: 309
Projects: 11
Exp: 3 years


┬─┬ノ(ಠ_ಠノ)(╯°□°)╯︵ ┻━┻


« Reply #12 - Posted 2013-03-23 18:58:20 »

I'd say fixedstep loops are more convenient.

Variable timesteps are ridiculously hard to use when doing even simple physics.

Also, use System.nanoTime() instead of System.currentTimeMillis()

Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

rwatson462 (29 views)
2014-12-15 09:26:44

Mr.CodeIt (20 views)
2014-12-14 19:50:38

BurntPizza (40 views)
2014-12-09 22:41:13

BurntPizza (75 views)
2014-12-08 04:46:31

JscottyBieshaar (37 views)
2014-12-05 12:39:02

SHC (50 views)
2014-12-03 16:27:13

CopyableCougar4 (46 views)
2014-11-29 21:32:03

toopeicgaming1999 (113 views)
2014-11-26 15:22:04

toopeicgaming1999 (100 views)
2014-11-26 15:20:36

toopeicgaming1999 (30 views)
2014-11-26 15:20:08
Resources for WIP games
by kpars
2014-12-18 10:26:14

Understanding relations between setOrigin, setScale and setPosition in libGdx
by mbabuskov
2014-10-09 22:35:00

Definite guide to supporting multiple device resolutions on Android (2014)
by mbabuskov
2014-10-02 22:36:02

List of Learning Resources
by Longor1996
2014-08-16 10:40:00

List of Learning Resources
by SilverTiger
2014-08-05 19:33:27

Resources for WIP games
by CogWheelz
2014-08-01 16:20:17

Resources for WIP games
by CogWheelz
2014-08-01 16:19:50

List of Learning Resources
by SilverTiger
2014-07-31 16:29:50
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!