10-12-2003, 07:50 AM
Woo! I've learned absolutely NOTHING from my Java class (already 9 weeks into it) but after 10 minutes of studying some other guy's code, I came up with this program.
First, the original QBASIC by Pasco (found on QBOA)
and now my code, which uses double buffering and whatnot
See the working applet here: http://www.venosoft.com/ninkazu/grass.html
First, the original QBASIC by Pasco (found on QBOA)
Code:
DEFINT A-Z
TYPE grasspoint
x AS INTEGER
y AS INTEGER
angle AS INTEGER
END TYPE
RANDOMIZE TIMER
ngrass = 1000
DIM SHARED grass(ngrass) AS grasspoint
DIM SHARED presin(360) AS INTEGER
FOR lp = 0 TO ngrass
grass(lp).x = RND * 320
grass(lp).y = RND * 200
grass(lp).angle = (grass(lp).x MOD 360) + RND * 30 - ((200 - grass(lp).y) ^ .5) * 10
NEXT
FOR lp = 0 TO 360
presin(lp) = SIN(lp * 3.14159 / 180) * 128
NEXT
SCREEN 7
PALETTE 0, 4
OUT &H3C8, 4
OUT &H3C9, 0
OUT &H3C9, 23
OUT &H3C9, 0
PALETTE 1, 1
OUT &H3C8, 1
OUT &H3C9, 0
OUT &H3C9, 16
OUT &H3C9, 0
DO
SCREEN 7, , d, (d + 2) MOD 4
CLS
d = (d + 1) MOD 4
FOR lp = 0 TO ngrass
grass(lp).angle = (grass(lp).angle + 350) MOD 360
LINE (grass(lp).x, grass(lp).y)-(grass(lp).x + ABS(presin(grass(lp).angle)) \ 60 + 1, grass(lp).y + 1 + ABS(presin(grass(lp).angle)) \ 60), 1
NEXT
FOR lp = 0 TO ngrass
LINE (grass(lp).x, grass(lp).y)-(grass(lp).x + ABS(presin(grass(lp).angle)) \ 60, grass(lp).y - 2 + ABS(presin(grass(lp).angle)) \ 100), 2
NEXT
LOOP UNTIL INKEY$ <> ""
and now my code, which uses double buffering and whatnot
Code:
import java.awt.*;
import java.awt.image.*;
import java.applet.Applet;
import java.util.Random;
public class grass extends Applet implements Runnable
{
int ngrass = 1000;
int [] grassx = new int[ngrass];
int [] grassy = new int[ngrass];
int [] grassa = new int[ngrass];
int [] presin = new int[361];
Image imgbuffer = null;
Graphics gbuffer = null;
Random rnd = new Random();
Thread app = null;
public void start()
{
if( app == null )
{
app = new Thread(this);
app.start(); // This invokes run() (see below)
}
}
public void init()
{
setBackground(new Color(0,64,0));
imgbuffer = createImage(320, 200);
gbuffer = imgbuffer.getGraphics();
gbuffer.setColor( new Color(0,64,0) );
gbuffer.fillRect(0, 0, 320, 200);
for (int k = 0; k<ngrass; k++)
{
grassx[k] = rnd.nextInt(320);
grassy[k] = rnd.nextInt(200);
grassa[k] = (int)((grassx[k] % 360) + rnd.nextInt(30) - (Math.sqrt(200-grassy[k]))*10);
}
for (int k = 0; k<= 360; k++){
presin[k] = (int)(Math.sin(k*Math.PI/180) * 128);
}
}
public void paint(Graphics screen)
{
if (imgbuffer != null){
screen.drawImage(imgbuffer, 0, 0, this);
}
}
public void update(Graphics g)
{
paint(g);
}
public void run()
{
Graphics g = getGraphics();
while (app != null)
{
eraseApp();
paintApp(g);
try
{
Thread.sleep(10);
}catch(InterruptedException e) { stop(); }
}
}
public void stop()
{
app = null;
}
public void paintApp(Graphics g)
{
gbuffer.setColor(Color.black);
for (int k = 0; k<ngrass; k++){
grassa[k] = (grassa[k] + 350) % 360;
gbuffer.drawLine(grassx[k], grassy[k], grassx[k] + Math.abs(presin[grassa[k]]) / 60 + 1, grassy[k] + 1 + Math.abs(presin[grassa[k]]) / 60);
}
gbuffer.setColor(Color.green);
for (int k = 0; k<ngrass; k++){
gbuffer.drawLine(grassx[k], grassy[k], grassx[k] + Math.abs(presin[grassa[k]]) / 60, grassy[k] - 2 + Math.abs(presin[grassa[k]]) / 100);
}
g.drawImage(imgbuffer, 0, 0, this);
}
public void eraseApp()
{
gbuffer.setColor(new Color(0,64,0));
gbuffer.fillRect(0,0,320,200);
}
}
See the working applet here: http://www.venosoft.com/ninkazu/grass.html