Jump to content
  • Advertisement

Chaoslab

Member
  • Content Count

    102
  • Joined

  • Last visited

Community Reputation

116 Neutral

About Chaoslab

  • Rank
    Member
  1. I have to ask why I you making this so complicated? I would of done it like this, could be placed in its own class. final int numStars = 30; double starX[] = new double [numStars]; double starX[] = new double [numStars]; All you need to do is when a star passes of the side of you place it on the other side with a random y and like wise for sides the leave the top / bottom of the screen. link lists for something as simple as this is overkill, kind of like shooting an ant with a cannon and is much more efficient CPU wise. And you could even add color as well! Just some ideas.... :-)
  2. I think there is some java script you can call to set the input focus on a page so that could be the place to start :-)
  3. Chaoslab

    hidden surface removal question

    Quote:Original post by magneeto should i use a plane equation Ax+By+Cz=D or surface normals to determine visibility?? i'm not very familiar with the plane equation method. if i try to break my cube into having 12 triangles for six faces then for the visibility of a face do i need to consider both the triangles or just one? which one is better -- calculating normals for triangles or solving the plane equation?? Ass long as the Polygon is flat you only need to use the first 3 points of the polgon to check if the surface is visible (as per the code I posted). :-)
  4. Chaoslab

    hidden surface removal question

    Convex hidden surface removal is quite easy. All your surface points must be in clockwise (or anti clockwise, cant remember) in order for this to work. ax = point 1 x ay = point 1 y bx = point 2 x by = point 2 y cx = point 3 x cy = point 3 y if((bx - ax) * (cy - ay) - (by - ay) * (cx - ax) > 0) { // draw surface yada yda } else { // surface hidden } This little code snippet come all the way with me from my Amiga coding days.... :-)
  5. Also don't used a syncronized list class if you don't have to. ArrayList is allot faster than Vector because vector is syncronzied. :-)
  6. Chaoslab

    [java] Writing to a file

    Applets cannot write to files as they run from a sand box. From what you have described I suggest you look into a server side solution as applets can get and post things to the server they are served from.
  7. Java compiler - JDK 1.5 IDES - Eclipse - Code Slayer - my own custom IDE with visual code modelling and auto generation of infrastrure solutions in DB / XML / XSD / Raw. :-)
  8. I wrote my own GUI / Event model from scratch as I had real time requirements that swing and awt could not satisfy. But such is the nature of game programming. It isn't that hard really if you put in a bit of research and design before hand. :-)
  9. Chaoslab

    [java] Fullscreen in Linux

    Try looking for a command in linux that changes (and hopefully restores) desktop / screen resoution and make that part of your shell script to run the game. It is a real pain that this problem is still around and has been so for quite a few years.
  10. nasty evil disclaimer made me triple post....
  11. nasty evil disclaimer made me double post....
  12. Code your own IDE.... I wrote my own IDE called CodeSlayer about a year and a half ago and in the process created a whole new GUI and Image processing API which toasts swing as far as game development is concerned and the modeled inside Code Slayer and persistance as nice readable XML.... CS also autogenerates all of the infrastructure code for my data modelling and merges it into existing source. One of the main reasons I did it was the fact that I could port all of my gui and interfacer code to another lang if required later on (as a fall back to C# if so required) :-)
  13. Chaoslab

    The GIF's in C++

    Sorted
  14. Chaoslab

    The GIF's in C++

    Heres one in java.... Hope it helps /** GifEncoder - writes out an image as a GIF. */ import java.awt.*; import java.io.*; import java.awt.image.*; import java.util.*; public class GifEncoder { private boolean interlace = false; private int width, height; private byte[] pixels; private byte[] r, g, b; // the color look-up table private int pixelIndex; private int numPixels; /** Constructs a new GifEncoder for gif data file * * @param width The image width. * @param height The image height. * @param pixels The pixel data. * */ public GifEncoder(int width, int height, byte pixels[]) { this.width = width; this.height = height; this.pixels = pixels; r = new byte[256]; g = new byte[256]; b = new byte[256]; interlace = false; pixelIndex = 0; numPixels = width * height; for(int i = 0; i < 256; i++) r = g = b = (byte) i; } /** Constructs a new GifEncoder. * * @param width The image width. * @param height The image height. * @param pixels The pixel data. * @param r The red look-up table. * @param g The green look-up table. * @param b The blue look-up table. */ public GifEncoder(int width, int height, byte[] pixels, byte[] r, byte[] g, byte[] b) { this.width = width; this.height = height; this.pixels = pixels; this.r = r; this.g = g; this.b = b; interlace = false; pixelIndex = 0; numPixels = width*height; } /** Constructs a new GifEncoder using an 8-bit AWT Image. * The image is assumed to be fully loaded. */ public GifEncoder(Image img) { width = img.getWidth(null); height = img.getHeight(null); pixels = new byte[width * height]; PixelGrabber pg = new PixelGrabber(img, 0, 0, width, height, false); try { pg.grabPixels(); } catch (InterruptedException e) { System.err.println(e); }; ColorModel cm = pg.getColorModel(); if (cm instanceof IndexColorModel) pixels = (byte[])(pg.getPixels()); else throw new IllegalArgumentException("Image must be 8-bit"); IndexColorModel m = (IndexColorModel)cm; int mapSize = m.getMapSize(); r = new byte[mapSize]; g = new byte[mapSize]; b = new byte[mapSize]; m.getReds(r); m.getGreens(g); m.getBlues(b); interlace = false; pixelIndex = 0; numPixels = width*height; } /** Saves the image as a GIF file. */ public void write(OutputStream out) throws IOException { // Figure out how many bits to use. int numColors = r.length; int BitsPerPixel; if (numColors<=2) BitsPerPixel = 1; else if (numColors<=4) BitsPerPixel = 2; else if (numColors<=16) BitsPerPixel = 4; else BitsPerPixel = 8; int ColorMapSize = 1 << BitsPerPixel; byte[] reds = new byte[ColorMapSize]; byte[] grns = new byte[ColorMapSize]; byte[] blus = new byte[ColorMapSize]; for (int i=0; i<numColors; i++) { reds = r; grns = g; blus = b; } GIFEncode(out, width, height, interlace, (byte) 0, -1, BitsPerPixel, reds, grns, blus); } static void writeString( OutputStream out, String str ) throws IOException { int len = str.length(); byte[] buf = new byte[len]; str.getBytes( 0, len, buf, 0 ); out.write( buf ); } // Adapted from ppmtogif, which is based on GIFENCOD by David // Rowley <mgardi@watdscu.waterloo.edu>. Lempel-Zim compression // based on "compress". int Width, Height; boolean Interlace; void GIFEncode (OutputStream outs, int Width, int Height, boolean Interlace, byte Background, int Transparent, int BitsPerPixel, byte[] Red, byte[] Green, byte[] Blue) throws IOException { byte B; int LeftOfs, TopOfs; int ColorMapSize; int InitCodeSize; int i; this.Width = Width; this.Height = Height; this.Interlace = Interlace; ColorMapSize = 1 << BitsPerPixel; LeftOfs = TopOfs = 0; // The initial code size if(BitsPerPixel <= 1) InitCodeSize = 2; else InitCodeSize = BitsPerPixel; // Write the Magic header writeString(outs, "GIF89a"); // Write out the screen width and height Putword( Width, outs ); Putword( Height, outs ); // Indicate that there is a global colour map B = (byte) 0x80; // Yes, there is a color map // OR in the resolution B |= (byte) ( ( 8 - 1 ) << 4 ); // Not sorted // OR in the Bits per Pixel B |= (byte) ( ( BitsPerPixel - 1 ) ); // Write it out Putbyte( B, outs ); // Write out the Background colour Putbyte( Background, outs ); // Pixel aspect ratio - 1:1. // Putbyte( (byte) 49, outs ); // Java's GIF reader currently has a bug, if the aspect ratio byte is // not zero it throws an ImageFormatException. It doesn't know that // 49 means a 1:1 aspect ratio. Well, whatever, zero works with all // the other decoders I've tried so it probably doesn't hurt. Putbyte( (byte) 0, outs ); // Write out the Global Colour Map for (i = 0; i < ColorMapSize; ++i) { Putbyte( Red, outs ); Putbyte( Green, outs ); Putbyte( Blue, outs ); } // Write out extension for transparent colour index, if necessary. if (Transparent != -1) { Putbyte( (byte) '!', outs ); Putbyte( (byte) 0xf9, outs ); Putbyte( (byte) 4, outs ); Putbyte( (byte) 1, outs ); Putbyte( (byte) 0, outs ); Putbyte( (byte) 0, outs ); Putbyte( (byte) Transparent, outs ); Putbyte( (byte) 0, outs ); } // Write an Image separator Putbyte( (byte) ',', outs ); // Write the Image header Putword( LeftOfs, outs ); Putword( TopOfs, outs ); Putword( Width, outs ); Putword( Height, outs ); // Write out whether or not the image is interlaced if (Interlace) Putbyte( (byte) 0x40, outs ); else Putbyte( (byte) 0x00, outs ); // Write out the initial code size Putbyte((byte) InitCodeSize, outs); // Go and actually compress the data compress(InitCodeSize+1, outs); // Write out a Zero-length packet (to end the series) Putbyte((byte) 0, outs); // Write the GIF file terminator Putbyte((byte) ';', outs); } static final int EOF = -1; // Return the next pixel from the image int GIFNextPixel() throws IOException { if (pixelIndex==numPixels) return EOF; else return ((byte[])pixels)[pixelIndex++] & 0xff; } // Write out a word to the GIF file void Putword( int w, OutputStream outs ) throws IOException { Putbyte( (byte) ( w & 0xff ), outs ); Putbyte( (byte) ( ( w >> 8 ) & 0xff ), outs ); } // Write out a byte to the GIF file void Putbyte( byte b, OutputStream outs ) throws IOException { outs.write( b ); } // GIFCOMPR.C - GIF Image compression routines // // Lempel-Ziv compression based on 'compress'. GIF modifications by // David Rowley (mgardi@watdcsu.waterloo.edu) // General DEFINEs static final int BITS = 12; static final int HSIZE = 5003; // 80% occupancy // GIF Image compression - modified 'compress' // // Based on: compress.c - File compression ala IEEE Computer, June 1984. // // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas) // Jim McKie (decvax!mcvax!jim) // Steve Davies (decvax!vax135!petsd!peora!srd) // Ken Turkowski (decvax!decwrl!turtlevax!ken) // James A. Woods (decvax!ihnp4!ames!jaw) // Joe Orost (decvax!vax135!petsd!joe) int n_bits; // number of bits/code int maxbits = BITS; // user settable max # bits/code int maxcode; // maximum code, given n_bits int maxmaxcode = 1 << BITS; // should NEVER generate this code final int MAXCODE( int n_bits ) { return ( 1 << n_bits ) - 1; } int[] htab = new int[HSIZE]; int[] codetab = new int[HSIZE]; int hsize = HSIZE; // for dynamic table sizing int free_ent = 0; // first unused entry // block compression parameters -- after all codes are used up, // and compression rate changes, start over. boolean clear_flg = false; // Algorithm: use open addressing double hashing (no chaining) on the // prefix code / next character combination. We do a variant of Knuth's // algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime // secondary probe. Here, the modular division first probe is gives way // to a faster exclusive-or manipulation. Also do block compression with // an adaptive reset, whereby the code table is cleared when the compression // ratio decreases, but after the table fills. The variable-length output // codes are re-sized at this point, and a special CLEAR code is generated // for the decompressor. Late addition: construct the table according to // file size for noticeable speed improvement on small files. Please direct // questions about this implementation to ames!jaw. int g_init_bits; int ClearCode; int EOFCode; void compress( int init_bits, OutputStream outs ) throws IOException { int fcode; int i /* = 0 */; int c; int ent; int disp; int hsize_reg; int hshift; // Set up the globals: g_init_bits - initial number of bits g_init_bits = init_bits; // Set up the necessary values clear_flg = false; n_bits = g_init_bits; maxcode = MAXCODE( n_bits ); ClearCode = 1 << ( init_bits - 1 ); EOFCode = ClearCode + 1; free_ent = ClearCode + 2; char_init(); ent = GIFNextPixel(); hshift = 0; for ( fcode = hsize; fcode < 65536; fcode *= 2 ) ++hshift; hshift = 8 - hshift; // set hash code range bound hsize_reg = hsize; cl_hash( hsize_reg ); // clear hash table output( ClearCode, outs ); outer_loop: while ( (c = GIFNextPixel()) != EOF ) { fcode = ( c << maxbits ) + ent; i = ( c << hshift ) ^ ent; // xor hashing if ( htab == fcode ) { ent = codetab; continue; } else if ( htab >= 0 ) // non-empty slot { disp = hsize_reg - i; // secondary hash (after G. Knott) if ( i == 0 ) disp = 1; do { if ( (i -= disp) < 0 ) i += hsize_reg; if ( htab == fcode ) { ent = codetab; continue outer_loop; } } while ( htab >= 0 ); } output( ent, outs ); ent = c; if ( free_ent < maxmaxcode ) { codetab = free_ent++; // code -> hashtable htab = fcode; } else cl_block( outs ); } // Put out the final code. output( ent, outs ); output( EOFCode, outs ); } // output // // Output the given code. // Inputs: // code: A n_bits-bit integer. If == -1, then EOF. This assumes // that n_bits =< wordsize - 1. // Outputs: // Outputs code to the file. // Assumptions: // Chars are 8 bits long. // Algorithm: // Maintain a BITS character long buffer (so that 8 codes will // fit in it exactly). Use the VAX insv instruction to insert each // code in turn. When the buffer fills up empty it and start over. int cur_accum = 0; int cur_bits = 0; int masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF }; void output( int code, OutputStream outs ) throws IOException { cur_accum &= masks[cur_bits]; if ( cur_bits > 0 ) cur_accum |= ( code << cur_bits ); else cur_accum = code; cur_bits += n_bits; while ( cur_bits >= 8 ) { char_out( (byte) ( cur_accum & 0xff ), outs ); cur_accum >>= 8; cur_bits -= 8; } // If the next entry is going to be too big for the code size, // then increase it, if possible. if ( free_ent > maxcode || clear_flg ) { if ( clear_flg ) { maxcode = MAXCODE(n_bits = g_init_bits); clear_flg = false; } else { ++n_bits; if ( n_bits == maxbits ) maxcode = maxmaxcode; else maxcode = MAXCODE(n_bits); } } if ( code == EOFCode ) { // At EOF, write the rest of the buffer. while ( cur_bits > 0 ) { char_out( (byte) ( cur_accum & 0xff ), outs ); cur_accum >>= 8; cur_bits -= 8; } flush_char( outs ); } } // Clear out the hash table // table clear for block compress void cl_block( OutputStream outs ) throws IOException { cl_hash( hsize ); free_ent = ClearCode + 2; clear_flg = true; output( ClearCode, outs ); } // reset code table void cl_hash( int hsize ) { for ( int i = 0; i < hsize; ++i ) htab = -1; } // GIF Specific routines // Number of characters so far in this 'packet' int a_count; // Set up the 'byte output' routine void char_init() { a_count = 0; } // Define the storage for the packet accumulator byte[] accum = new byte[256]; // Add a character to the end of the current packet, and if it is 254 // characters, flush the packet to disk. void char_out( byte c, OutputStream outs ) throws IOException { accum[a_count++] = c; if ( a_count >= 254 ) flush_char( outs ); } // Flush the packet to disk, and reset the accumulator void flush_char( OutputStream outs ) throws IOException { if ( a_count > 0 ) { outs.write( a_count ); outs.write( accum, 0, a_count ); a_count = 0; } } } class GifEncoderHashitem { public int rgb; public int count; public int index; public boolean isTransparent; public GifEncoderHashitem(int rgb, int count, int index, boolean isTransparent) { this.rgb = rgb; this.count = count; this.index = index; this.isTransparent = isTransparent; } } It could do with a bit of optimisation too.... :-) [Edited by - Chaoslab on July 24, 2004 2:49:21 AM]
  15. Chaoslab

    Fill Triangle routine

    Here's my triangle solution // screen pixels and size vars int data[]; int xsize; int ysize; /** fill triangle */ public void fill_triangle(int xi1, int yi1, int xi2, int yi2, int xi3, int yi3, int color) { double x0 = xi1; double x1 = xi2; double x2 = xi3; double y0 = yi1; double y1 = yi2; double y2 = yi3; double d0 = 0; double d1 = 0; double d2 = 0; double dx0 = 0; double dx1 = 0; double dx2 = 0; double dy0 = 0; double dy1 = 0; double dy2 = 0; //double dx[] = {0,0,0}; double dy[] = {0,0,0}; double d[] = {0,0,0}; double dt; int i; if(y1 < y0) { dt = y0; y0 = y1; y1 = dt; dt = x0; x0 = x1; x1 = dt;} if(y2 < y1) { dt = y1; y1 = y2; y2 = dt; dt = x1; x1 = x2; x2 = dt;} if(y2 < y0) { dt = y0; y0 = y2; y2 = dt; dt = x0; x0 = x2; x2 = dt;} dx0 = x1 - x0; dy0 = y1 - y0; dx1 = x2 - x1; dy1 = y2 - y1; dx2 = x0 - x2; dy2 = y0 - y2; if(dy0 != 0) d0 = dx0 / dy0; else d0 = 0; if(dy1 != 0) d1 = dx1 / dy1; else d1 = 0; if(dy2 != 0) d2 = dx2 / dy2; else d2 = 0; int sx,ex; double id; qplot_color = color; for(i = (int) y0; i < y1; i++) { id = (double) i; sx = (int) (x0 + ((id - y0) * d2)); ex = (int) (x0 + ((id - y0) * d0)); if(sx < ex) qscan(sx,i,ex - sx); else qscan(ex,i,sx - ex); } for(i = (int) y1; i < y2; i++) { sx = (int) (x0 + ((i - y0) * d2)); ex = (int) (x1 + ((i - y1) * d1)); if(sx < ex) qscan(sx,i,ex - sx); else qscan(ex,i,sx - ex); } } /** private quick scan * * @param x x * @param y y * @param size size of scan * */ private void qscan(int x, int y, int size) { // clip y if(y > 0 && y < ysize && x < xsize) { // clip left hand side of scan if(x < 0) { size += x; x = 0; } y = y * xsize + x; if(x + size < xsize) x = y + size; else x = y + size - (x + size - xsize); for(; y < x; y++) data[y] = qplot_color; } }
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!