Java-Gaming.org Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (539)
Games in Android Showcase (132)
games submitted by our members
Games in WIP (603)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1] 2
  ignore  |  Print  
  ARGB Image, set all visible pixels to white  (Read 5667 times)
0 Members and 1 Guest are viewing this topic.
Offline Cero
« Posted 2009-07-08 13:22:45 »

I have a ARGB pic (PNG) and I want to set all pixels that are not transparent to white (255,255,255,255)

what is the fastest way performance wise ?

I think it might be something like

for loop
if (pic.getRGB(x,y) == transparent) pic.setRGB(0xFFFFFFFF);

but you do you even know if a pixel is transparent ?

if the first two bytes are > 0 ... ?

Offline Stranger

Senior Devvie


Medals: 9


I'm going slightly mad It finally happened


« Reply #1 - Posted 2009-07-08 14:07:25 »

If I'm not wrong:

aRGB is with an alpha channel (0xAARRGGBB). Alpha specifies the transparency of the pixel with 0x00 to be fully transparent and 0xff to be white background.

Anton
Offline TheMatrix154

Junior Devvie


Medals: 2



« Reply #2 - Posted 2009-07-08 14:48:09 »

Hi,
getRGBA returns an int value, you need to do some bitshifting. i've a blog entry here.

short story:
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  
private static int[] getARGB(int rgb) {
   int[] value = new int[4];

   // alpha
   value[0] = (rgb >> 24) & 0xFF;

   // red
   value[1] = (rgb >> 16) & 0xFF;

   // green
   value[2] = (rgb >> 8 ) & 0xFF;

   // blue
   value[3] = (rgb) & 0xFF;

   return value;
}

private static int getARGB(int a, int r, int g, int b) {
   int rgb = ((a & 0xFF) << 24) |
                   ((r & 0xFF) << 16) |
            ((g & 0xFF) << 8 )  |
            ((b & 0xFF));

   return rgb;
}


opaque: alpha value is 255
semi transparent: alpha value is > 0 && < 255
invisible: alpha value is 0

Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline Eli Delventhal

JGO Kernel


Medals: 42
Projects: 11
Exp: 10 years


Game Engineer


« Reply #3 - Posted 2009-07-08 17:19:30 »

Couldn't you just:

oldImage.getGraphics().setColor(Color.WHITE);
oldImage.getGraphics().fillRect(visibleX, visibleY, visibleW, visibleH);

See my work:
OTC Software
Offline Cero
« Reply #4 - Posted 2009-07-08 17:42:45 »

Quote
getRGBA returns an int value, you need to do some bitshifting. i've a blog entry here.
awesome thanks

Offline Cero
« Reply #5 - Posted 2009-07-08 17:45:49 »

Couldn't you just:

oldImage.getGraphics().setColor(Color.WHITE);
oldImage.getGraphics().fillRect(visibleX, visibleY, visibleW, visibleH);

how would I get the visible values and also this is a sprite with something on it, not a rect
and if I would do multiple rect in a loop, I might aswell use setRGB on pixels, which is also faster

Offline Eli Delventhal

JGO Kernel


Medals: 42
Projects: 11
Exp: 10 years


Game Engineer


« Reply #6 - Posted 2009-07-08 21:23:01 »

how would I get the visible values and also this is a sprite with something on it, not a rect
and if I would do multiple rect in a loop, I might aswell use setRGB on pixels, which is also faster
I guess I didn't understand what you're asking. To me, visible is pretty much always determined by a rect, because it's dependent upon screen/window size. That's why I was referring to rects.

See my work:
OTC Software
Offline Cero
« Reply #7 - Posted 2009-07-08 21:48:25 »

nah, was just talking about the background in a sprites frame ( png)

anyway works great

Offline swpalmer

JGO Coder


Exp: 12 years


Where's the Kaboom?


« Reply #8 - Posted 2009-07-09 03:15:10 »

If you already have an image using bit shifting and manual manipulation of RGBA values is definitely the wrong way to go.

Do what Demonpants suggested, just make sure you are using the correct Alpha Composite rule(s).  Then you may even get hardware acceleration.

Offline Cero
« Reply #9 - Posted 2009-07-09 07:45:22 »

Either you misunderstand what I wanted to do, or I have completely no idea how to use fillRect to do it



The purple background is of course transparent in the png, just to show you the boundaries I guess

I do that by

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  
picture = whiteOutImg(picture);

...

public BufferedImage whiteOutImg(BufferedImage in)
{
    BufferedImage out = in;

    for (int x = 0; x < (int)out.getWidth(); x++)
    {
        for (int y = 0; y < (int)out.getHeight(); y++)
        {
            if (getARGB(out.getRGB(x, y))[0] > 0) out.setRGB(x, y, 0xFFFFFFFF);
        }
    }

    return out;
}

private static int[] getARGB(int rgb)
{
    int[] value = new int[4];

    // alpha
    value[0] = (rgb >> 24) & 0xFF;

    // red
    value[1] = (rgb >> 16) & 0xFF;

    // green
    value[2] = (rgb >> 8 ) & 0xFF;

    // blue
    value[3] = (rgb) & 0xFF;

    return value;
}


Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline Cero
« Reply #10 - Posted 2009-07-09 08:20:44 »

I mean of course

1  
if (getARGB(out.getRGB(x, y))[0] >= 10) out.getGraphics().fillRect(x, y, 1, 1);


works too. But it's the exact amount of operations, so whats the point ?

and really really think that fillRect is slower than setRGB

I haven't tested it in realtime yet though

Online Riven
« League of Dukes »

« JGO Overlord »


Medals: 841
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #11 - Posted 2009-07-09 08:44:28 »

getRGB doesn't return alpha values, it's even in the name...

you need to access the AlphaRaster of the BufferedImage

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social
Offline TheMatrix154

Junior Devvie


Medals: 2



« Reply #12 - Posted 2009-07-09 09:17:53 »

i just build a simple test case. it's working as expected:
Quote
package test;

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

/**
 * Test.java
 *
 * Simple test case
 *
 * @author Robin Rowinski
 */
public class Test {

   public static void main(String[] args) throws Exception {
      BufferedImage image = ImageIO.read(new File("data/test.png"));
      int width = image.getWidth();
      int height = image.getHeight();
      
      System.out.println("Alpha values for input image:");
      for (int y = 0; y < height; y += 1) {
         for (int x = 0; x < width; x += 1) {
            if (x > 0) {
               System.out.print(",");
            }
            System.out.print(getARGB(image.getRGB(x, y))[0]);
         }
         System.out.println();
      }
      
      for (int y = 0; y < height; y += 1) {
         for (int x = 0; x < width; x += 1) {
            int alpha = getARGB(image.getRGB(x, y))[0];
            
            if (alpha != 0) {
               image.setRGB(x, y, 0xFFFFFFFF);
            }
         }
      }
      
      ImageIO.write(image, "png", new File("data/test_out.png"));
   }
   
   private static int[] getARGB(int rgb) {
      int[] value = new int[4];

      // alpha
      value[0] = (rgb >> 24) & 0xFF;

      // red
      value[1] = (rgb >> 16) & 0xFF;

      // green
      value[2] = (rgb >> 8 ) & 0xFF;

      // blue
      value[3] = (rgb) & 0xFF;

      return value;
   }

   private static int getARGB(int a, int r, int g, int b) {
      int rgb = ((a & 0xFF) << 24) |
                      ((r & 0xFF) << 16) |
               ((g & 0xFF) << 8 )  |
               ((b & 0xFF));

      return rgb;
   }
   
}

Images are attached.

BTW:
After warm-up of the VM my MBP needed 26 ms for processing a 256 x 256 x 32 image.

Edit:
Oh and i know, it's not java like but low level  Wink

Offline Cero
« Reply #13 - Posted 2009-07-09 09:39:34 »

ya, thanks for doing that =D
26 ms for processing a 256 x 256 x 32 image seems ok to me

I want to use this effect like when you do damage to an enemy, you know like the blink white, indicating that you do damage

so really, that should work

Quote
getRGB doesn't return alpha values

fortunately it does.

Offline Cero
« Reply #14 - Posted 2009-07-09 10:12:43 »

ya I just tested a 112x160x32 PNG

using setRGB, after warm up, it was 34ms

and using fillRect, 150-210ms

so thats clear.

Offline TheMatrix154

Junior Devvie


Medals: 2



« Reply #15 - Posted 2009-07-09 10:26:23 »

mhm,
for realtime effects i would use a premade image (could be loaded / generated into ram at start-up). cause it's faster to "draw an image" than "alter an image and draw an image".

Offline Cero
« Reply #16 - Posted 2009-07-09 10:30:27 »

mhm,
for realtime effects i would use a premade image (could be loaded / generated into ram at start-up). cause it's faster to "draw an image" than "alter an image and draw an image".

of course but for this specific effect its just not worth it
I mean an enemy has various animations and I really dont know before hand
so he just has to blink
and doing this once a frame should be ok

Offline Cero
« Reply #17 - Posted 2009-07-09 11:38:53 »

well turns out I was wrong

its fine when I do it like up to three times a frame

but with 10 or something like that performance drops a little

so... alternatives ? alphaRaster ? how does that work ?

Offline TheMatrix154

Junior Devvie


Medals: 2



« Reply #18 - Posted 2009-07-09 14:04:46 »

i don't know your implementation, but couldn't you just load the default spritesheet (animation and so on) and create a copy of that image on the fly with altered image data (white for alpha >= 10)? when rendering just switch between them as needed.

Offline Cero
« Reply #19 - Posted 2009-07-09 14:10:00 »

sure I could.
But consider this: A character in my game has now 166 sprites total

if I would load for every frame/sprite, for every enemy, a white image

thats double the memory I would need and an extraordinary waste, dont you think

especially when its just a little effect (blinking)

Online Riven
« League of Dukes »

« JGO Overlord »


Medals: 841
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #20 - Posted 2009-07-09 14:26:07 »

You're reading the image 1 pixel at a time.

buf.getRGB(x, y) is extremely slow.

And then, for every pixel, you're creating a int[4]... don't expect that to be fast.


The following code, does something different, but you can work from 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  
   public static void fade(BufferedImage image, float transparancy, BufferedImage trans)
   {
      if (image.getWidth() != trans.getWidth())
         throw new IllegalArgumentException();
      if (image.getHeight() != trans.getHeight())
         throw new IllegalArgumentException();

      int[] rgb = new int[trans.getWidth() * trans.getHeight()];
      int[] alpha = new int[rgb.length];

      image.getRGB(0, 0, trans.getWidth(), trans.getHeight(), rgb, 0, trans.getWidth());

      if (image.getTransparency() != Transparency.OPAQUE)
      {
         image.getAlphaRaster().getPixels(0, 0, trans.getWidth(), trans.getHeight(), alpha);
         for (int i = 0; i < alpha.length; i++)
            alpha[i] = (int) (alpha[i] * transparancy);
      }
      else
      {
         for (int i = 0; i < alpha.length; i++)
            alpha[i] = (int) (0xFF * transparancy);
      }

      trans.setRGB(0, 0, trans.getWidth(), trans.getHeight(), rgb, 0, trans.getWidth());
      trans.getAlphaRaster().setPixels(0, 0, trans.getWidth(), trans.getHeight(), alpha);
   }

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social
Offline Abuse

JGO Knight


Medals: 15


falling into the abyss of reality


« Reply #21 - Posted 2009-07-09 18:42:08 »

I believe the optimal solution when considering accelerated pipelines would be the following.

Use an intermediary VolatileImage that is as large as your largest sprite frame. (the VolatileImage will need to be either bitmask or full alpha, depending on the alpha depth of your sprites)

When you want to draw a sprite whited out, do the following.

a) Clear an area of the VolatileImage, equal to the size of your sprite frame, to opaque white (0xffffffff)
b) Draw your sprite frame onto the VolatileImage image using the DST_IN AlphaComposite rule. ( Alpha_result = A_dest * A_source ; Color_result = Color_dest * Alpha_source )
c) Draw the area of the VolatileImage, equal to the size of your sprite frame, to your screen buffer. (or whereever you were going to be drawing it)

So long as transparent/translucent VolatileImages are accelerated, and the DST_IN composite rule is accelerated, this solution should be blisteringly fast - many orders of magnitude faster than messing around with per-pixel, or altering the alpha raster manually.

Make Elite IV:Dangerous happen! Pledge your backing at KICKSTARTER here! https://dl.dropbox.com/u/54785909/EliteIVsmaller.png
Offline Cero
« Reply #22 - Posted 2009-07-09 20:56:08 »

So long as transparent/translucent VolatileImages are accelerated, and the DST_IN composite rule is accelerated, this solution should be blisteringly fast - many orders of magnitude faster than messing around with per-pixel, or altering the alpha raster manually.

Ya I ended up now with something like

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
int[] rgb = new int[out.getWidth() * out.getHeight()];
      int[] alpha = new int[rgb.length];

         out.getRGB(0, 0, out.getWidth(), out.getHeight(), rgb, 0, out.getWidth());

         out.getAlphaRaster().getPixels(0, 0, out.getWidth(), out.getHeight(), alpha);
            for (int i = 0; i < rgb.length; i++)
               rgb[i] = 0xFFFFFF;

         out.setRGB(0, 0, out.getWidth(), out.getHeight(), rgb, 0, out.getWidth());
         out.getAlphaRaster().setPixels(0, 0, out.getWidth(), out.getHeight(), alpha);


And its very slow =P
per pixel was better

1  
Draw your sprite frame onto the VolatileImage image using the DST_IN AlphaComposite rule.


Thats way over my head, I guess...
How do you draw an image using an AlphaComposite rule

Offline Abuse

JGO Knight


Medals: 15


falling into the abyss of reality


« Reply #23 - Posted 2009-07-09 21:47:10 »

Something like this should do it :-
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
// Idealy dst should be a Graphics context onto an accelerated surface i.e. a BufferStrategy
void drawWhiteSprite(Graphics dst, Sprite sprite, VolatileImage scratch) {

   // obviously this section will vary upon how you are storing and managing your sprite frames.
   final BufferedImage currentFrame = sprite.getCurrentFrame();
   final int spriteX = sprite.getX();
   final int spriteY = sprite.getY();
   final int spriteWidth = currentFrame.getWidth();
   final int spriteHeight = currentFrame.getHeight();


   Graphics2D scratchG2d = scratch.createGraphics();
   scratchG2d.setComposite(AlphaComposite.Src);
   scratchG2d.setColor(Color.WHITE);
   scratchG2d.fillRect(0,0,spriteWidth, spriteHeight);
   scratchG2d.setComposite(AlphaComposite.DstIn);
   scratchG2d.drawImage(currentFrame,0,0,null);
   scratchG2d.dispose();
   dst.drawImage(scratch,spriteX,spriteY, spriteX+spriteWidth, spriteY+spriteHeight, 0, 0, spriteWidth, spriteHeight,null);
}


note, I just typed that off the top of my head - so it almost certainly won't compile ;-)

Make Elite IV:Dangerous happen! Pledge your backing at KICKSTARTER here! https://dl.dropbox.com/u/54785909/EliteIVsmaller.png
Offline Cero
« Reply #24 - Posted 2009-07-10 08:54:16 »

brilliant, thank you

this is the code I ended up with

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
public VolatileImage whiteOut(BufferedImage in, GraphicsConfiguration gc)
   {
        VolatileImage out = gc.createCompatibleVolatileImage(in.getWidth(),in.getHeight(), in.getTransparency());

        out.setAccelerationPriority(1F);

         Graphics2D scratchG2d = out.createGraphics();
         scratchG2d.setComposite(AlphaComposite.Src);
         scratchG2d.setColor(Color.WHITE);
         scratchG2d.fillRect(0,0,(int)in.getWidth(), (int)in.getHeight());
         scratchG2d.setComposite(AlphaComposite.DstIn);
         scratchG2d.drawImage(in,0,0,null);
         scratchG2d.dispose();

         return out;
   }


well those volatileimages sure are unstable, after a time they sometimes vanish and stuff, but I guess thats ok, since Im using it for blinking anway
ans also its just a short effect, the unstable problems only occur after a while

Offline Abuse

JGO Knight


Medals: 15


falling into the abyss of reality


« Reply #25 - Posted 2009-07-10 09:48:43 »

It' be faster if you didn't recreate the VolatleImage image every time you want to draw it whited out; also, as you rightly point out VolatileImages can lose their contents at any time - so you should put the code that uses them in a while(!vi.contentsLost()) loop. (which would require you to restructure your code - as you would want to create your VolatileImage before entering the redraw loop)

I'd be intrigued to know what the performance of this solution is in the 3 possible acceleration scenarios - Fully accelerated(fast), no acceleration(slow[er then per-pixel?]), VI surface accelerated but not DST_IN op (slowest).

Sounds like the job for a J2D rendering benchmark :p

Make Elite IV:Dangerous happen! Pledge your backing at KICKSTARTER here! https://dl.dropbox.com/u/54785909/EliteIVsmaller.png
Offline Cero
« Reply #26 - Posted 2009-07-10 10:22:31 »

oh yeah, its beautiful now

maximum number of entities on screen and no reduction of performance

Offline swpalmer

JGO Coder


Exp: 12 years


Where's the Kaboom?


« Reply #27 - Posted 2009-07-11 21:46:03 »

Either you misunderstand what I wanted to do, or I have completely no idea how to use fillRect to do it



The purple background is of course transparent in the png, just to show you the boundaries I guess

I know exactly what you mean - and this is how to do it:

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  
package createmask;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 *
 * @author swpalmer(a)gmail.com
 */

public class Main {

    static File srcFile = new File("C:\\Users\\scott\\dev\\whiteout.png");
    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) throws IOException {
        final BufferedImage srcImg = ImageIO.read(srcFile);
        final BufferedImage outImg = whiteOutImg(srcImg);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                showMe(srcImg,outImg);
            }
        });
    }

    private static void showMe(final BufferedImage srcImg, final BufferedImage outImg) {
        JFrame frame = new JFrame("Creating a mask from a 32-bit image");
        JPanel panel = new JPanel();
        panel.setBackground(Color.MAGENTA);
        panel.add(new JLabel(new ImageIcon(srcImg)));
        panel.add(new JLabel(new ImageIcon(outImg)));
        frame.setContentPane(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private static BufferedImage whiteOutImg(BufferedImage srcImg) {
        BufferedImage outImg = new BufferedImage(srcImg.getWidth(), srcImg.getHeight(), BufferedImage.TYPE_INT_ARGB);

        Graphics2D g = outImg.createGraphics();
        g.setComposite(AlphaComposite.Src);
        g.drawImage(srcImg, 0, 0, null);
        g.setComposite(AlphaComposite.SrcIn);
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, outImg.getWidth(), outImg.getHeight());
        g.dispose();
        return outImg;
    }

}


Offline Cero
« Reply #28 - Posted 2009-07-14 06:49:34 »

Yeah, I already had it running smoothly, so thanks for the help, but I already did it like that, by now =D

Offline Cero
« Reply #29 - Posted 2010-10-21 09:44:55 »

Resurrecting an ooold thread here.

I am still using this technique, just a little different.
Whenever a enemy is hit, in my game, I want it to flash red. This is independent of the current sprite and should be able to be applied on all sprites.
Now, this red "overlay" then slowly loses its Alpha, becomes invisible.
You know... you hit an enemy its rather red, then it fades. Many games have similar effects.

So I wrote 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  
private void createBlinkImg(GraphicsConfiguration gc)
    {
        if (tryUsingVolatile)
        {
            vola = null;
            vola = gc.createCompatibleVolatileImage(visual[atmMotion].getImageFrame().getWidth(),visual[atmMotion].getImageFrame().getHeight(), VolatileImage.TRANSLUCENT);
            vola.setAccelerationPriority(1.0f);
            scratchG2d = vola.createGraphics();
            //scratchG2d = (Graphics2D)vola.getGraphics();
        }
        else
        {
            blinkImg = null;
            blinkImg = gc.createCompatibleImage(visual[atmMotion].getImageFrame().getWidth(),visual[atmMotion].getImageFrame().getHeight(), BufferedImage.TRANSLUCENT);
            blinkImg.setAccelerationPriority(1.0f);
            scratchG2d = blinkImg.createGraphics();
            //scratchG2d = (Graphics2D)blinkImg.getGraphics();
        }
        scratchG2d.setComposite(AlphaComposite.Src);
        scratchG2d.setColor(new Color(255,0,0,blinkedFrames));
        scratchG2d.fillRect(0,0,(int)visual[atmMotion].getImageFrame().getWidth(), (int)visual[atmMotion].getImageFrame().getHeight());
        scratchG2d.setComposite(AlphaComposite.DstIn);
        scratchG2d.drawImage(visual[atmMotion].getImageFrame(),0,0,null);
        scratchG2d.dispose();
        scratchG2d = null;
    }


If an enemy is actually hit, this method is run and the "blinkImg" or "vola" is drawn after the sprite, overlaying it.
The reason, the usage of the volatileimage is limited to an argument, is when using the DirectX rendering pipeline, volatileimages will often loose the contents and glitch up and eventually become white. This doesn't happen with the OpenGl pipeline and obviously never when using BufferedImage.

Problem is: This is rather slow if used a lot.
Like hitting multiple enemies on the screen, they all get the red fade, and every single frame, the red overlay has to be calculated new, because the alpha value changes (constantly drops, as mentioned).

This method is run for every sprite as long as the effect's alpha is not yet zero.

Any ideas how to make it faster ?

Pages: [1] 2
  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 (33 views)
2014-12-15 09:26:44

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

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

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

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

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

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

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

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

toopeicgaming1999 (32 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!