This is how it looks:

The source code:

voidsetup() { size(600, 600); frameRate(60); } ArrayList<ball> balls = new ArrayList<ball>(); float gravity = 0.1; float resistance = 0.9999; int mX=300, mY=300; voiddraw() { int i; background(0); fill(255); stroke(255); // Update and draw balls, if any for (i = 0; i<balls.size(); i++) { ball b = balls.get(i); b.update(); } // Rest is just for the mouse lines text("Ball goes from green (left click) to red (right click)", 15, 15); line(mX, mY, mouseX, mouseY); fill(color(0, 255, 0)); ellipse(mX, mY, 5, 5); fill(color(255, 0, 0)); ellipse(mouseX, mouseY, 5, 5); } // When left mouse button is pressed set origin, when right speed and direction voidmousePressed() { ball b; if (mouseButton == LEFT) { mX=mouseX; mY=mouseY; } else if (mouseButton == RIGHT) { // Add new ball b = new ball(mX,mY,10, 0.1*(mouseX-mX), 0.1*(mouseY-mY)); balls.add(b); } } class ball { float x, y; int r; float dx, dy; // Constructor ball(int _x, int _y, int _r, float _dx, float _dy) { x = _x; y = _y; r = _r; dx = _dx; dy = _dy; } void update() { dy=dy+gravity; dy=dy*resistance; dx=dx*resistance; x=x+dx; y=y+dy; // Detect if we hit bottom, if so reverse y speed // Since we have gravity there is a small chance to get stuck at the bottom, // thus we deduct 1 to y to make sure we always bounce back up (try remove it) if ((y+r)>height) {dy = -dy; y = y - 1; } // Detect if we hit top, if so reverse y speed if ((y-r)<0) dy = -dy; // Detect if we hit right, if so reverse x speed if ((x+r)>width) dx = -dx; // Detect if we hit left, if so reverse x speed if ((x-r)<0) dx = -dx; ellipse(x, y, 2*r, 2*r); } }

## No comments:

## Post a Comment