Computer Science 202
Introduction to Programming
Fall 2013, The College of Saint Rose
SnowyNight Demo
A working demo of SnowyNight will appear below. Click inside the applet to interact with it.
SnowyNight BlueJ Project
Click here to download a BlueJ project for SnowyNight.
SnowyNight Source Code
The Java source code for SnowyNight is below. Click on a file name to download it.
import objectdraw.*;
import java.awt.*;
/*
*
* Example SnowyNight: loops to draw a picture including some snowflakes
*
* Jim Teresco
* The College of Saint Rose, Fall 2013
* Based on example from CSCI 134, Williams College
*
* $Id: SnowyNight.java 2231 2013-10-27 18:40:06Z terescoj $
*/
// Program which creates clouds which create snow when the user clicks
public class SnowyNight extends WindowController {
// constants for the moon size and location
private static final double MOON_INSET = 50;
private static final int MOON_SIZE = 70;
// sizes and locations for the bricks
private static final double BRICK_LINE = 40; // from bottom
private static final double BRICK_HEIGHT = 12;
private static final double BRICK_WIDTH = 30;
private static final double BRICK_SPACING = 3;
// how many snow flakes?
private static final int NUM_FLAKES = 25;
// colors of the sky, mortar, and brick
private final Color NIGHTSKY = new Color(50, 50, 100);
private final Color MORTAR = new Color(200, 200, 200);
private final Color BRICKRED = new Color(150, 40, 40);
// image of the snow
private Image snowPic;
public void begin() {
// where to draw next brick
double brickPosition;
// get leaf picture
snowPic = getImage("snow.gif");
// draw solid sky, mortar, and moon
new FilledRect(0, 0, canvas.getWidth(), canvas.getHeight() - BRICK_LINE, canvas).setColor(NIGHTSKY);
new FilledRect(0, canvas.getHeight() - BRICK_LINE, canvas.getWidth(),
canvas.getHeight(),
canvas).setColor(MORTAR);
new FilledOval(MOON_INSET,MOON_INSET,MOON_SIZE,MOON_SIZE,
canvas).setColor(Color.white);
// add the bricks
brickPosition = 0;
while ( brickPosition < canvas.getWidth() ) {
new FilledRect(brickPosition, canvas.getHeight() - BRICK_LINE,
BRICK_WIDTH, BRICK_HEIGHT,
canvas).setColor(BRICKRED);
brickPosition = brickPosition + BRICK_WIDTH + BRICK_SPACING;
}
// and finally, a bunch of snowflakes at random positions
// but with a bit of a difference -- we want the snowflakes
// to be placed anywhere on the upper 2/3 of the canvas, where
// all flakes are visible but could be partially off either
// side or the top of the canvas
//
// to accomplish this, we need the dimensions of the snowflake,
// but those depend on the dimensions of the Image, which we
// cannot easily get out hands on until we use it to create a
// VisibleImage - so we create one, "measure" it, then remove
// it from the canvas
VisibleImage testFlake = new VisibleImage(snowPic, 0, 0, canvas);
double width = testFlake.getWidth();
double height = testFlake.getHeight();
testFlake.removeFromCanvas();
// now we know the range of values that should be allowed in our
// random generators
RandomDoubleGenerator xGen = new RandomDoubleGenerator(-width, canvas.getWidth());
RandomDoubleGenerator yGen = new RandomDoubleGenerator(-height, canvas.getHeight()*2/3);
for (int flakeNum = 0; flakeNum < NUM_FLAKES; flakeNum++) {
new VisibleImage(snowPic, xGen.nextValue(), yGen.nextValue(), canvas);
}
}
}