View Single Post
Old 09-05-2012, 10:44 PM   #1
twobob
( ͡° ͜ʖ ͡°){ʇlnɐɟ ƃǝs}Týr
twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.twobob ought to be getting tired of karma fortunes by now.
 
twobob's Avatar
 
Posts: 6,586
Karma: 6299991
Join Date: Jun 2012
Location: uti gratia usura (Yao ying da ying; Mo ying da yieng)
Device: PW-WIFI|K5-3G+WIFI| K4|K3-3G|DXG|K2| Rooted Nook Touch
Post F-Zero 4K, code ported, now it needs dumbing down. WIP...

Starter for 10

I've done most of it.

Just need to chunk it up into bitesize pieces

"Sod it, aim high" I thought, for a practice run...

Can we get a procedural world to render... Pfft dunno. maybe

I am certain we can get ONE FRAME to render and get a base rate however we have to shiv it together...

Project here.

http://www.meatfighter.com/j4k2009/fzero/

Currently the answer is "No" to the real time Java awesomeness on the kindle..

But the code below compiles and is amended to run on the kindle by yours truly, it's my second ever kindlet so err... could be a few gaffs

Also if only we could run native drivers... just ditch the graphics link to rootContainer and pipe it into a native c graphics driver... or hijack the input/output somehow They are just crazy thoughts but feel free to say "Oh yeah good idea, I know a thread about just that!"

Refs

http://docs.oracle.com/javase/1.4.2/...ng/JFrame.html (for the other ports in the wings too)

http://docs.oracle.com/javase/1.4.2/...s-noframe.html

http://docs.oracle.com/javame/config...s-noframe.html

https://kdk-javadocs.s3.amazonaws.co...s-noframe.html

http://www.meatfighter.com/j4k2009/f...rc20090117.zip

Lgpl license
Spoiler:

Code:
/*
 * F-Zero 4K
 * Copyright (C) 2009 Michael Birken
 *
 * This file is part of F-Zero 4K.
 *
 * F-Zero 4K is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * F-Zero 4K is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package com.twobob.kindle.fork;

import java.awt.image.*;
import java.awt.Color;

import java.awt.Container;
import java.awt.Font;

import java.awt.Graphics;

import com.amazon.kindle.kindlet.AbstractKindlet;
import com.amazon.kindle.kindlet.KindletContext;
import com.amazon.kindle.kindlet.event.KindleKeyCodes;
import com.amazon.kindle.kindlet.ui.KTextArea;

/**
 * @author simon
 * 
 */
public class ForK extends AbstractKindlet {

	private Container rootContainer;
	private KindletContext ctx;

	private Font titleFont = new Font("Arial", Font.BOLD, 48); // default font
																// for splash
																// screens
	private Font subtitleFont = new Font("Arial", Font.BOLD, 20); // default
																	// font for
																	// scores

	boolean[] K = new boolean[65535]; // pressed keys

	final double VIEWER_X = 159.5;
	final double VIEWER_Y = 32;
	final double VIEWER_Z = -128;
	final double GROUND_Y = 207;

	final int[] screenBuffer = new int[320 * 240];
	final int[][][] projectionMap = new int[192][320][2];
	final int[][][] wiresBitmap = new int[32][256][256];
	final int[][][] bitmaps = new int[6][32][32];
	final byte[][] raceTrack = new byte[512][512];
	// -1 = space
	// 0 = road
	// 1 = barrier
	// 2 = power
	// 3 = white circle
	// 4 = dark road
	// 5 = checkered road
	double playerAngle = 0;
	final double[][] vehicleMetrics = new double[10][9];
	// 0 = x, 1 = y
	// 2 = stunned velocity x, 3 = stunned velocity y
	// 4 = projected x, 5 = projected z
	// 6 = velocity magnitude
	// 7 = vx, 8 = vy
	final int[] powerOvalY = new int[2];
	boolean onPowerBar = false;
	boolean playing = false;

	final BufferedImage[] vehicleSprites = new BufferedImage[10];
	final int[] vehicleSpriteData = new int[64 * 32];
	double power = 0;
	final Color powerColor = new Color(0xFABEF1);
	final Color darkColor = new Color(0xA7000000, true);
	int wiresBitmapIndex = 0;
	double cos = 0;
	double sin = 0;
	int hitWallCount = 0;
	int rank = 0;
	int paused = 1;

	public void create(KindletContext context) {
		this.ctx = context;
		rootContainer = context.getRootContainer();

		rootContainer.setFocusTraversalKeysEnabled(false);

		// For later maybe

		// KindletUIResources uiRes = context.getUIResources();

		rootContainer.validate();
		rootContainer.setVisible(true);
		rootContainer.repaint();

	}

	public void start() {
		try {

			ctx.getRootContainer().add(
					new KTextArea("Insert Miners4Kindle Here"));

			powerOvalY[0] = -96;

			long nextFrameStart = 999999L;
			long rawtime = System.currentTimeMillis();

			// -- GENERATE WIRES BITMAP BEGIN
			// ----------------------------------------------

			for (int i = 0; i < 32; i++) {
				for (double t = 0; t < 2.0 * Math.PI; t += 0.001) {
					int X = 128 + (int) ((256 + 64 * Math.cos(t * 3.0)) * Math
							.sin(t));
					int Y = 128 + (int) ((256 + 64 * Math.sin(t * 3.0)) * Math
							.cos(t));
					int color = C(t + i * Math.PI / 16.0, 1, 1);
					for (int y = 0; y < 16; y++) {
						for (int x = 0; x < 16; x++) {
							wiresBitmap[i][0xFF & (Y + y)][0xFF & (X + x)] = color;
						}
					}
				}
			}

			// -- GENERATE WIRES BITMAP END
			// ------------------------------------------------

			// -- GENERATE VEHICLE SPRITES BEGIN
			// -------------------------------------------

			for (int spriteIndex = 0; spriteIndex < 10; spriteIndex++) {
				vehicleSprites[spriteIndex] = new BufferedImage(64, 32,
						BufferedImage.TYPE_INT_ARGB_PRE);
				for (int y = 0, k = 0; y < 32; y++) {
					for (int x = 0; x < 64; x++, k++) {
						double dx = (x - 32.0) / 2, dy = y - 26;
						double dist1 = dx * dx + dy * dy;
						dx = (x - 31.5) / 2;
						dy = y - 15.5;
						double dist2 = dx * dx + dy * dy;
						dy = y - 17.5;
						dx = x - 32;
						double dist3 = dx * dx + dy * dy;
						if (Math.abs(dist3 - 320) <= 24
								|| Math.abs(dist3 - 480) <= 24) {
							vehicleSpriteData[k] = C(Math.PI * spriteIndex
									/ 1.9, dist1 / 256, 1) | 0xff000000;
						} else if (dist2 > 256) {
							vehicleSpriteData[k] = 0;
						} else {
							vehicleSpriteData[k] = C(Math.PI * spriteIndex
									/ 1.9, dist1 / 256, dist1 / 1024 + 1) | 0xff000000;
						}
					}
				}
				for (int x = 14; x < 49; x++) {
					for (int y = 21; y < 27; y++) {
						vehicleSpriteData[(y << 6) | x] = y == 21 || y == 26
								|| (x & 1) == 0 ? 0xFFCCCCCC : 0xFF000000;
					}
				}
				for (int y = 0; y < 16; y++) {
					for (int x = 0; x < 16; x++) {
						double dx = x - 7.5;
						double dy = y - 7.5;
						double dy2 = dy / 1.5;
						double dist = dx * dx + dy * dy;
						if (dx * dx + dy2 * dy2 < 64) {
							dy = y - 4;
							vehicleSpriteData[(y << 6) | (x + 24)] = C(3,
									dist / 256,
									y > 6 && x > 3 && x < 12 || y > 7
											|| dx * dx + dy * dy < 8 ? 2 : 1) | 0xff000000;
						}
						if (dist < 64 || y == 0) {
							vehicleSpriteData[((16 + y) << 6) | (x + 48)] = vehicleSpriteData[((16 + y) << 6)
									| x] = C(Math.PI * spriteIndex / 1.9,
									dist / 64, 1) | 0xff000000;
						}
					}
				}
				vehicleSprites[spriteIndex].setRGB(0, 0, 64, 32,
						vehicleSpriteData, 0, 64);
			}

			// -- GENERATE VEHICLE SPRITES BEGIN
			// -------------------------------------------

			// -- GENERATE RACE TRACK BEGIN
			// ------------------------------------------------

			for (int y = 0; y < 512; y++) {
				for (int x = 0; x < 512; x++) {
					raceTrack[y][x] = -1;
				}
			}

			for (int y = 0; y < 128; y++) {
				for (int x = 246; x < 261; x++) {
					raceTrack[y][x] = 0;
				}
			}

			for (int y = 32; y < 96; y++) {
				for (int x = 239; x < 246; x++) {
					raceTrack[y][x] = (byte) ((x < 244 && y > 33 && y < 94) ? 2
							: 0);
				}
			}

			for (int y = 128; y < 512; y++) {
				for (int x = 243; x < 264; x++) {
					double angle = y * Math.PI / 64;
					raceTrack[y][x
							+ (int) ((8 * Math.cos(angle) + 24) * Math
									.sin(angle))] = 0;
				}
			}

			for (int y = 0; y < 512; y++) {
				for (int x = 0; x < 512; x++) {
					if (raceTrack[y][x] >= 0) {
						for (int i = -1; i < 2; i++) {
							for (int j = -1; j < 2; j++) {
								if (raceTrack[0x1FF & (i + y)][0x1FF & (j + x)] == -1) {
									raceTrack[y][x] = 1;
								}
							}
						}
					}
				}
			}

			// -- GENERATE RACE TRACK END
			// --------------------------------------------------

			// -- GENERATE BITMAPS BEGIN
			// --------------------------------------------

			for (int y = 0; y < 32; y++) {
				for (int x = 0; x < 32; x++) {
					double dx = 15.5 - x;
					double dy = 15.5 - y;
					double dist = Math.sqrt(dx * dx + dy * dy);
					bitmaps[0][y][x] = 0xFF98A8A8;
					bitmaps[4][y][x] = 0xFF90A0A0;
					bitmaps[5][y][x] = (((x >> 3) + (y >> 3)) & 1) == 0 ? 0xFF000000
							: 0xFFFFFFFF;
					bitmaps[2][y][x] = C(4.5, Math.abs(dy) / 16, 1);
					if (dist < 16) {
						bitmaps[3][y][x] = 0xFFFFFFFF;
						bitmaps[1][y][x] = C(5.3, dist / 16, 1 + dist / 256);
					} else {
						bitmaps[3][y][x] = bitmaps[1][y][x] = 0xFF98A8A8;
					}
				}
			}

			// -- GENERATE BITMAPS END
			// -----------------------------------------------------

			// -- COMPUTE PROJECTION MAP BEGIN
			// ---------------------------------------------

			for (int y = 0; y < 192; y++) {
				for (int x = 0; x < 320; x++) {
					double k = (GROUND_Y - VIEWER_Y) / (48 + y - VIEWER_Y);
					projectionMap[y][x][0] = (int) (k * (x - VIEWER_X) + VIEWER_X);
					projectionMap[y][x][1] = (int) (VIEWER_Z * (1 - k));
				}
			}

			// -- COMPUTE PROJECTION MAP END
			// -----------------------------------------------

			/*
			 * 
			 * DO THINGS:
			 */

			BufferedImage image = new BufferedImage(320, 240,
					BufferedImage.TYPE_INT_RGB);
			Graphics imageGraphics = image.getGraphics();

			// Fixed up

			Font largeFont = titleFont;

			// Fixed up from nanoTime

			/*
			 * 
			 * An integer modulus by n will always result in a remainder with
			 * the upper limit of n - 1. – we should use this going forward not
			 * this kludge *
			 */

			// our granularity is tragic

			nextFrameStart = (System.currentTimeMillis() - rawtime) * 1000000;
			rawtime = System.currentTimeMillis();
			while (true) {
				do {
					// -- UPDATE MODEL BEGIN
					// -------------------------------------------------------

					// rotate the background colors
					wiresBitmapIndex = 0x1F & (wiresBitmapIndex + 1);

					if (paused > 0) {
						paused--;
						if (paused == 0) {
							for (int i = 0; i < 10; i++) {
								for (int j = 0; j < 9; j++) {
									vehicleMetrics[i][j] = 0;
								}
							}
							for (int i = 0; i < 4; i++) {
								vehicleMetrics[i][0] = 7984 + i * 80;
							}
							for (int i = 4; i < 10; i += 3) {
								vehicleMetrics[i][0] = 7984;
								vehicleMetrics[i][1] = 16384 * (i - 3);
								vehicleMetrics[i + 1][0] = 8144;
								vehicleMetrics[i + 1][1] = vehicleMetrics[i][1] + 2048;
								vehicleMetrics[i + 2][0] = 8144;
								vehicleMetrics[i + 2][1] = vehicleMetrics[i][1] + 3840;
							}
							power = 80;
							playerAngle = hitWallCount = 0;
							imageGraphics.setFont(subtitleFont);
							onPowerBar = playing = false;
						}
					} else if (vehicleMetrics[0][1] < 81984 && power > 0) {

						// compute rank
						rank = 1;
						for (int i = 1; i < 4; i++) {
							if (vehicleMetrics[0][1] < vehicleMetrics[i][1]) {
								rank++;
							}
						}

						// reduce power while hitting a wall
						if (hitWallCount > 0) {
							hitWallCount--;
							power -= 1;
							if (power < 0) {
								power = 0;
							}
						}

						// process player input
						if (playing) {
							if (K[KindleKeyCodes.VK_FIVE_WAY_LEFT]) {
								playerAngle += 0.075;
							} else if (K[KindleKeyCodes.VK_FIVE_WAY_RIGHT]) {
								playerAngle -= 0.075;
							}
						}
						cos = Math.cos(playerAngle);
						sin = Math.sin(playerAngle);
						vehicleMetrics[0][4] = 0;
						vehicleMetrics[0][5] = 0;
						if (K[KindleKeyCodes.VK_LEFT_HAND_SIDE_TURN_PAGE]) {
							playing = true;
							if (vehicleMetrics[0][6] < 20) {
								vehicleMetrics[0][6] += 0.2;
							}
						} else {
							vehicleMetrics[0][6] *= 0.99;
						}

						if (playing) {
							// compute computer-controlled-vehicles velocities
							for (int i = 1; i < 10; i++) {
								if ((i < 4 && vehicleMetrics[i][6] < 20.5)
										|| vehicleMetrics[i][6] < 10) {
									vehicleMetrics[i][6] += 0.2 + i * 0.2;
								}
								double targetZ = 11 + vehicleMetrics[i][1];
								double tz = (targetZ / 32) % 512;
								double targetX = 7984 + (i & 0x03) * 80;
								if (i >= 4) {
									targetX += 32;
								}

								if (tz >= 128) {
									double angle = tz * Math.PI / 64;
									targetX += ((8 * Math.cos(angle) + 24) * Math
											.sin(angle)) * 32;
								}

								double vx = targetX - vehicleMetrics[i][0];
								double vz = targetZ - vehicleMetrics[i][1];
								double mag = Math.sqrt(vx * vx + vz * vz);
								vehicleMetrics[i][7] = vehicleMetrics[i][2]
										+ vehicleMetrics[i][6] * vx / mag;
								vehicleMetrics[i][8] = vehicleMetrics[i][2]
										+ vehicleMetrics[i][6] * vz / mag;
							}

							// player on power bar?
							onPowerBar = false;
							if (raceTrack[0x1FF & (((int) vehicleMetrics[0][1]) >> 5)][0x1FF & (((int) vehicleMetrics[0][0]) >> 5)] == 2) {
								onPowerBar = true;
								for (int i = 0; i < 2; i++) {
									powerOvalY[i] += 16;
									if (powerOvalY[i] >= 192) {
										powerOvalY[i] = -32;
									}
								}
								if (power < 80) {
									power += 0.2;
								}
							}

							vehicleMetrics[0][7] = vehicleMetrics[0][2]
									- vehicleMetrics[0][6] * sin;
							vehicleMetrics[0][8] = vehicleMetrics[0][3]
									+ vehicleMetrics[0][6] * cos;

							// vehicle hitting something?
							for (int j = 0; j < 10; j++) {

								// vehicle hitting another vehicle?
								for (int i = 0; i < 10; i++) {
									if (i != j) {
										double normalX = (vehicleMetrics[j][0] - vehicleMetrics[i][0]) / 2;
										double normalZ = vehicleMetrics[j][1]
												- vehicleMetrics[i][1];
										double dist2 = normalX * normalX
												+ normalZ * normalZ;
										if (dist2 < 1200) {
											double dotProduct = normalX
													* vehicleMetrics[0][7]
													+ normalZ
													* vehicleMetrics[0][8];
											if (dotProduct < 0) {
												double ratio = 2.0 * dotProduct
														/ dist2;
												vehicleMetrics[j][7] = vehicleMetrics[j][2] = vehicleMetrics[0][7]
														- normalX * ratio;
												vehicleMetrics[j][8] = vehicleMetrics[j][3] = vehicleMetrics[0][8]
														- normalZ * ratio;

												vehicleMetrics[i][2] = -vehicleMetrics[j][2];
												vehicleMetrics[i][3] = -vehicleMetrics[j][3];
												if (i == 0) {
													power -= 10;
													if (power < 0) {
														power = 0;
													}
												}
												break;
											}
										}
									}
								}

								// vehicle hitting a wall?
								int vehicleX = ((int) vehicleMetrics[j][0]) >> 5;
								int vehicleZ = ((int) vehicleMetrics[j][1]) >> 5;
								for (int z = -2; z <= 2; z++) {
									for (int x = -2; x <= 2; x++) {
										if (Math.abs(raceTrack[0x1FF & (z + vehicleZ)][0x1FF & (x + vehicleX)]) == 1) {
											double normalX = vehicleMetrics[j][0]
													- (((x + vehicleX) << 5) + 16);
											double normalZ = vehicleMetrics[j][1]
													- (((z + vehicleZ) << 5) + 16);
											double dist2 = normalX * normalX
													+ normalZ * normalZ;
											if (dist2 < 2304) {
												double dotProduct = normalX
														* vehicleMetrics[j][7]
														+ normalZ
														* vehicleMetrics[j][8];
												if (dotProduct < 0) {
													double ratio = 2.0
															* dotProduct
															/ dist2;
													vehicleMetrics[j][7] = vehicleMetrics[j][2] = vehicleMetrics[0][7]
															- normalX * ratio;
													vehicleMetrics[j][8] = vehicleMetrics[j][3] = vehicleMetrics[0][8]
															- normalZ * ratio;
													vehicleMetrics[j][6] /= 2;
													if (j == 0) {
														hitWallCount = 5;
													}
													break;
												}
											}
										}
									}
								}

								double velocityMag = vehicleMetrics[j][7]
										* vehicleMetrics[j][7]
										+ vehicleMetrics[j][8]
										* vehicleMetrics[j][8];
								double velocityMaxMag = j == 0 ? 400 : 420;
								if (velocityMag > velocityMaxMag) {
									velocityMaxMag = Math.sqrt(velocityMaxMag);
									velocityMag = Math.sqrt(velocityMag);
									vehicleMetrics[j][7] = velocityMaxMag
											* vehicleMetrics[j][7]
											/ velocityMag;
									vehicleMetrics[j][8] = velocityMaxMag
											* vehicleMetrics[j][8]
											/ velocityMag;
								}

								vehicleMetrics[j][0] += vehicleMetrics[j][7];
								vehicleMetrics[j][1] += vehicleMetrics[j][8];
								vehicleMetrics[j][2] *= 0.98;
								vehicleMetrics[j][3] *= 0.98;
							}
						}
					} else {
						paused = 175;
					}

					// -- UPDATE MODEL END
					// ---------------------------------------------------------

					/*
					 * Okay we need to probably up this. and check our 1000000
					 * or something is sensible.. currently we experience
					 * timeouts..
					 */

					nextFrameStart += 68571429;
				} while (nextFrameStart < ((System.currentTimeMillis() - rawtime) * 1000000));
				// -- RENDER FRAME BEGIN
				// -------------------------------------------------------

				// Draw sky
				double skyRed = 0x65;
				double skyGreen = 0x91;
				for (int y = 0, k = 0; y < 48; y++) {
					int skyColor = 0xFF000000 | (((int) skyRed) << 16)
							| (((int) skyGreen) << 8) | 0xF2;
					for (int x = 0; x < 320; x++, k++) {
						screenBuffer[k] = skyColor;
					}
					skyRed += 1.75;
					skyGreen += 1.625;
				}

				// Draw earth
				for (int y = 0, k = 15360; y < 192; y++) {
					for (int x = 0; x < 320; x++, k++) {
						double X = projectionMap[y][x][0] - VIEWER_X;
						double Z = projectionMap[y][x][1];
						int xr = (int) (X * cos - Z * sin + vehicleMetrics[0][0]);
						int zr = (int) (X * sin + Z * cos + vehicleMetrics[0][1]);

						int z = 0x1FF & (zr >> 5);
						int tileIndex = raceTrack[z][0x1FF & (xr >> 5)];
						if (hitWallCount > 0 && tileIndex == 1) {
							tileIndex = 3;
						}
						if (tileIndex == 0 && z < 128 && (z & 1) == 0) {
							tileIndex = (z == 2) ? 5 : 4;
						}
						if (tileIndex < 0) {
							// screenBuffer[k] = 0;
							screenBuffer[k] = wiresBitmap[wiresBitmapIndex][0xFF & zr][0xFF & xr];
						} else {
							screenBuffer[k] = bitmaps[tileIndex][0x1F & zr][0x1F & xr];
						}
					}
				}

				image.setRGB(0, 0, 320, 240, screenBuffer, 0, 320);

				// Draw vehicles
				for (int i = 0; i < 10; i++) {
					double X = vehicleMetrics[i][0] - vehicleMetrics[0][0];
					double Z = vehicleMetrics[i][1] - vehicleMetrics[0][1];
					vehicleMetrics[i][4] = X * cos + Z * sin;
					vehicleMetrics[i][5] = (int) (Z * cos - X * sin);
				}
				for (int z = 1200; z > -127; z--) {
					for (int i = 0; i < 10; i++) {
						if (z == vehicleMetrics[i][5]) {
							double k = VIEWER_Z / (VIEWER_Z - z);
							double upperLeftX = k * (vehicleMetrics[i][4] - 32)
									+ VIEWER_X;
							double upperLeftY = k * (GROUND_Y - 32 - VIEWER_Y)
									+ VIEWER_Y;
							double lowerRightX = k
									* (vehicleMetrics[i][4] + 32) + VIEWER_X;
							double lowerRightY = k * (GROUND_Y - VIEWER_Y)
									+ VIEWER_Y;
							imageGraphics.drawImage(vehicleSprites[i],
									(int) upperLeftX, (int) upperLeftY,
									(int) (lowerRightX - upperLeftX),
									(int) (lowerRightY - upperLeftY), null);
						}
					}
				}

				// Draw power bar
				imageGraphics.setColor(power < 20
						&& (wiresBitmapIndex & 8) == 0 ? Color.WHITE
						: powerColor);
				imageGraphics.fillRect(224, 20, (int) power, 10);
				imageGraphics.setColor(Color.WHITE);
				imageGraphics.drawRect(224, 20, 80, 10);

				// Draw recharge ovals
				if (onPowerBar) {
					imageGraphics.setColor(Color.GREEN);
					for (int i = 0; i < 2; i++) {
						imageGraphics.fillOval(96, powerOvalY[i], 128, 32);
					}
				}

				if (power <= 0 || (vehicleMetrics[0][1] >= 81984 && rank > 3)) {
					// Draw fail message
					String failString = "FAIL";
					imageGraphics.setFont(largeFont);
					int width = imageGraphics.getFontMetrics().stringWidth(
							failString);
					int x = (320 - width) / 2;
					imageGraphics.setColor(darkColor);
					imageGraphics.fillRect(x, 65, width + 5, 90);
					imageGraphics.setColor(Color.RED);
					imageGraphics.drawString(failString, x, 145);
				} else if (vehicleMetrics[0][1] >= 81984) {
					// Display winning rank
					String rankString = Integer.toString(rank);
					imageGraphics.setFont(largeFont);
					int width = imageGraphics.getFontMetrics().stringWidth(
							rankString);
					int x = (320 - width) / 2;
					imageGraphics.setColor(darkColor);
					imageGraphics.fillRect(x - 5, 65, width + 15, 90);
					imageGraphics
							.setColor((wiresBitmapIndex & 4) == 0 ? Color.WHITE
									: Color.GREEN);
					imageGraphics.drawString(rankString, x, 145);
				} else {
					// Display racing rank
					imageGraphics
							.setColor((rank == 4) ? (wiresBitmapIndex & 8) == 0 ? Color.WHITE
									: Color.RED
									: Color.GREEN);
					imageGraphics.drawString(Integer.toString(rank), 16, 32);
				}

				Graphics panelGraphics = rootContainer.getGraphics();
				if (panelGraphics != null) {
					panelGraphics.drawImage(image, 0, 0, 640, 480, null);
					panelGraphics.dispose();
				}

				// rootContainer.validate();
				// rootContainer.setVisible(true);
				rootContainer.repaint();

				// -- RENDER FRAME END
				// ---------------------------------------------------------
				long remaining = (nextFrameStart - ((System.currentTimeMillis() - rawtime) * 1000000));
				if (remaining > 0) {
					try {
						Thread.sleep(remaining / 1000000);
					} catch (Throwable t) {
					}

				}

			}

		} catch (Throwable t) {
			t.printStackTrace();
		}

	}

	public int C(double angle, double light, double dark) {
		return (D(angle, light, dark) << 16)
				| (D(angle + 2 * Math.PI / 3, light, dark) << 8)
				| (D(angle - 2 * Math.PI / 3, light, dark));
	}

	public int D(double angle, double light, double dark) {
		return (int) (255 * Math.pow((Math.cos(angle) + 1) / 2, light) / dark);
	}

}


I'll package it up when its ready to be run, but it's here for reference.

All input gratefully accepted. I'll note the basic build procedures when I have ant sorted out for this one.

Typical current death:

--------------------------------------------------------------------------------
[9/6/12 3:30 AM] ForK (v. 1.0)

Task exceeded maximum duration of 5000 MILLISECONDS: unknown

--------------------------------------------------------------------------------
[9/6/12 3:30 AM] ForK (v. 1.0)

Thread group could not be destroyed - threads still alive:
Thread 1 => [Name=Kindlet-LifeCycle-ForK-0,ThreadGroup=Kindlet-Group-ForK].
: unknown

Which is no surprise - I made no effort to fix anything-programmatic-yet.

: ) Fun
Attached Thumbnails
Click image for larger version

Name:	screenshot2.jpg
Views:	363
Size:	64.6 KB
ID:	91867  

Last edited by twobob; 09-05-2012 at 10:53 PM. Reason: xtry deets
twobob is offline   Reply With Quote