Java-Gaming.org Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (522)
Games in Android Showcase (127)
games submitted by our members
Games in WIP (589)
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  
  LWJGL: how to use procedurally generated BufferedImages  (Read 2763 times)
0 Members and 1 Guest are viewing this topic.
Offline philfrei
« Posted 2013-08-22 19:52:41 »

Big picture: I'm in the process of getting more acquainted with LWJGL. My hope is that by using it as a means of accessing OpenGL, I can improve the efficiency of my game's graphics, leaving more cpu available for audio processing.

Immediate question:
Most of my images are procedurally generated. So far, all the tools and tutorials I've run across for displaying images assumes that a resource originates from a file. Can someone point me to the operation, or a tutorial for using a Java BufferedImage as a starting point for a Texture? I'm assuming I just overlooked this, or haven't run across the right tutorial yet.

Thought occurs to me as I write: I recall reading about stippling lines, and that there is also 2D stippling. Is that the route one takes? In other words, should I look at converting my graphic data to stippling data format?

"It's after the end of the world! Don't you know that yet?"
Offline RobinB

JGO Ninja


Medals: 44
Projects: 1
Exp: 3 years


Spacegame in progress


« Reply #1 - Posted 2013-08-22 20:06:43 »

Its just a little function you need:
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  
  public static Texture getTexture(BufferedImage bufferedImage, int target, int dstPixelFormat, int minFilter, int magFilter, boolean mipmap) throws IOException 
    {
        int srcPixelFormat = 0;
       
        // create the texture ID for this texture
        int textureID = createTextureID();
        Texture texture = new Texture(target,textureID);
       
        // bind this texture
        GL11.glBindTexture(target, textureID);
 
        texture.setWidth(bufferedImage.getWidth());
        texture.setHeight(bufferedImage.getHeight());
       
        if (bufferedImage.getColorModel().hasAlpha()) {
            srcPixelFormat = GL11.GL_RGBA;
        } else {
            srcPixelFormat = GL11.GL_RGB;
        }

        // convert that image into a byte buffer of texture data
        ByteBuffer textureBuffer = convertImageData(bufferedImage,texture);
       
        if (target == GL11.GL_TEXTURE_2D)
        {
            GL11.glTexParameteri(target, GL11.GL_TEXTURE_MIN_FILTER, minFilter);
            GL11.glTexParameteri(target, GL11.GL_TEXTURE_MAG_FILTER, magFilter);
        }
 
        glTexImage2D(target, 0, dstPixelFormat, get2Fold(bufferedImage.getWidth()), get2Fold(bufferedImage.getHeight()), 0, srcPixelFormat, GL11.GL_UNSIGNED_BYTE, textureBuffer );
        if(mipmap){ glGenerateMipmap(GL_TEXTURE_2D); }
       
       
       
        textureBuffer.clear();
        textureBuffer = null;
        bufferedImage.flush();
        bufferedImage = null;
       
        return texture;
    }


By default you could use:
int target = GL11.GL_TEXTURE_2D;
int dstPixelFormat = GL11.GL_RGBA;
int minFilter = GL11.GL_LINEAR;
int magFilter = GL11.GL_LINEAR;
boolean mipmap = false;

Image to buffer:
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  
    public static MappedByteBuffer convertImageData(BufferedImage bufferedImage) {
        WritableRaster raster;
        BufferedImage texImage;
        int w = get2Fold(bufferedImage.getWidth());
        int h = get2Fold(bufferedImage.getHeight());
       
        if (bufferedImage.getColorModel().hasAlpha()) {
            raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,w,h,4,null);
            texImage = new BufferedImage(glAlphaColorModel,raster,false,null);
        } else {
            raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,w,h,3,null);
            texImage = new BufferedImage(glColorModel,raster,false,null);
        }
           
        // copy the source image into the produced image
        Graphics g = texImage.getGraphics();
        g.setColor(new Color(0f,0f,0f,0f));
        g.fillRect(0,0,w,h);
        g.drawImage(bufferedImage,0,0,null);
       
        // build a byte buffer from the temporary image
        // that be used by OpenGL to produce a texture.
        byte[] data = ((DataBufferByte) texImage.getRaster().getDataBuffer()).getData();
       
        MappedByteBuffer imageBuffer = (MappedByteBuffer)MappedByteBuffer.allocateDirect(data.length);
        imageBuffer.order(ByteOrder.nativeOrder());
        imageBuffer.put(data, 0, data.length);
        imageBuffer.flip();
           
        return imageBuffer;
    }


Power of 2 function:
1  
2  
3  
4  
5  
6  
7  
private static int get2Fold(int fold) {
        int ret = 2;
        while (ret < fold) {
            ret *= 2;
        }
        return ret;
    }

*its faster (very much) to skip the bufferedimage and write directly to a bytebuffer.
Offline davedes
« Reply #2 - Posted 2013-08-22 21:00:25 »

More info:
https://github.com/mattdesl/lwjgl-basics/wiki/Textures
https://github.com/mattdesl/lwjgl-basics/wiki/Java-NIO-Buffers

But if you're doing per-pixel operations in OpenGL you are probably better off working with shaders:
https://github.com/mattdesl/lwjgl-basics/wiki/Shaders

Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline philfrei
« Reply #3 - Posted 2013-08-22 21:27:55 »

@davedes - This is a cool tutorial, lots of great info in it! I've been making use of your Tutorials and of lwjgl-basics. Thanks for writing all this and making it available. It just wasn't aimed at this specific question, since that example loads a png instead of making use of an existing BufferedImage.

@RobinB - Awesome! It will take me a bit to make time and digest what you wrote, but I should be able to jump in and see what I can make of it before the weekend.

"It's after the end of the world! Don't you know that yet?"
Offline RobinB

JGO Ninja


Medals: 44
Projects: 1
Exp: 3 years


Spacegame in progress


« Reply #4 - Posted 2013-08-22 21:56:30 »

@davedes - This is a cool tutorial, lots of great info in it! I've been making use of your Tutorials and of lwjgl-basics. Thanks for writing all this and making it available. It just wasn't aimed at this specific question, since that example loads a png instead of making use of an existing BufferedImage.

@RobinB - Awesome! It will take me a bit to make time and digest what you wrote, but I should be able to jump in and see what I can make of it before the weekend.

Got it from the LWJGL demo and adjusted it a bit.
Just copy / paste for usage, and find out later what it does Cheesy
Offline philfrei
« Reply #5 - Posted 2013-08-23 05:32:36 »

@davedes -

Actually, I am having some troubles trying to run code from lwjgl-basic.

For example, from the tutorial you linked, there is code for class "Texture". I can see it in my Eclipse load of lwjgl-basic, in the package "mdesl.graphics".

It doesn't have a main(), but I can see where other classes in your project call it. From "mdesl.test" there is "RectTest.java". However, when I try to run RectTest, I get the following error:
1  
2  
Exception in thread "main" java.lang.RuntimeException: couldn't decode texture
   at mdesl.test.RectTest.create(RectTest.java:56)


The try/catch where this is thrown follows:
1  
2  
3  
4  
5  
6  
7  
8  
         fontTex = new Texture(Util.getResource("res/ptsans_00.png"), Texture.NEAREST);
         
         //in Photoshop, we included a small white box at the bottom right of our font sheet
         //we will use this to draw lines and rectangles within the same batch as our text
         rect = new TextureRegion(fontTex, fontTex.getWidth()-2, fontTex.getHeight()-2, 1, 1);
         
         font = new BitmapFont(Util.getResource("res/ptsans.fnt"), fontTex);
   


Perhaps there is a problem with the font? When I tried to run "FontTest.java" from the same package, I get this error:
1  
java.io.IOException: data for lineHeight is corrupt/missing: 


I don't know much about fonts, but here is what comes up when I do a text display of the font file you supply with the project (limited to first five lines):
1  
2  
3  
4  
5  
info face=PT Sans size=15 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=1,1
common lineHeight=21 base=16 scaleW=256 scaleH=256 pages=1 packed=0
page id=0 file=ptsans_00.png
chars count=338
char id=32 x=55 y=161 width=1 height=1 xoffset=-1 yoffset=15 xadvance=4 page=0 chnl=0


It looks to me like "lineHeight" is there in the font file.

Any thoughts? I can learn a lot from your tutorials regardless, but it is always reassuring to be able to get the code running.

"It's after the end of the world! Don't you know that yet?"
Offline philfrei
« Reply #6 - Posted 2013-08-23 05:42:39 »

@ RobinB , re:
Quote
Got it from the LWJGL demo and adjusted it a bit.

May I ask which LWJGL tutorial? So far, the only thing I've found with a reference to what seems to be one of the key functions (glTexImage2D) is the "Helper Libraries" section, last link:
http://www.lwjgl.org/wiki/index.php?title=Loading_PNG_images_with_TWL%27s_PNGDecoder

"It's after the end of the world! Don't you know that yet?"
Offline RobinB

JGO Ninja


Medals: 44
Projects: 1
Exp: 3 years


Spacegame in progress


« Reply #7 - Posted 2013-08-23 09:04:48 »

@ RobinB , re:
Quote
Got it from the LWJGL demo and adjusted it a bit.

May I ask which LWJGL tutorial? So far, the only thing I've found with a reference to what seems to be one of the key functions (glTexImage2D) is the "Helper Libraries" section, last link:
http://www.lwjgl.org/wiki/index.php?title=Loading_PNG_images_with_TWL%27s_PNGDecoder

Actually i have no clue, im using it so long now.
It could be from slick.
Offline davedes
« Reply #8 - Posted 2013-08-23 14:12:49 »

@davedes - This is a cool tutorial, lots of great info in it! I've been making use of your Tutorials and of lwjgl-basics. Thanks for writing all this and making it available. It just wasn't aimed at this specific question, since that example loads a png instead of making use of an existing BufferedImage.
Hopefully the knowledge from the tutorial will help you to upload generic byte data. There is no need for a BufferedImage (unless you also plan to display the image with Java2D). It just causes another step of copying pixel data.

Instead, you should upload the data directly to the texture as a ByteBuffer (or you can implement IntBuffer). lwjgl-basics includes a utility for this:
Texture.upload(int format, ByteBuffer data)


Here is a trivial example of using a software shader:
https://gist.github.com/mattdesl/6319787

Obviously it would perform many times faster if you were to use a hardware shader. Generally you should only be uploading pixel data per frame as a very last resort.

Quote
Perhaps there is a problem with the font? When I tried to run "FontTest.java" from the same package, I get this error:
Thanks for testing. I can't reproduce the error on my end here. Have you edited the file at all? Or opened it and maybe saved it by accident with a different charset/line endings?

That exception could be thrown, for example, if there is an empty line at the beginning of the file. (The font parser is not as robust as LibGDX or other frameworks.)

Offline philfrei
« Reply #9 - Posted 2013-08-23 18:40:18 »

I forked "lwjgl-basics" to my account in github, then cloned that to my c: (windows xp OS), then made the clone the source of the Eclipse project (Juno).

afaik, I didn't open up any files except in the context of eclipse, and certainly didn't edit any of the resources. All resources bear the same creation and modification date (presumably the clone time).

I looked at the .fnt file in Notepad, and there is no blank line at the start. The text is as I showed earlier.

I'll put a copy of the files I feel might be dubious on the following URL, if you want to check them for corruption.

http://www.hexara.com/lwjgl_basics_res/ptsans.fnt
http://www.hexara.com/lwjgl_basics_res/ptsans_00.png
http://www.hexara.com/lwjgl_basics_res/ptsans_00_atlas.png

I included the two .png files because they aren't 'normal' images. Maybe they are correct. Here's what displays for ptsans_00.png (hard to see the white chars over the grey background):


Are these files okay? If it is a matter of decoding the .fnt file correctly...Microsoft OS "properties" just says "Opens with: Unknown application" -- no info as to char encoding. Is there a setting in Eclipse I can report back to you on how the file is being read?

"It's after the end of the world! Don't you know that yet?"
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline davedes
« Reply #10 - Posted 2013-08-24 00:47:46 »

Not sure why it is happening, I will have to look into it. In the mean time, you don't need any fonts to work with procedural Textures (or shaders for that matter) so you can just run the tests that don't include bitmap fonts. Smiley

Offline philfrei
« Reply #11 - Posted 2013-08-24 01:01:54 »

@davedes -- Am curious what you uncover! I just did a test that confirms the crash is on the font, not the png's that come in the try--catch before the font call.

Unfortunately, my computer doesn't support shaders, so the program won't run anyway, even if we get the font file read. In fact, it seems all your tutorials and programs in lwjgl-basic require shaders. Dang. I won't be upgrading my graphics for a few months probably.

Meanwhile, just saw that the "red book" has a later chapter that discusses Images in some detail. That will hopefully give additional background that will help. Did a review of ByteBuffer today, too. I have a lot of background to fill in.

Onward...

"It's after the end of the world! Don't you know that yet?"
Offline davedes
« Reply #12 - Posted 2013-08-24 01:09:20 »

The code I posted is a "software shader" -- so it should work. It just changes byte data and uploads it to a texture every frame. Smiley It will at least get you introduced to the concept of fragment shaders -- i.e. per-pixel operations -- even though it isn't in GLSL.

Also, just curious what computer and GL version are you are running? Lwjgl-basics should be compatible with GL 2.0.

Offline philfrei
« Reply #13 - Posted 2013-08-24 02:37:31 »

The computer has two Pentium 4's running at 3.20 GHz, and 3GB RAM.
The Graphics is ATi Catalyst--Adapter: Radeon 7000 Series, says OpenGL version 6.14.10.5819. I don't know what that number means.

This all needs replacing--hopefully before the end of the year. The error message I get running "SpriteBatchTest" says the following:
1  
Exception in thread "main" org.lwjgl.LWJGLException: no shader support found; shaders require OpenGL 2.0

I wonder if I even have 1.5!?  Tongue

"It's after the end of the world! Don't you know that yet?"
Offline RobinB

JGO Ninja


Medals: 44
Projects: 1
Exp: 3 years


Spacegame in progress


« Reply #14 - Posted 2013-08-24 08:03:29 »

Easy to find out:

1  
2  
3  
        System.out.println("OpenGL version: " + glGetString(GL_SHADING_LANGUAGE_VERSION));
        System.out.println("GLSL version: " + glGetString(GL_VERSION));
        System.out.println("Graphic Card: " + glGetString(GL_RENDERER));


Place the code anywhere to print the info.

*add: "import static org.lwjgl.opengl.GL11.*;" as import
Offline davedes
« Reply #15 - Posted 2013-08-24 15:28:41 »

D'oh... of course my sprite batcher uses a shader. Tongue

Try this, it uses no shaders at all and should support GL 1.0:
https://gist.github.com/mattdesl/6328770

Also, have you tried LibGDX? This would allow you to use a GL 1.0 based engine, and later upgrade to 2.0 without significant changes to your game's codebase.

P.S. My test will print the GL version, so let us know what you see in the console. Smiley

Offline philfrei
« Reply #16 - Posted 2013-08-24 15:36:39 »

GLSL version: 1.3.1072 WinXP Release
Graphic Card: RADEON 7000 DDR x86/SSE2

I put RobinB's code in one of the NeHe Tutorials (#5, spinning 3D pyramid and cube).

I couldn't find an import to allow this line:
1  
System.out.println("OpenGL version: " + glGetString(GL_SHADING_LANGUAGE_VERSION));


Can't be late for work, gotta run.
Will be back at it late tonight.
Thanks!  Smiley

"It's after the end of the world! Don't you know that yet?"
Offline davedes
« Reply #17 - Posted 2013-08-24 17:39:31 »

Jesus.. GL 1.3 is 12 years old. Tongue Have you installed latest drivers? I think you need to upgrade if you plan on writing hardware-accelerated games.

You need to statically import GL20. That line might not work if you're running 1.3.

Offline ra4king

JGO Kernel


Medals: 355
Projects: 3
Exp: 5 years


I'm the King!


« Reply #18 - Posted 2013-08-24 19:24:41 »

That's the GLSL version. 1.3 = OpenGL 3.0 Smiley

Robin's code is wrong. Revised code:
1  
2  
3  
System.out.println("OpenGL version: " + glGetString(GL_VERSION));
System.out.println("GLSL version: " + glGetString(GL_SHADING_LANGUAGE_VERSION));
System.out.println("Vendor + Graphic Card: " + glGetString(GL_VENDOR) + " " + glGetString(GL_RENDERER));

Offline davedes
« Reply #19 - Posted 2013-08-24 20:39:22 »

Yeah.. if we was using Robin's code it means GL 1.3 a.k.a. no GLSL. Shocked

Offline RobinB

JGO Ninja


Medals: 44
Projects: 1
Exp: 3 years


Spacegame in progress


« Reply #20 - Posted 2013-08-24 20:54:46 »

Yeah.. if we was using Robin's code it means GL 1.3 a.k.a. no GLSL. Shocked

Sorry switched around some stuff Sad
Offline philfrei
« Reply #21 - Posted 2013-08-25 03:13:18 »

Which smiley icon do I use for embarrassed?

Here are the results of the diagnostic. Adding the static reference to GL20 got rid of the error on the reference to the GL_SHADING_LANGUAGE_VERSION. And yes, the text and reference now match up.

No shaders whatsoever.

1  
2  
3  
OpenGL version: 1.3.1072 WinXP Release
GLSL version: null
Vendor + Graphic Card: ATI Technologies Inc. RADEON 7000 DDR x86/SSE2


My old computer also seems to insist on ATI graphic cards. We tried putting in a PCI board, a GeForce something with OpenGL 4.2, and no go. The only ATI board for sale at the shop where I usually go was $120, and "only" supported OpengGL 3.2.

At the time, I decided not to get it, figuring I'd wait to get a wholly new computer rather than spend a significant fraction on a somewhat obsolete graphics board. But at that point, I didn't realize that I didn't even have OpenGL 2.1. So maybe I need to go back and get that or a similar board.

I was guessing that for a casual game aimed at PC desktops, implementing some graphics from the most widespread OpenGL would help deliver some extra cpu. But from davedes comments, I might as well just stick with Java2D, than try and implement what I have in a with nothing better than OpenGL 1.3.

Example of what I'd like to be able to do: I use lines/rectangles to draw a "pavilion" which includes a smoke effect, made from 40 procedurally generated graphics, each with a gradation of alpha, that get overlaid. With the scene change, using Java2D, I call the following code to fade the pavilion and smoke effects:

1  
2  
      Composite composite = g2.getComposite();
      g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, pavViz/255f));


"pavViz" goes from 255 maximum to 0 minimum which allows everything drawn in the block to fade to nothing.

If I can't do this in OpenGL except via shaders, then I either give up entirely on using OpenGL, for now, or I try to get up to the lowest common denominator that would allow this to be done somewhat efficiently. Am I correct in thinking that the minimum would be OpenGL 2.0?

I come back to OpenGL 2.0 as a reference, because of reading this link, on Minecraft stats on their Users:
http://www.java-gaming.org/topics/new-project-so-early-in-development-i-have-no-name-for-it/28032/msg/255212/view.html#msg255212

But if there is a way to get a boost over Java2D and be able to efficiently change the alpha component of graphics while using OpenGL  <= 1.3, then maybe I can deal with that, and be happy that the 9% users relying on "crap Intel cards" can also play the game.

(I understand the stats from that post are stale. But I don't know how far off the numbers are now. I suspect a significant number of those "crap Intel card owners" are buying into  mobile rather than upgrading their desktops.)

"It's after the end of the world! Don't you know that yet?"
Offline philfrei
« Reply #22 - Posted 2013-08-25 03:21:45 »

This tutorial works brilliantly! Dropped it into mdesl.test package and there was not one complaint or even suggestion from Eclipse.

Quote
Try this, it uses no shaders at all and should support GL 1.0:
https://gist.github.com/mattdesl/6328770

I'm going to take a closer look at the code...

"It's after the end of the world! Don't you know that yet?"
Offline philfrei
« Reply #23 - Posted 2013-08-26 01:22:43 »

Throwing in the towel on LWJGL for now. Am going to stick with Java2D.

I've just read some more about the newest versions of OpenGL, and the extent to which 'immediate mode' is considered obsolete.

It is hard enough to master all this "old style" stuff, without the disincentive of knowing that there will be yet another set of hurdles mastering the more current OpenGL. Better to come in when I'm ready to rock at the higher level.

Can't afford a new computer right now. Sad Am just going to see what I can do within the limits of Java2D.

"It's after the end of the world! Don't you know that yet?"
Offline davedes
« Reply #24 - Posted 2013-08-26 01:28:57 »

Seriously... why not give LibGDX a try like I said earlier? It should support GL10; and then you can upgrade your game to GLES20 later on with minimal changes to your code. You can still get down to the wire and learn about "raw OpenGL" if you fancy. And not only will it improve your performance, but it will allow your game to port to other platforms.

Look at it this way: For games, immediate mode has indeed been deprecated for years. But, realistically, Java2D was never even a contender. Wink So you are stepping backwards by choosing Java2D.

Also keep in mind that Minecraft was made with GL10, as well as other successful Java games like some of Puppy Game's earlier works (unless I'm mistaken).

Offline ra4king

JGO Kernel


Medals: 355
Projects: 3
Exp: 5 years


I'm the King!


« Reply #25 - Posted 2013-08-26 01:29:46 »

Awww that's sad to hear. The GL 3.2 card would have still been an excellent tool to learn modern OpenGL.

Oh well, maybe someday.

Offline philfrei
« Reply #26 - Posted 2013-08-26 06:15:34 »

Libgdx also has to wait for a new computer, I think. It really slowed down Eclipse drastically, to put in all the supporting functionality. A better computer wouldn't object as much. If I give it another try, I think I will first just try running it without ANY of the Android or HTML support, just the root project and the desktop version.

I really didn't enjoy my experience with Libgdx at all. I think it is an awesome achievement and a tremendous boon to the Java gaming community, but it also kind of set my teeth on edge. Personality thing, perhaps: I also wrote my own sound engine and procedural synthesizer rather than go with existing sound libraries. (This was before and about the same time that TinySound was made which actually seems pretty good to me.)

I liked the idea of LWJGL being a thin wrapper and that I'd be able to see what was going on that was so tough and strange about OpenGL. I thought since I was able to figure out and work with much of javax.sound.sampled, I'd be able to deal, but I think it is fair to say that OpenGL is a more difficult jump.

Yeah, maybe should have pulled the trigger on that ATI card with OpenGL 3.2. Will rethink that. I have some games that I can't play any more when I replaced the old failed card with the current cheapo. Big mistake.

Anyway, I'm going to let the bruises on my head heal and my thoughts clear for at least a few days--there's lots of other stuff to work on in the meantime.

Everyone that has been helping--keep up the great work, and thank you!!

"It's after the end of the world! Don't you know that yet?"
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.

xFryIx (62 views)
2014-11-13 12:34:49

digdugdiggy (41 views)
2014-11-12 21:11:50

digdugdiggy (34 views)
2014-11-12 21:10:15

digdugdiggy (30 views)
2014-11-12 21:09:33

kovacsa (52 views)
2014-11-07 19:57:14

TehJavaDev (56 views)
2014-11-03 22:04:50

BurntPizza (55 views)
2014-11-03 18:54:52

moogie (70 views)
2014-11-03 06:22:04

CopyableCougar4 (70 views)
2014-11-01 23:36:41

DarkCart (156 views)
2014-11-01 14:51:03
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

List of Learning Resources
by SilverTiger
2014-07-31 16:26:06
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!