Java-Gaming.org Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (523)
Games in Android Showcase (127)
games submitted by our members
Games in WIP (592)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
   Home   Help   Search   Login   Register   
  Show Posts
Pages: [1] 2 3 ... 7
1  Discussions / General Discussions / Re: The Facebook thread on: 2007-07-08 11:13:16
Joined Cheesy
2  Java Game APIs & Engines / Java Sound & OpenAL / Re: 8 kHz mono sound real-time implementation on: 2007-02-23 08:51:33
Disclaimer: I'm currently only testing on my (kind of crappy) workstation and not on the lab computer - thus the "soundcard" is of quite dubious quality.


I'm keeping it simple and doing a straightforward test currently:

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  
class DefaultLoudspeaker implements Loudspeaker, LineListener {
   protected static final AudioFormat PCM_FORMAT = new AudioFormat(8000,   /* Sample-rate */
                        16,     /* Bit-depth */
                        1,      /* Channels */
                        true,  /* Signed */
                        false); /* Big-endian */
   private SourceDataLine speaker;
   private Logger log;
   private int bufferSize;
   
   public DefaultLoudspeaker(String name, int bufferTimeInMillis) {
      log = Logger.getLogger(name);
      int frameSize = PCM_FORMAT.getFrameSize();
      float sampleRate = PCM_FORMAT.getSampleRate();
      this.bufferSize = (int) (frameSize * sampleRate * bufferTimeInMillis / 1000);
   }

   public void init() throws LineUnavailableException {
      speaker = AudioSystem.getSourceDataLine(PCM_FORMAT);
      speaker.addLineListener(this);
      speaker.open(PCM_FORMAT, bufferSize);
      speaker.start();
      log.info(this + ": Speaker is operational");
      log.info(this + ": Speaker level: " + speaker.getLevel());
      log.info(this + ": Speaker buffer-size: " + speaker.getBufferSize());
   }
   
        /**
    * Responsible for sending data to a loudspeaker.
    * @param data 8kHz sampled audio with 16 bits depth.
    */

   public void output8kHz16bit(byte[] data, int offset, int length) {
      speaker.write(data, offset, length);
   }

   public void update(LineEvent le) {
      log.info(le.toString());
   }

   public void close() {
      speaker.drain();
      speaker.close();
      speaker.removeLineListener(this);
                log.info(this + ": Speaker is closed");
   }
}


My initial conclusions is that the above code leads to an unusable speaker at buffer times <~ 500 ms. Is this result reasonable or do you think it's the poor quality of the soundcard that is solely responsible?

Test code:
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  
public class DefaultLoudspeakerUT {

   private AudioInputStream data;
   private File file = new File("H:/Code/Java/near_end.wav");
   private Loudspeaker speaker;
   
   @Before
   public void setUp() throws Exception {
      try {
         assertTrue(file.exists());
         data = AudioSystem.getAudioInputStream(file);
         speaker = new DefaultLoudspeaker("Magic speaker", 500);
         speaker.init();
      } catch (RuntimeException re) {
         re.printStackTrace();
         fail(re.getMessage());
      }
   }

   @After
   public void tearDown() throws Exception {
      data.close();
      speaker.close();
   }

   @Test
   public void testOutput8kHz16bit() {
      System.out.printf("Reading data formatted as: %s\n", data.getFormat().toString());
      try {
         System.out.printf("Data available: %d\n", data.available());
         byte[] buffer = new byte[160];
         int totalRead = 0;
         while (data.available() > 0) {
            int read = data.read(buffer);
            speaker.output8kHz16bit(buffer, 0, read);
            totalRead  += read;
         }
         System.out.printf("Data written: %d\n", totalRead);
      } catch (IOException e) {
         e.printStackTrace();
         fail(e.getMessage());
      }
   }

}


I've tried various sizes of buffer and buffer-delay

Thanks in advance
/Anders

EDIT:
java version "1.7.0-ea"
Java(TM) SE Runtime Environment (build 1.7.0-ea-b07)
Java HotSpot(TM) Client VM (build 1.7.0-ea-b07, mixed mode)

I've tried a few different versions, including "stable" 1.6 etc
3  Java Game APIs & Engines / Java Sound & OpenAL / Re: 8 kHz mono sound real-time implementation on: 2007-02-21 09:36:58
Yes, it's a research project and the network is a closed network with probably only 2-10 connected computers/hosts - at first there will only be a point-to-point connection (i.e. 2 computers, not a "network").

Modifying the data is unfortunately not an option, as that would kind of defeat the purpose. Perhaps ADPCM encoding, or equivalently, will be used later on - but that is only speculation from my part.

128 kb/s should not be a problem, neither ~ < 2000 packets/s (I guess)
4  Java Game APIs & Engines / Java Sound & OpenAL / 8 kHz mono sound real-time implementation on: 2007-02-21 08:51:56
Hello (my apologies if this post went to wrong sub-forum, not totally sure if my problems are networking or sound-api related),

I'm currently building a kind of real-time "echo-laboratory". I'm having a tough time making the part of my code using JavaSound + plain old sockets meet the requirements - e.g. buffer size of approximately 80 bytes when using a 8 kHz sample-rate (mono, i.e. 16-bit PCM).

What I try to achieve is basically:
"rec mic" + "network send" + "network receive" + "playback on loudspeaker" <= 20 ms latency (<10 ms if possible would be great!)*

So my questions to you guru's stalking  Shocked this forum are:
* Is the above scenario realistic to solve using java with decent hardware and networking support? My guess is yes, otherwise I wouldn't bother you guys - but still, if not...
* I'm currently using Source/Target-DataLine's from the JavaSound API and have trouble with small buffer size's (i.e. low latency requirement), is it my lack of understanding (hey, I just recently begun using the api Cheesy ) the api or should I consider alternative API's; if so, any suggestions?
* I'm currently using plain old sockets to do network communication (currently only "point-to-point"), and without any in-depth performance profiling that seems to work ok, i.e., mostly dependent on inherent network lags.

Thanks in advance

* Final architecture will use an "in-lab network" - network latency should not be a (big) problem (<< 10 ms round-trip).
5  Game Development / Newbie & Debugging Questions / Re: Making reconfigurable / rearrangeable GUIs on: 2006-09-14 18:50:08
Perhaps one of these will help: http://www.java2s.com/Product/Java/Swing/Docking.htm 

Have fun Smiley
6  Discussions / General Discussions / Re: Debian, meet Java - a new friendship, perhaps? on: 2006-05-22 18:26:07
For some, ahem, amusement - try the following thread:

http://lists.debian.org/debian-legal/2006/05/threads.html#00151

Crazy Roll Eyes
7  Discussions / General Discussions / Re: Sun To Make Java More Friendly? on: 2006-05-22 14:32:47
4+ web pages, on java.com? Strange, I thought java.com was there to make the install *easier* (choosing jre / jdk *sigh*).
8  Discussions / Miscellaneous Topics / Re: Sun left out something important from their libraries on: 2006-05-09 20:01:36
java.text.NumberFormat.getInstance().parse(string) ?
9  Game Development / Performance Tuning / Re: SSE / SSE2 - SIMD wrapper on: 2006-02-12 18:40:53
Sorry, no, I've got my hands full with finishing my final courses at university and at the same time trying to get a "thesis-job".
10  Game Development / Performance Tuning / Re: SSE / SSE2 - SIMD wrapper on: 2006-02-07 21:41:35
Regarding many parameters:
I believe the simd versions of math will only be relevant if the number of calculations is >> 1000 which seems to imply that even if you go crazy with number of extra checks you do at the java side / extra parameters you pass to native side, it will only have a slight impact on performance (and probably a big impact on increased usability!).

Hopefully all of this will soon (tm) become irrelevant, by the work of our sun jit-gods Wink. I agree though that it still could be a helpful library at the present time.
11  Game Development / Performance Tuning / Re: SSE / SSE2 - SIMD wrapper on: 2006-02-07 20:03:42
Hmm, I *think* that should be:
1  
2  
3  
*(pC+0) = *(pA+1) * ...
*(pC+1) = *(pA+2) * ...
*(pC+2) = *(pA+0) * ...


I.e. IIRC the dereferencing operator * have higher priority than + (disclaimer: I've only read a course in uni, never done any real work in c/c++)

EDIT: I really see no added benefit (only "trouble" Smiley ) by passing direct pointers instead of direct bytebuffers - as the buffers should have adequate performance (and, I believe LWJGL now uses only direct bytebuffers as well).

EDIT2: I.e. you could use limit()/capacity()/etc at the java-side and still send bytebuffers + extra integer "size" parameters and not bother with using a pointer Smiley
12  Game Development / Performance Tuning / Re: SSE / SSE2 - SIMD wrapper on: 2006-02-06 16:41:41
Simple benchmark - regular disclaimers about benchmark implementation, coding misstakes etc. apply Smiley

Code implements vector multiplication A = A*B for 4*1024*1024 length vectors A and B populated with randomly distributed floats [0,100).
First numbers is with float arrays, second with (direct) FloatBuffers and third is a native implementation (direct bytebuffers used to transfer data).
"Well..." don't really serve any purpose except possibly preventing the number crunching process from being optimized away (?).

java version:
java version "1.6.0-rc"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.6.0-rc-b68)
Java HotSpot(TM) Client VM (build 1.6.0-rc-b68, mixed mode, sharing)

gcc version:
gcc (GCC) 3.4.5 (Gentoo 3.4.5, ssp-3.4.5-1.0, pie-8.7.9)

command used to compile shared library:
1  
gcc -pipe -msse -march=pentium4 -O3 simd_SimdTest.c -o libtestsimd.so -shared -ljvm -lverify -lnet -ljava -lnio -I/opt/sun-jdk-1.6.0/include -I/opt/sun-jdk-1.6.0/include/linux -L/opt/sun-jdk-1.6.0/jre/lib/i386 -L/opt/sun-jdk-1.6.0/jre/lib/i386/client -Wl,-soname,libtestsimd.so -lc  -fPIC  -D_REENTRANT  -W -Wall -Wno-unused -Wno-parentheses -Werror 



1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
<snip>
Well...:                        7412,38965.
Array calc took 34631 us.
Well...:                        4627,65234.
Array calc took 35024 us.
Well...:                        1983,89075.
Array calc took 34717 us.
<snip>
Well...:                        578,43506.
Buffer calc took 34490 us.
Well...:                        5744,37891.
Buffer calc took 34895 us.
Well...:                        3716,52808.
Buffer calc took 33800 us.
<snip>
Well...:                        1946,09839.
SIMD calc took 12619 us.
Well...:                        657,79602.
SIMD calc took 12674 us.
Well...:                        3669,88257.
SIMD calc took 12666 us.


Java:
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  
package simd;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;

public class SimdTest {
   private static final int ITERS = 10;
   private static final int SIZE = 4*1024*1024;
    private static float[] dataA = new float[SIZE];
   private static float[] dataB = new float[SIZE];

   private static FloatBuffer bufferA = ByteBuffer.allocateDirect(SIZE*4).
                               order(ByteOrder.nativeOrder()).
                               asFloatBuffer();
   private static FloatBuffer bufferB = ByteBuffer.allocateDirect(SIZE*4).
                                 order(ByteOrder.nativeOrder()).
                                 asFloatBuffer();
   
   public static void main(String[] args) {
     
        // Test ARRAY based
        int random = (int) (SIZE*Math.random());
        for (int i = 0; i < ITERS; i++) {
         initArrays();
         long before = System.nanoTime();
         calcArrays();
         long after = System.nanoTime();
            System.out.printf("Well...:\t\t\t%4.5f.\n", dataA[random]);
         long diffInMs = (after - before) / 1000;
         System.out.printf("Array calc took %d us.\n", diffInMs);
      }
     
        // Test BUFFER based
      for (int i = 0; i < ITERS; i++) {
         initBuffers();
         long before = System.nanoTime();
         calcBuffers();
         long after = System.nanoTime();
            System.out.printf("Well...:\t\t\t%4.5f.\n", bufferA.get(random));
         long diffInMs = (after - before) / 1000;
         System.out.printf("Buffer calc took %d us.\n", diffInMs);
      }
     
        // Test SIMD based
        System.loadLibrary("testsimd");
        for (int i = 0; i < ITERS; i++) {
         initBuffers();
         long before = System.nanoTime();
         calcSIMD(bufferA, bufferB);
         long after = System.nanoTime();
         System.out.printf("Well...:\t\t\t%4.5f.\n", bufferA.get(random));
         long diffInMs = (after - before) / 1000;
         System.out.printf("SIMD calc took %d us.\n", diffInMs);
      }
   }

   private static void calcArrays() {
      for (int i = 0; i < SIZE; i++) {
         dataA[i] = dataA[i]*dataB[i];
      }
   }

   private static void calcBuffers() {
      for (int i = 0; i < SIZE; i++) {
         bufferA.put(i, bufferA.get(i)*bufferB.get(i));
      }
   }

   private static native void calcSIMD(FloatBuffer bufferA, FloatBuffer bufferB);
   
   private static void initArrays() {
      for (int i=0; i < SIZE; i++) {
            dataA[i] = (float) (Math.random() * 100);
            dataB[i] = (float) (Math.random() * 100);
      }
    }

   private static void initBuffers() {
      for (int i=0; i < SIZE; i++) {
            bufferA.put(i, (float) (Math.random() * 100));
            bufferB.put(i, (float) (Math.random() * 100));
      }
   }
}


C header:
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class simd_SimdTest */

#ifndef _Included_simd_SimdTest
#define _Included_simd_SimdTest
#ifdef __cplusplus
extern "C" {
#endif
#undef simd_SimdTest_SIZE
#define simd_SimdTest_SIZE 409600L
/*
 * Class:     simd_SimdTest
 * Method:    calcSIMD
 * Signature: (Ljava/nio/DoubleBuffer;Ljava/nio/DoubleBuffer;)V
 */

JNIEXPORT void JNICALL Java_simd_SimdTest_calcSIMD
  (JNIEnv *, jclass, jobject, jobject);

#ifdef __cplusplus
}
#endif
#endif


C-impl:
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  
#include <jni.h>
#include <stdio.h>
#include "simd_SimdTest.h"

//typedef float v4sf __attribute__ ((mode(V4SF)));

JNIEXPORT void JNICALL Java_simd_SimdTest_calcSIMD(JNIEnv *env, jclass cls, jobject ba, jobject bb)
{
    /*
    // Float vectors of size 4
    v4sf a;
    v4sf b;
    v4sf result;
    */

   
    float* bufferA = (float*) (*env)->GetDirectBufferAddress(env, ba);
    int sizeA = (*env)->GetDirectBufferCapacity(env, ba);
    float* bufferB = (float*) (*env)->GetDirectBufferAddress(env, bb);
   
    // assumes buffers is equal in size.
    int i = 0;
    for (; i < sizeA; i++) // i += 4
    {
        *bufferA = (*bufferA) * (*bufferB);
        bufferA++; bufferB++;
       
        /*
        // GCC 3.4 compiles above to same speed as the more
        // verbose version below.
       
        // Loads 4 floats from adress bufferA
        a = __builtin_ia32_loadups(bufferA);
        b = __builtin_ia32_loadups(bufferB);
        // a * b
        result = __builtin_ia32_mulps (a, b);   
        //Stores 4 floats at  adress bufferA
        __builtin_ia32_storeups(bufferA, result);
        bufferA = bufferA + 4;
        bufferB = bufferB + 4;
        */

    }
   
}
13  Game Development / Performance Tuning / Re: Bound's checks and struct's on: 2005-10-22 15:54:25
hear, hear Wink
14  Game Development / Performance Tuning / Re: Bound's checks and struct's on: 2005-10-22 11:10:58
http://lwjgl.org/forum/viewtopic.php?t=955

15  Games Center / Featured Games / Re: Wurm Online on: 2005-06-19 22:19:37
I get a 404 on the GLSLvalidate thing. =/
It seems like the most useful one of the two, as the other one just emulates nvidia cards.

The link works now.
16  Games Center / Featured Games / Re: Wurm Online on: 2005-06-13 15:42:13
*sob* That is just so, so, so beautiful Sad

Notch, have you tried any of these two programs, http://developer.nvidia.com/object/nvemulate.html and http://developer.3dlabs.com/downloads/glslvalidate/index.htm ?

That water is just to good to be ruined by bad ati drivers *sob* Sad
17  Games Center / Featured Games / Re: Wurm Online on: 2005-06-12 14:06:41
PBuffer inited
----------------
Link warnings for /programs/water.vertex.shader + /programs/water.fragment.shader
----------------
Link successful. The GLSL vertex shader will run in hardware. The GLSL fragment shader will run in hardware.
----------------

edit: no reflections btw
18  Games Center / Featured Games / Re: Wurm Online on: 2005-06-12 12:28:38
Yes, I think so, but no reflections?
19  Games Center / Featured Games / Re: Wurm Online on: 2005-06-12 00:10:44
Dunno what I've done wrong, probably drivers. But this update looks , ahem, "very colorful" on my ati x850 with newest official catalyst drivers?
20  Games Center / Archived Projects / Re: Finally got the bumpmapping shader to work! Must.. share.. screenshot! on: 2005-06-08 22:24:05
NICE  Grin

And... wurmonline looks a lot better on my new shiny ati 850xt pe graphics card compared to my old geforce2 mx too, bring on the shader magic  Wink
21  Discussions / Miscellaneous Topics / Re: I've taken on Intelligent Systems(AI) subject. on: 2005-06-03 10:39:02
Basically what you need (if you haven't got it already Wink is a good grasp of high level logics. Beginning with first order logics and moving on to fluent based approaches etc etc.

When/If you've got that the importants principles of AI can, probably, be understood without any book with tons of "text-per-concept" - google is your friend. I.e. when you have no problems with mathematical logic, the reason behind ramification problems etc. stop being difficult to understand/solve and you can move on to grasping the motivations behind different techniques used to develop AI systems today.
22  Game Development / Newbie & Debugging Questions / Re: Java creation of Temporary files on: 2004-07-31 13:58:37
?? chmod ??

Maybe I'm way off here  Grin
23  Game Development / Shared Code / Re: Automatic Version Identifier on: 2004-07-16 14:26:12
Quote
This should work with both Applets and WebStart applications (off the top of my head... haven't actually tested:)):
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
      public String getAppVersion(Class cls) throws IOException {
            String classFile = cls.getName().replaceAll("\\.", "/") + ".class";
            //System.out.println("class file:" + classFile);
            URL classLocation = cls.getResource(classFile);
            //System.out.println("class location: " + classLocation);            
            JarFile jarFile = ((JarURLConnection)classLocation.openConnection()).getJarFile();
            Manifest mf = jarFile.getManifest();
            String appVersion = mf.getMainAttributes().getValue(Attributes.Name.SPECIFICATION_VERSION);
            //System.out.println("application version: " + appVersion);
           
            return appVersion;
      }



Even better, if using ant/other automatic build system, is IMO:
1  
2  
3  
4  
5  
public String getAppVersion(Class clazz) {
    Package p = clazz.getPackage();
    // or is it p.getImplementationVersion()?
    return (p == null) ? null : p.getSpecificationVersion();
}


Haven't tested in applets, works in webstart though IIRC
24  Game Development / Networking & Multiplayer / Re: java 1.1 compatiable 3d engine? on: 2004-07-03 08:18:24
Quote

It must be compatiable with the Microsoft 1.1 VM


...and also compatible with dos/win 3.1 I guess?  Wink
25  Games Center / Java Technology Game Development Contest - 2004 / Re: NewsFlash - Winner on: 2004-06-29 17:53:38
Congratulations Cas!  Grin
26  Discussions / General Discussions / Re: Open sourcing Java and its effect in games on: 2004-06-08 15:04:33
Btw, if anyone is interested:
http://www.opensource.org/docs/definition.php
27  Discussions / General Discussions / Re: Dev-Diaries @ JGF on: 2004-06-08 13:10:01
Ban frames are the way to go! Shocked

Using float style css instead is the solution, if people insist on having long unreadable pages (split them up!! Wink

Quote

(dividing it up onto 30 pages just to prevent scrolling is not a solution from a UI/HCI POV  ).

IMNSHO I would claim the opposite (depending on the situation of course - but generally I believe most people prefer short bits of information with clear navigation/location information instead of enourmous mountain-sized pages)
28  Games Center / Archived Projects / Re: Hallucinogenesis alpha test on: 2004-05-31 14:14:57
a, Works great! Athlon 900mhz, geforce 2mx, gentoo linux (nvidia 5?.?? driver)
b, Couldn't notice any slowdowns/pauses/anything non-smooth Wink in my ~5 minutes of playing.
c, Yep Smiley
29  Game Development / Networking & Multiplayer / Re: GUID creation? on: 2004-05-14 11:00:02
Coming in 1.5:
java.util.UUID : http://java.sun.com/j2se/1.5.0/docs/api/java/util/UUID.html
30  Game Development / Game Play & Game Design / Re: I need some help with the controls :( on: 2004-05-04 11:29:39
Works on linux and my computer too ( Roll Eyes )

Likes the z+x+mouse version best - even though pressing z or x IMO rotates the ship to much (minimum of ~45 deg. - I guess about 10-15 would be great instead)

Also a possible bug: in angry pumpkin my ship and the pumpkin got lost "out of screen"?
Pages: [1] 2 3 ... 7
 

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

The first screenshot will be displayed as a thumbnail.

Gibbo3771 (12 views)
2014-11-24 19:59:16

trollwarrior1 (35 views)
2014-11-22 12:13:56

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

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

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

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

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

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

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

moogie (83 views)
2014-11-03 06:22:04
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!