ColorGradientFactory gradientFactory = new ColorGradientFactory();
gradientFactory.addSourcePoint(light.getWidth() / 2, light.getHeight() / 2, light.getWidth() / 2f * .9f, new Color4f(0,0,0,0));
gradientFactory.setBaseColor(new Color4f(1,1,1,1));
gradientFactory.drawGradient(light);
GraphicsContext imageContext = canvas.createImageGraphicsContext(dark);
walk = animFrontStill;
// Draw the light shine
imageContext.setGraphicsListener(new GraphicsListener() {
public void draw(View view, Graphics graphics) {
view.setCamera(-400+posX, -300+posY, 0);
graphics.setClearColor(new Color4f(.0f,.0f,.0f, .98f));
graphics.clear();
drawLight(graphics, walk, light, posX + xOffset, posY, lightShineRandom3);
drawLight(graphics, animFire, light, 150 - animFire.getWidth()/2, 100 - animFire.getHeight()/2, lightShineRandom1);
drawLight(graphics, animFire, light, 650 - animFire.getWidth()/2, 100 - animFire.getHeight()/2, lightShineRandom2);
drawLight(graphics, animFire, light, 150 - animFire.getWidth()/2, 450 - animFire.getHeight()/2, lightShineRandom3);
drawLight(graphics, animFire, light, 650 - animFire.getWidth()/2, 450 - animFire.getHeight()/2, lightShineRandom4);
}
public void init(View view, Graphics renderer) {
view.setCamera(0, 0, 0);
view.setSize(1024, 1024);
}
public void sizeChanged(GraphicsContext graphicsContext, View view) {}
});
canvas.setGraphicsListener(new GraphicsListener() {
// Variables for fire simulation
Random random = new Random();
long lightShineTime = 0;
long start = System.nanoTime();
long currTime = start;
long count = 0;
long fps = 0;
Flip flip = Flip.NONE;
float angle = 0;
public void draw(View view, Graphics renderer) {
long elapsedTime = System.nanoTime() - currTime;
currTime += elapsedTime;
lightShineTime += elapsedTime;
angle += elapsedTime / 20000000f;
// Walking
if(up && !down) {
posY -= (float)elapsedTime / 11000000;
walk = animBack;
flip = Flip.NONE;
xOffset = 0;
} else if(down && !up) {
posY += (float)elapsedTime / 11000000;
walk = animFront;
flip = Flip.NONE;
xOffset = 0;
} else if(left && !right) {
posX -= (float)elapsedTime / 10000000;
walk = animLeft;
flip = Flip.NONE;
xOffset = 0;
} else if(right && !left) {
posX += (float)elapsedTime / 10000000;
walk = animLeft;
flip = Flip.VERTICAL;
xOffset = 0;
} else {
if(walk == animLeft) {
walk = animLeftStill;
if(flip == Flip.NONE) xOffset = 4;
else xOffset = 8;
}
if(walk == animFront) {
walk = animFrontStill;
xOffset = 3;
}
if(walk == animBack) {
walk = animBackStill;
xOffset = 1;
}
}
view.setCamera(posX, posY, 0);
// update animation
animLeft.update(elapsedTime);
animFront.update(elapsedTime);
animBack.update(elapsedTime);
animFire.update(elapsedTime);
renderer.setColor(white);
long gleft = (long)posX -400 - grass.getWidth()*2;
gleft = gleft - (gleft % (grass.getWidth()*2));
long gtop = (long)posY -300 - grass.getHeight()*2;
gtop = gtop - (gtop % (grass.getHeight()*2));
for(long x = gleft; x <= gleft + 800 + grass.getWidth()*2; x+=grass.getWidth() * 2) {
for(long y = gtop; y <= gtop + 600 + grass.getHeight()*2; y+=grass.getHeight() * 2) {
renderer.translate(x, y);
renderer.drawImage(grass, grass.getWidth() * 2, grass.getHeight() * 2);
renderer.clearTransform();
}
}
renderer.translate(posX + xOffset, posY);
walk.draw(renderer, walk.getWidth(), walk.getHeight(), flip);
renderer.clearTransform();
// Fires
drawFire(renderer, animFire, light, 150, 100, lightShineRandom1);
drawFire(renderer, animFire, light, 650, 100, lightShineRandom2);
drawFire(renderer, animFire, light, 150, 450, lightShineRandom3);
drawFire(renderer, animFire, light, 650, 450, lightShineRandom4);
// Draw darkness
renderer.clearTransform();
renderer.translate(posX-400, posY-300);
renderer.drawImage(dark, 1024, 1024);
renderer.setColor(white);
renderer.clearTransform();
renderer.translate(posX-400+50, posY-300+50);
renderer.drawText("Scene Demo");
// draw frames per second
renderer.setColor(red);
renderer.clearTransform();
renderer.translate(posX-400+650, posY-300+580);
renderer.drawText("FPS:" + fps);
// calculate frames per second every second
count++;
if(currTime - start > 1000000000) {
start = currTime;
fps = count;
count = 0;
System.out.println(fps);
}
// Simulate flickering of light
if(lightShineTime > 120000000) {
lightShineRandom1 = random.nextInt(10);
lightShineRandom2 = random.nextInt(10);
lightShineRandom3 = random.nextInt(10);
lightShineRandom4 = random.nextInt(10);
lightShineTime = 0;
}
}
public void init(View view, Graphics renderer) {
view.setCamera(400, 300, 0);
view.setSize(800, 600);
}
public void sizeChanged(GraphicsContext graphicsContext, View view) { }
});
// Cleaning up
System.gc();
long lastVSyncChange = 0;
while(true) {
if(keyboard != null) {
keyboard.poll();
// End demo
if(keyboard.isKeyDown(Key.Q) || keyboard.isKeyDown(Key.ESCAPE)) {
canvas.dispose();
System.exit(0);
}
// VSync
if(keyboard.isKeyDown(Key.S)) {
long time = System.currentTimeMillis();
if(time - lastVSyncChange > 1000) {
canvas.setVSync(!canvas.getVSync());
lastVSyncChange = time;
}
}
// Character movement
down = keyboard.isKeyDown(Key.DOWN);
left = keyboard.isKeyDown(Key.LEFT);
right = keyboard.isKeyDown(Key.RIGHT);
up = keyboard.isKeyDown(Key.UP);
}
imageContext.draw();
canvas.draw();
}
}