Many Bouncing Balls Program
I am trying to create a program that can use one method to create many bouncing balls.I want each ball to function independently of each other.
The problem I am having is that when I call my BouncingBall () method three times, it only creates one ball that moves randomly instead of three.
If you have any idea of how to tackle this problem I would really appreciate if you shared them with me. I am relatively new to java.
I read that threads might be a good option to work on this problem but I am not sure how to use them.
*(Code Starts)*
import acm.graphics.*;
import acm.program.*;
import acm.util.*;
import java.awt.*;
import java.awt.event.*;
public class BouncingBalls extends GraphicsProgram {
public void run(){
BouncingBall(50, 50);
BouncingBall(100, 100);
BouncingBall(300, 300);
public void BouncingBall(double width, double height) {
//Create variables for x and y position of balls
double xPosition = getWidth()/2;
double yPosition = getHeight()/2;
//Create Ball
GOval Ball = new GOval (xPosition, yPosition, width, height);
add (Ball);
// Initialize variables for use in Random movement method
double xMoveBall = rgen.nextDouble(-4.0, 4.0);
double yMoveBall = rgen.nextDouble(-4.0, 4.0);
//Ball's Random Movement
while (true) {
Ball.move(xMoveBall,yMoveBall);
pause(10);
xPosition += xMoveBall;
yPosition += yMoveBall;
//Ball's Collisions with walls
if (xPosition >= (getWidth() - width)) {
xMoveBall = -(xMoveBall);
pause(10);
if (xPosition <= 0){
xMoveBall = -(xMoveBall);
pause(10);
if (yPosition <= 0){
yMoveBall = -(yMoveBall);
pause(10);
if (yPosition >= getHeight() - height){
yMoveBall = -(yMoveBall);
pause(10);
private RandomGenerator rgen = RandomGenerator.getInstance();{}
*(Code Ends)*
Hi,
I have been experimenting with threads for the last couple of days. Here is the code I have been working on. I explain what I am trying to do below it:
import acm.graphics.*;
import acm.program.*;
import acm.util.*;
import java.awt.*;
import java.awt.event.*;
public class BB5 extends GraphicsProgram implements Runnable{
// Debbuging Label
private GLabel label = new GLabel("");
//Initialize variables for ball's position
private double xPosition = getWidth()/2;
private double yPosition = getHeight()/2;
//Initialize variables for use in Random movement method
private double yMoveBall;
private double xMoveBall;
//Initialize variables for width and height of ball, so that they can be used in both metods: bounce() and CreateBall()
private double width;
private double height;
public void mouseClicked (MouseEvent e){
new Thread(this).start();
public void run() {
CreateBall(50,50).bounce();
public void CreateBall(double x, double y) {
//Create variables for x and y position of balls
xPosition = getWidth()/2;
yPosition = getHeight()/2;
//Create Ball
x = width;
y = height;
GOval Ball = new GOval (xPosition, yPosition, width, height);
add (Ball);
public void bounce() {
yMoveBall = rgen.nextDouble(-4.0, 4.0);
xMoveBall = rgen.nextDouble(-4.0, 4.0);
//Ball's Random Movement
while (true){
//Put thread to sleep for 5 milliseconds so that other balls can use bounce()
try { Thread.sleep(5); } catch(InterruptedException e) {}
//Move Ball created in previous methods
Ball.move(xMoveBall,yMoveBall);
pause(10);
xPosition += xMoveBall;
yPosition += yMoveBall;
label.setLabel(""+xPosition); add (label, 50, 50);
//Ball's Collisions with walls
if (xPosition >= (getWidth() - width)) {
xMoveBall = -(xMoveBall);
pause(10);
if (xPosition <= 0){
xMoveBall = -(xMoveBall);
pause(10);
if (yPosition <= 0){
yMoveBall = -(yMoveBall);
pause(10);
if (yPosition >= getHeight() - height){
yMoveBall = -(yMoveBall);
pause(10);
private RandomGenerator rgen = RandomGenerator.getInstance();{}
}The idea is that I have a method that creates the ball CreateBall(), and another that bounces the ball bounce().
My init method creates one ball. Then, when I click the mouse, I create a new thread which applies the bounce method to the ball by running the run method.
Inside the bounce method, I have a thread sleep so that other threads can be started.
Eventually, what I would like to do, is that everytime I click the mouse, a new ball is created and the bounce is applied to it.
I am also having trouble with getting the ball from my CreateBall() method, to work inside my bounce().
Can you please help me understand what might be wrong with my code?
Thank you!
Similar Messages
-
Hi, I'm new to the forums and really new to java and I was wondering if anyone could help me with a simple java program that I'm writing.
It deals simply with a bouncing ball (yes I know there's a topics on this one heh) that bounces aimlessly inside a drawing window.
Here's my problem:
I can make the ball bounce off two boundaries (top and right, left and bottom, right and bottom etc.) but when the ball reaches the 3rd boundary it just passes through it. It wont bounce off opposite sides (left and right, top and bottom) it only bounces off the first.
I believe it has something to do with my if statements under the move method.
I need to make some kind of loop so it keeps checking if the ball comes to a new boundary.
Right now it's only checking it once and after it bounces the ball one time thats it.
(I've tested all the boundaries to see if they bounce the ball and they all do, its just I can't bounce it more than 2 times)
I'm stuck on how to write this loop statement. Any help would be greatly appreciated! Thanks.
My code (If this isnt enough let me know please):
(BallTester.java)
import element.*;
public class BallTester{
public static void main(String[] args){
int width = 500;
int height = 400;
DrawingWindow d = new DrawingWindow(width,height);
Ball b = new Ball(70,30,width,height);
b.send(d);
(Ball.java)
import element.*;
public class Ball{
int base; // center line of where the circle starts
int size; // radius of circle
int xPos,yPos; // circle ctr
Circle c;
int width, height;
int dx,dy;
public Ball(int base, int size, int width, int height) {
this.base = base;
this.size = size;
c = new Circle(50,base,size);
this.width = width; this.height = height;
xPos = 50;
yPos = base;
public void drawOn(DrawingWindow d){
//draws the circle
c.drawOn(d);
public void clearOn(DrawingWindow d){
d.invertMode(); // black-> white
drawOn(d); //redraw in white: erase!
d.invertMode(); // white -> black
public void move(int dx, int dy){
//Sets boundaries for x values
if((xPos<=size)||(xPos>=width-size)){
dx = -dx;
else
xPos += dx;
//Sets boundaries for y values
if((yPos<=size)||(yPos>=height-size)){
dy = -dy;
else
yPos += dy;
c.move(dx,dy);
public void send(DrawingWindow d){
Waiting w = new Waiting();
//This below keeps the ball drawing up until j = width)
for(int j = 0; j < width; j++){
move(6,-3); // moves the circle based on dx, dy values
this.drawOn(d);
w.snooze(60);
this.clearOn(d);}You don't need a loop to check - you just need to check every loop (before you repaint).
I created an example for you. If this assignment is homework, don't hand it in - use it as a reference. Try to understand what's going on in the code and why it works.
import java.awt.*;
import javax.swing.*;
public class Test extends JFrame {
public Test () {
getContentPane ().setLayout (new BorderLayout ());
getContentPane ().add (new TestPanel ());
setDefaultCloseOperation (DISPOSE_ON_CLOSE);
setTitle ("Test");
pack ();
setLocationRelativeTo (null);
setVisible (true);
public static void main (String[] parameters) {
new Test ();
private class TestPanel extends JPanel {
private Ball ball;
public TestPanel () {
ball = new Ball ();
Thread painter = new Thread (new Runnable () {
public void run () {
while (true) {
try {
Thread.sleep (20);
} catch (InterruptedException exception) {}
repaint ();
painter.setDaemon (true);
painter.start ();
public Dimension getPreferredSize () {
return new Dimension (300, 200);
public void paintComponent (Graphics g) {
super.paintComponent (g);
ball.move (getWidth (), getHeight ());
ball.paint (g);
private class Ball {
private static final int W = 10;
private static final int H = 10;
private int x;
private int y;
private int dx;
private int dy;
public Ball () {
x = 0;
y = 0;
dx = 2;
dy = 2;
public void move (int width, int height) {
int x = this.x + dx;
int y = this.y + dy;
if ((x < 0) || (x + W > width)) {
dx = -dx;
x = this.x + dx;
if ((y < 0) || (y + H > height)) {
dy = -dy;
y = this.y + dy;
this.x = x;
this.y = y;
public void paint (Graphics g) {
g.fillOval (x, y, W, H);
} -
Mac is way too slow and bouncing ball is constant
I ran the etrecheck and this is what it came back with. What should I do?
Problem description:
Bouncing ball all the time…computer super slow.
EtreCheck version: 2.1.7 (114)
Report generated January 31, 2015 at 5:37:13 PM PST
Download EtreCheck from http://etresoft.com/etrecheck
Click the [Support] links for help with non-Apple products.
Click the [Details] links for more information about that line.
Click the [Adware] links for help removing adware.
Hardware Information: ℹ️
MacBook Pro (15-inch, Early 2011) (Technical Specifications)
MacBook Pro - model: MacBookPro8,2
1 2 GHz Intel Core i7 CPU: 4-core
4 GB RAM Upgradeable
BANK 0/DIMM0
2 GB DDR3 1333 MHz ok
BANK 1/DIMM0
2 GB DDR3 1333 MHz ok
Bluetooth: Old - Handoff/Airdrop2 not supported
Wireless: en1: 802.11 a/b/g/n
Battery Health: Normal - Cycle count 263
Video Information: ℹ️
Intel HD Graphics 3000 - VRAM: 384 MB
AMD Radeon HD 6490M - VRAM: 256 MB
Color LCD 1440 x 900
System Software: ℹ️
OS X 10.10.2 (14C109) - Time since boot: 0:13:39
Disk Information: ℹ️
ST9500325ASG disk0 : (500.11 GB)
EFI (disk0s1) <not mounted> : 210 MB
Recovery HD (disk0s3) <not mounted> [Recovery]: 650 MB
Macintosh HD (disk1) / : 498.88 GB (235.63 GB free)
Core Storage: disk0s2 499.25 GB Online
HL-DT-ST DVDRW GS23NR
USB Information: ℹ️
Apple Inc. FaceTime HD Camera (Built-in)
HP Photosmart Plus B210 series
Apple Inc. Apple Internal Keyboard / Trackpad
Apple Inc. BRCM2070 Hub
Apple Inc. Bluetooth USB Host Controller
Apple Computer, Inc. IR Receiver
Thunderbolt Information: ℹ️
Apple Inc. thunderbolt_bus
Gatekeeper: ℹ️
Mac App Store and identified developers
Kernel Extensions: ℹ️
/System/Library/Extensions
[loaded] com.LaCie.ScsiType00 (1.2.9 - SDK 10.6) [Support]
[loaded] com.jmicron.driver.jmPeripheralDevice (2.0.4) [Support]
[not loaded] com.kaspersky.kext.klif (3.0.0d23) [Support]
[loaded] com.kaspersky.nke (1.0.2d43) [Support]
[loaded] com.lacie.driver.LaCie_RemoteComms (1.0.1 - SDK 10.4) [Support]
[loaded] com.oxsemi.driver.OxsemiDeviceType00 (1.28.13 - SDK 10.5) [Support]
Launch Daemons: ℹ️
[loaded] com.adobe.fpsaud.plist [Support]
[running] com.fitbit.galileod.plist [Support]
User Launch Agents: ℹ️
[loaded] com.adobe.ARM.[...].plist [Support]
User Login Items: ℹ️
iTunesHelper Application Hidden (/Applications/iTunes.app/Contents/MacOS/iTunesHelper.app)
Internet Plug-ins: ℹ️
FlashPlayer-10.6: Version: 16.0.0.296 - SDK 10.6 [Support]
QuickTime Plugin: Version: 7.7.3
Flash Player: Version: 16.0.0.296 - SDK 10.6 [Support]
Default Browser: Version: 600 - SDK 10.10
SharePointBrowserPlugin: Version: 14.3.9 - SDK 10.6 [Support]
Silverlight: Version: 5.1.20913.0 - SDK 10.6 [Support]
JavaAppletPlugin: Version: 15.0.0 - SDK 10.10 Check version
Safari Extensions: ℹ️
Pin It Button [Installed]
3rd Party Preference Panes: ℹ️
Flash Player [Support]
Time Machine: ℹ️
Skip System Files: NO
Mobile backups: ON
Auto backup: YES
Volumes being backed up:
Macintosh HD: Disk size: 498.88 GB Disk used: 263.25 GB
Destinations:
LaCie [Local]
Total size: 499.76 GB
Total number of backups: 11
Oldest backup: 2013-04-08 05:32:50 +0000
Last backup: 2014-12-29 20:32:29 +0000
Size of backup disk: Too small
Backup size 499.76 GB < (Disk used 263.25 GB X 3)
Top Processes by CPU: ℹ️
5% WindowServer
0% systemstatsd
0% HP Scanner 3
0% AppleSpell
0% fontd
Top Processes by Memory: ℹ️
232 MB Image Capture Extension
159 MB ocspd
133 MB Safari
120 MB com.apple.WebKit.WebContent
94 MB Dock
Virtual Memory Information: ℹ️
40 MB Free RAM
1.56 GB Active RAM
1.53 GB Inactive RAM
1.14 GB Wired RAM
1.40 GB Page-ins
5 MB Page-outs
Diagnostics Information: ℹ️
Jan 31, 2015, 05:24:14 PM Self test - passedI can't stand peremptory affirmations like "Nothing is wrong with Safari".
Thousands of users can't be wrong (see the discussions).
If I read you the right way, it's never software' fault, it's the user who's the culprit.
Amazing!
In this very case, the fact is we can't give to "christinefromfonthill" a good solution because weren't sitting in front of her Mac.
You give her a good advice which could, perhaps, lead to an improvement.
But must also admit that Safari is a very slow browser compared to Firefox or Chrome.
And you can't ignore all the problems which arose when upgrading to Lion and were related to the new build and specs of Safari 5.1.
The best example is the apparition of "garbage type" (use of Last Resort font) when reading numerous sites. This never occured before and is the direct consequence of Safari compliance to Web Open Type. This standard prohibits the use of Type 1 Postscript Fonts and is the reason why so many people are in trouble.
I use a Mac for more than 25 years.
I am a very "clean" user who hates the bells and whistles of third party.
My Mac is always up-to-date and despite all my Mac loving care, I run into some problems.
Imagine the nightmare which can occurs for the vulgum pecus who isn't, by definition, a power user aware of all the requirements for running a System in optimal conditions.
May be Safari is one step in advance on its time but lambda users are paying the price for it. -
How to repaint a JPanel in bouncing balls game?
I want to repaint the canvas panel in this bouncing balls game, but i do something wrong i don't know what, and the JPanel doesn't repaint?
The first class defines a BALL as a THREAD
If anyone knows how to correct the code please to write....
package fuck;
//THE FIRST CLASS
class CollideBall extends Thread{
int width, height;
public static final int diameter=15;
//coordinates and value of increment
double x, y, xinc, yinc, coll_x, coll_y;
boolean collide;
Color color;
Rectangle r;
bold BouncingBalls balls; //A REFERENCE TO SECOND CLASS
//the constructor
public CollideBall(int w, int h, int x, int y, double xinc, double yinc, Color c, BouncingBalls balls) {
width=w;
height=h;
this.x=x;
this.y=y;
this.xinc=xinc;
this.yinc=yinc;
this.balls=balls;
color=c;
r=new Rectangle(150,80,130,90);
public double getCenterX() {return x+diameter/2;}
public double getCenterY() {return y+diameter/2;}
public void move() {
if (collide) {
x+=xinc;
y+=yinc;
//when the ball bumps against a boundary, it bounces off
//bounce off the obstacle
public void hit(CollideBall b) {
if(!collide) {
coll_x=b.getCenterX();
coll_y=b.getCenterY();
collide=true;
public void paint(Graphics gr) {
Graphics g = gr;
g.setColor(color);
//the coordinates in fillOval have to be int, so we cast
//explicitly from double to int
g.fillOval((int)x,(int)y,diameter,diameter);
g.setColor(Color.white);
g.drawArc((int)x,(int)y,diameter,diameter,45,180);
g.setColor(Color.darkGray);
g.drawArc((int)x,(int)y,diameter,diameter,225,180);
g.dispose(); ////////
///// Here is the buggy code/////
public void run() {
while(true) {
try {Thread.sleep(15);} catch (Exception e) { }
synchronized(balls)
move();
balls.repairCollisions(this);
paint(balls.gBuffer);
balls.canvas.repaint();
//THE SECOND CLASS
public class BouncingBalls extends JFrame{
public Graphics gBuffer;
public BufferedImage buffer;
private Obstacle o;
private List<CollideBall> balls=new ArrayList();
private static final int SPEED_MIN = 0;
private static final int SPEED_MAX = 15;
private static final int SPEED_INIT = 3;
private static final int INIT_X = 30;
private static final int INIT_Y = 30;
private JSlider slider;
private ChangeListener listener;
private MouseListener mlistener;
private int speedToSet = SPEED_INIT;
public JPanel canvas;
private JPanel p;
public BouncingBalls() {
super("fuck");
setSize(800, 600);
p = new JPanel();
Container contentPane = getContentPane();
final BouncingBalls xxxx=this;
o=new Obstacle(150,80,130,90);
buffer=new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_RGB);
gBuffer=buffer.getGraphics();
//JPanel canvas start
final JPanel canvas = new JPanel() {
final int w=getSize().width-5;
final int h=getSize().height-5;
@Override
public void update(Graphics g)
paintComponent(g);
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
gBuffer.setColor(Color.ORANGE);
gBuffer.fillRect(0,0,getSize().width,getSize().height);
gBuffer.draw3DRect(5,5,getSize().width-10,getSize().height-10,false);
//paint the obstacle rectangle
o.paint(gBuffer);
g.drawImage(buffer,0,0, null);
//gBuffer.dispose();
};//JPanel canvas end
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
addButton(p, "Start", new ActionListener() {
public void actionPerformed(ActionEvent evt) {
CollideBall b = new CollideBall(canvas.getSize().width,canvas.getSize().height
,INIT_X,INIT_Y,speedToSet,speedToSet,Color.BLUE,xxxx);
balls.add(b);
b.start();
contentPane.add(canvas, "Center");
contentPane.add(p, "South");
public void addButton(Container c, String title, ActionListener a) {
JButton b = new JButton(title);
c.add(b);
b.addActionListener(a);
public boolean collide(CollideBall b1, CollideBall b2) {
double wx=b1.getCenterX()-b2.getCenterX();
double wy=b1.getCenterY()-b2.getCenterY();
//we calculate the distance between the centers two
//colliding balls (theorem of Pythagoras)
double distance=Math.sqrt(wx*wx+wy*wy);
if(distance<b1.diameter)
return true;
return false;
synchronized void repairCollisions(CollideBall a) {
for (CollideBall x:balls) if (x!=a && collide(x,a)) {
x.hit(a);
a.hit(x);
public static void main(String[] args) {
JFrame frame = new BouncingBalls();
frame.setVisible(true);
} And when i press start button:
Exception in thread "Thread-2" java.lang.NullPointerException
at fuck.CollideBall.run(CollideBall.java:153)
Exception in thread "Thread-3" java.lang.NullPointerException
at fuck.CollideBall.run(CollideBall.java:153)
Exception in thread "Thread-4" java.lang.NullPointerException
at fuck.CollideBall.run(CollideBall.java:153)
and line 153 is: balls.canvas.repaint(); in Method run() in First class.
Please help.public RepaintManager manager;
public BouncingBalls() {
manager = new RepaintManager();
manager.addDirtyRegion(canvas, 0, 0,canvas.getSize().width, canvas.getSize().height);
public void run() {
while(true) {
try {Thread.sleep(15);} catch (Exception e) { }
synchronized(balls)
move();
balls.repairCollisions(this);
paint(balls.gBuffer);
balls.manager.paintDirtyRegions(); //////// line 153
but when push start:
Exception in thread "Thread-2" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at fuck.CollideBall.run(CollideBall.java:153)
Exception in thread "Thread-3" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at fuck.CollideBall.run(CollideBall.java:153)
i'm newbie with Concurrency and i cant handle this exceptons.
Is this the right way to do repaint? -
Java Bouncing Balls Threads problem?
Hello,
I am working on a homework assignment to represent a java applet with some bouncing balls inside. So far so good. The balls bounce and behave as they are supposed. The only thing is that I want to make 2 buttons, Start and Stop (this is not part of the assignment, but my free will to provide some extra stuff :) ) . I am implementing Runnable for the animation and ActionListener for the buttons. I did research on threading, but somehow I am still not getting quite the result I want. The applet is not displaying my buttons (I guess I am not implementing them correctly) and I dont know whether I have synchronized the threads correctly as well. So, I am asking for some guidance how can I do this? Thanks in advance!
As a remark, I am new to Java, as I am just starting to learn it and this is my first assignment.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Balls extends JApplet implements Runnable, ActionListener
Thread runner = null;
Image img;
Graphics gr;
BallCollision ball[];
Balls can;
JButton stopButton;
JButton startButton;
JPanel controls;
boolean stop,start;
//field for 10 balls
static final int MAX=10;
public void init()
setSize(800,600);
img = createImage(size().width,size().height);
gr = img.getGraphics();
startButton = new JButton("Start");
stopButton = new JButton("Stop");
stopButton.addActionListener(this);
startButton.addActionListener(this);
controls = new JPanel();
controls.setLayout(new FlowLayout());
controls.add(startButton);
controls.add(stopButton);
//new Thread(this).start();
ball = new BallCollision[MAX];
int w=size().width;
int h=size().height;
//creation of balls, which have different coordinates,
//speed, direction and colors
ball[0] = new BallCollision(w,h,50,20,1.5,7.5,Color.orange);
ball[1] = new BallCollision(w,h,60,210,2.0,-3.0,Color.red);
ball[2] = new BallCollision(w,h,15,70,-2.0,-2.5,Color.pink);
ball[3] = new BallCollision(w,h,150,30,-2.7,-1.0,Color.cyan);
ball[4] = new BallCollision(w,h,210,30,2.2,-12.5,Color.magenta);
ball[5] = new BallCollision(w,h,360,170,2.2,-1.5,Color.yellow);
ball[6] = new BallCollision(w,h,210,180,-1.2,-2.5,Color.blue);
ball[7] = new BallCollision(w,h,330,30,-2.2,-1.8,Color.green);
ball[8] = new BallCollision(w,h,180,220,-2.2,-1.8,Color.white);
ball[9] = new BallCollision(w,h,330,130,-2.2,9.0,Color.gray);
public void actionPerformed(ActionEvent e)
if(e.getSource() == startButton) start = true;
can.start();
if(e.getSource() == stopButton) start = false;
can.stop();
public void start()
if (runner == null)
runner = new Thread (this);
runner.start();
public void stop()
if (runner != null)
runner.stop();
runner = null;
public void run()
while(true)
try {Thread.sleep(15);}
catch (Exception e) { }
//move our balls around
for(int i=0;i<MAX;i++)
ball.move();
handleCollision();
repaint();
boolean collide(BallCollision b1, BallCollision b2)
double wx=b1.getCenterX()-b2.getCenterX();
double wy=b1.getCenterY()-b2.getCenterY();
//the distance between 2 colling balls' centres is
//calculated by the theorem of Pythagoras
double distance=Math.sqrt(wx*wx+wy*wy);
if(distance<b1.diameter)
return true;
return false;
private void handleCollision()
//ecah ball is checked for possible collisions
for(int i=0;i<MAX;i++)
for(int j=0;j<MAX;j++)
if(i!=j)
if(collide(ball[i], ball[j]))
ball[i].hit(ball[j]);
ball[j].hit(ball[i]);
public void update(Graphics g)
paint(g);
public void paint(Graphics g)
gr.setColor(Color.black);
gr.fillRect(0,0,size().width,size().height);
//paint the balls
for(int i=0;i<MAX;i++)
ball[i].paint(gr);
g.drawImage (img,0,0, this);
class BallCollision
int width, height;
int diameter=30;
//balls' coordinates and values to be incremented for directions
double x, y, xIncremented, yIncremented, coll_x, coll_y;
boolean collide;
Color color;
Graphics g;
//constructor
public BallCollision(int w, int h, int x, int y, double xInc, double yInc, Color c)
width=w;
height=h;
this.x=x;
this.y=y;
this.xIncremented=xInc;
this.yIncremented=yInc;
color=c;
public double getCenterX() {return x+diameter/2;}
public double getCenterY() {return y+diameter/2;}
public void move()
if (collide)
double xvect=coll_x-getCenterX();
double yvect=coll_y-getCenterY();
if((xIncremented>0 && xvect>0) || (xIncremented<0 && xvect<0))
xIncremented=-xIncremented;
if((yIncremented>0 && yvect>0) || (yIncremented<0 && yvect<0))
yIncremented=-yIncremented;
collide=false;
x+=xIncremented;
y+=yIncremented;
//if the ball reaches a wall, it bounces to the opposite direction
if(x<1 || x>width-diameter)
xIncremented=-xIncremented;
x+=xIncremented;
if(y<1 || y>height-diameter)
yIncremented=-yIncremented;
y+=yIncremented;
public void hit(BallCollision b)
if(!collide)
coll_x=b.getCenterX();
coll_y=b.getCenterY();
collide=true;
public void paint(Graphics graphics)
g=graphics;
g.setColor(color);
//the coordinates in fillOval have to be int, so we cast
//explicitly from double to int
g.fillOval((int)x,(int)y,diameter,diameter);well i didnt arrive at this point without reading tutorials and researching.... sometimes other people can spot your mistakes a lot easier than you can, that's why I asked for help. 10x anyway for the interest!
-
Balls don't move in bouncing balls game.Please Help !?
I want to repaint the canvas panel in this bouncing balls game, but i do something wrong i don't know what, and the JPanel doesn't repaint?
The first class defines a BALL as a THREAD
If anyone knows how to correct the code please to write....
package ****;
//THE FIRST CLASS
class CollideBall extends Thread{
int width, height;
public static final int diameter=15;
//coordinates and value of increment
double x, y, xinc, yinc, coll_x, coll_y;
boolean collide;
Color color;
Rectangle r;
bold BouncingBalls balls; //A REFERENCE TO SECOND CLASS
//the constructor
public CollideBall(int w, int h, int x, int y, double xinc, double yinc, Color c, BouncingBalls balls) {
width=w;
height=h;
this.x=x;
this.y=y;
this.xinc=xinc;
this.yinc=yinc;
this.balls=balls;
color=c;
r=new Rectangle(150,80,130,90);
public double getCenterX() {return x+diameter/2;}
public double getCenterY() {return y+diameter/2;}
public void move() {
if (collide) {
x+=xinc;
y+=yinc;
//when the ball bumps against a boundary, it bounces off
//bounce off the obstacle
public void hit(CollideBall b) {
if(!collide) {
coll_x=b.getCenterX();
coll_y=b.getCenterY();
collide=true;
public void paint(Graphics gr) {
Graphics g = gr;
g.setColor(color);
//the coordinates in fillOval have to be int, so we cast
//explicitly from double to int
g.fillOval((int)x,(int)y,diameter,diameter);
g.setColor(Color.white);
g.drawArc((int)x,(int)y,diameter,diameter,45,180);
g.setColor(Color.darkGray);
g.drawArc((int)x,(int)y,diameter,diameter,225,180);
g.dispose(); ////////
///// Here is the buggy code/////
public void run() {
while(true) {
try {Thread.sleep(15);} catch (Exception e) { }
synchronized(balls)
move();
balls.repairCollisions(this);
paint(balls.gBuffer);
balls.canvas.repaint();
//THE SECOND CLASS
public class BouncingBalls extends JFrame{
public Graphics gBuffer;
public BufferedImage buffer;
private Obstacle o;
private List<CollideBall> balls=new ArrayList();
private static final int SPEED_MIN = 0;
private static final int SPEED_MAX = 15;
private static final int SPEED_INIT = 3;
private static final int INIT_X = 30;
private static final int INIT_Y = 30;
private JSlider slider;
private ChangeListener listener;
private MouseListener mlistener;
private int speedToSet = SPEED_INIT;
public JPanel canvas;
private JPanel p;
public BouncingBalls() {
super("****");
setSize(800, 600);
p = new JPanel();
Container contentPane = getContentPane();
final BouncingBalls xxxx=this;
o=new Obstacle(150,80,130,90);
buffer=new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_RGB);
gBuffer=buffer.getGraphics();
//JPanel canvas start
canvas = new JPanel() {
final int w=getSize().width-5;
final int h=getSize().height-5;
@Override
public void update(Graphics g)
paintComponent(g);
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
gBuffer.setColor(Color.ORANGE);
gBuffer.fillRect(0,0,getSize().width,getSize().height);
gBuffer.draw3DRect(5,5,getSize().width-10,getSize().height-10,false);
//paint the obstacle rectangle
o.paint(gBuffer);
g.drawImage(buffer,0,0, null);
//gBuffer.dispose();
};//JPanel canvas end
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
addButton(p, "Start", new ActionListener() {
public void actionPerformed(ActionEvent evt) {
CollideBall b = new CollideBall(canvas.getSize().width,canvas.getSize().height
,INIT_X,INIT_Y,speedToSet,speedToSet,Color.BLUE,xxxx);
balls.add(b);
b.start();
contentPane.add(canvas, "Center");
contentPane.add(p, "South");
public void addButton(Container c, String title, ActionListener a) {
JButton b = new JButton(title);
c.add(b);
b.addActionListener(a);
public boolean collide(CollideBall b1, CollideBall b2) {
double wx=b1.getCenterX()-b2.getCenterX();
double wy=b1.getCenterY()-b2.getCenterY();
//we calculate the distance between the centers two
//colliding balls (theorem of Pythagoras)
double distance=Math.sqrt(wx*wx+wy*wy);
if(distance<b1.diameter)
return true;
return false;
synchronized void repairCollisions(CollideBall a) {
for (CollideBall x:balls) if (x!=a && collide(x,a)) {
x.hit(a);
a.hit(x);
public static void main(String[] args) {
JFrame frame = new BouncingBalls();
frame.setVisible(true);
} This code draws only the first position of the ball:
http://img267.imageshack.us/my.php?image=51649094by6.jpgI'm trying to draw everything first to a buffer:
buffer=new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_RGB);
gBuffer=buffer.getGraphics();
The buffer is for one JPanel and then i want to draw this buffer every time when balls change their possitions(collide or just move).
The logic is something like this:
startButton -> (ball.start() and add ball to List<balls>),
ball.start() -> ball.run() -> (move allballs, paint to buffer and show buffer)
In the first class:
BouncingBalls balls; //A REFERENCE TO SECOND CLASS
In the second class:
private List<CollideBall> balls=new ArrayList();
the tames are the same but this isn't an error.
Edited by: vigour on Feb 14, 2008 7:57 AM -
Bouncing Ball without Main Method
Hi. I needed to reserch on the Internet sample code for a blue bouncing ball which I did below. However, I try coding a main class to start the GUI applet and it's not working. How can I create the appropriate class that would contain the main method to start this particular application which the author did not provide? The actual applet works great and matches the objective of my research (http://www.terrence.com/java/ball.html). The DefaultCloseOperation issues an error so that's why is shown as remarks // below. Then the code in the Ball.java class issues some warning about components being deprecated as shown below. Thank you for your comments and suggestions.
Compiling 2 source files to C:\Documents and Settings\Fausto Rivera\My Documents\NetBeansProjects\Rivera_F_IT271_0803B_01_PH3_DB\build\classes
C:\Documents and Settings\Fausto Rivera\My Documents\NetBeansProjects\Rivera_F_IT271_0803B_01_PH3_DB\src\Ball.java:32: warning: [deprecation] size() in java.awt.Component has been deprecated
size = this.size();
C:\Documents and Settings\Fausto Rivera\My Documents\NetBeansProjects\Rivera_F_IT271_0803B_01_PH3_DB\src\Ball.java:93: warning: [deprecation] mouseDown(java.awt.Event,int,int) in java.awt.Component has been deprecated
public boolean mouseDown(Event e, int x, int y) {
2 warnings
import javax.swing.*;
public class BallMain {
* @param args the command line arguments
public static void main(String[] args) {
Ball ball = new Ball();
//ball.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
ball.setSize( 500, 175 ); // set frame size
ball.setVisible( true ); // display frame
import java.awt.*;*
*import java.applet.*;
import java.util.Vector;
// Java Bouncing Ball
// Terrence Ma
// Modified from Java Examples in a Nutshell
public class Ball extends Applet implements Runnable {
int x = 150, y = 100, r=50; // Position and radius of the circle
int dx = 8, dy = 5; // Trajectory of circle
Dimension size; // The size of the applet
Image buffer; // The off-screen image for double-buffering
Graphics bufferGraphics; // A Graphics object for the buffer
Thread animator; // Thread that performs the animation
boolean please_stop; // A flag asking animation thread to stop
/** Set up an off-screen Image for double-buffering */
public void init() {
size = this.size();
buffer = this.createImage(size.width, size.height);
bufferGraphics = buffer.getGraphics();
/** Draw the circle at its current position, using double-buffering */
public void paint(Graphics g) {
// Draw into the off-screen buffer.
// Note, we could do even better clipping by setting the clip rectangle
// of bufferGraphics to be the same as that of g.
// In Java 1.1: bufferGraphics.setClip(g.getClip());
bufferGraphics.setColor(Color.white);
bufferGraphics.fillRect(0, 0, size.width, size.height); // clear the buffer
bufferGraphics.setColor(Color.blue);
bufferGraphics.fillOval(x-r, y-r, r*2, r*2); // draw the circle
// Then copy the off-screen buffer onto the screen
g.drawImage(buffer, 0, 0, this);
/** Don't clear the screen; just call paint() immediately
* It is important to override this method like this for double-buffering */
public void update(Graphics g) { paint(g); }
/** The body of the animation thread */
public void run() {
while(!please_stop) {
// Bounce the circle if we've hit an edge.
if ((x - r + dx < 0) || (x + r + dx > size.width)) dx = -dx;
if ((y - r + dy < 0) || (y + r + dy > size.height)) dy = -dy;
// Move the circle.
x += dx; y += dy;
// Ask the browser to call our paint() method to redraw the circle
// at its new position. Tell repaint what portion of the applet needs
// be redrawn: the rectangle containing the old circle and the
// the rectangle containing the new circle. These two redraw requests
// will be merged into a single call to paint()
repaint(x-r-dx, y-r-dy, 2*r, 2*r); // repaint old position of circle
repaint(x-r, y-r, 2*r, 2*r); // repaint new position of circle
// Now pause 50 milliseconds before drawing the circle again.
try { Thread.sleep(50); } catch (InterruptedException e) { ; }
animator = null;
/** Start the animation thread */
public void start() {
if (animator == null) {
please_stop = false;
animator = new Thread(this);
animator.start();
/** Stop the animation thread */
public void stop() { please_stop = true; }
/** Allow the user to start and stop the animation by clicking */
public boolean mouseDown(Event e, int x, int y) {
if (animator != null) please_stop = true; // if running request a stop
else start(); // otherwise start it.
return true;
}FRiveraJr wrote:
I believe that I stated that this not my code and it was code that I researched.and why the hll should this matter at all? If you want help here from volunteers, your code or not, don't you think that you should take the effort to format it properly? -
How to find how many times a program has been executed & by whom
Can any one help me to find log of program : Details like how many times the program(T-Code) has been executed and by whom(User ID) and when
Hi,
sy-uname will give u the name of the person.
sy-uzeit will give u the time of exection.
Not sure about number of times of execution.
<REMOVED BY MODERATOR>
regards,
Ramya
Edited by: Alvaro Tejada Galindo on Mar 19, 2008 4:15 PM -
How many times a program has been run?
Is there a transaction or table or something that tracks how many times a program has been run? The number of times the program has been run plus using the programs' attributes for last changed would help me a lot. We need this for an archiving study to determine of the client has set up the configuration correctly since they went live and have been executing the correct programs. Thanks and mucho rewards if someone has an answer. FYI - I have done a forum search and could find nothing on this topic. I have looked at the tables TADIR and no help, as well as transaction STAT.
I know ST03N transaction can be used extensively to determine how the programs were executed or even to know who all are using a particular transaction...
I tried to find if we can find the number of executions of a program through this transaction, I could not find myself...
try if you can find it through this tcode.
Phani -
After getting an update from 10.6.8 many of my programs were no longer able to open. How can I undo the update or solve this problem another way?
Do you have a bootable clone from prior to the update? If so, roll back with that.
Are your apps that won't open PPC and do they need Rosetta? Do you need to activate Rosetta?
Have you considered reinstalling 10.6 from your install disc and then coming forward with the 10.6.8 Combo Updater, then doing software update and not including whatever it was you installed that caused this propblem?
By the way - what update was it that caused this problem? -
i have a problem with my mac i have too many archives and programs and i want to delete all files and start at the begin my mac with out do format
I do not recommend reformatting your harddrive and reloading your software. This is a Windows thing. On an older mac it may be difficult to find all your software again.
Best to have greater than 2gig of free space. Many posters to these forums state that you need much more free space: 5 gig to 10 gig or 10 percent of you hd size.
(0)
Be careful when deleting files. A lot of people have trashed their system when deleting things. Place things in trash. Reboot & run your applications. Empty trash.
Go after large files that you have created & know what they are. Do not delete small files that are in a folder you do not know what the folder is for. Anything that is less than a megabyte is a small file these days.
(1)
Run
OmniDiskSweeper
"The simple, fast way to save disk space"
OmniDiskSweeper is now free!
http://www.omnigroup.com/applications/omnidisksweeper/download/
This will give you a list of files and folders sorted by size. Go after things you know that are big.
(2)
These pages have some hints on freeing up space:
http://thexlab.com/faqs/freeingspace.html
http://www.macmaps.com/diskfull.html
(3)
Buy an external firewire harddrive.
For a PPC computer, I recommend a firewire drive.
Has everything interface:
FireWire 800/400 + USB2, + eSATA 'Quad Interface'
save a little money interface:
FireWire 400 + USB 2.0
This web page lists both external harddrive types. You may need to scroll to the right to see both.
http://eshop.macsales.com/shop/firewire/1394/USB/EliteAL/eSATA_FW800_FW400_USB
(4)
Buy a flash card. -
Hello all, I'm hoping you can help me as I have accidentally deleted something in the Users and Groups pane and I don't know how I can restore it. Because of this, items on my desktop have disappeared, my trackpad behaves much differently, and many of the programs are unresponsive. Should I consider wiping it clean (I do not have any start up discs at my disposal) and is there a way to keep my operating system (Mavericks 10.9.2)?
Try to boot your MacBook Pro from recovery mode and if you have TimeMachine backup, you can restore most of stuffs
OS X: About OS X Recovery -
I have a mac book pro. Since i updated to OS 10.8, I have experienced the following:
many of the programs don't respond.
Not able to transfer file (eg pdf file og movie (VLC).
The tech tool diagnostic software (as part of apple care protection plan) stops in the middle of scanning.First, know that if you have any old PPC-only applications they will no longer work. You should uninstall them completely. Secondly, applications that don't work may require upgrades for compatibility with Mountain Lion. Thirdly, you may have a dysfunctional upgrade for which you should try this:
Reinstalling Lion/Mountain Lion Without Erasing the Drive
Boot to the Recovery HD: Restart the computer and after the chime press and hold down the COMMAND and R keys until the menu screen appears. Alternatively, restart the computer and after the chime press and hold down the OPTION key until the boot manager screen appears. Select the Recovery HD and click on the downward pointing arrow button.
Repair the Hard Drive and Permissions: Upon startup select Disk Utility from the main menu. Repair the Hard Drive and Permissions as follows.
When the recovery menu appears select Disk Utility. After DU loads select your hard drive entry (mfgr.'s ID and drive size) from the the left side list. In the DU status area you will see an entry for the S.M.A.R.T. status of the hard drive. If it does not say "Verified" then the hard drive is failing or failed. (SMART status is not reported on external Firewire or USB drives.) If the drive is "Verified" then select your OS X volume from the list on the left (sub-entry below the drive entry,) click on the First Aid tab, then click on the Repair Disk button. If DU reports any errors that have been fixed, then re-run Repair Disk until no errors are reported. If no errors are reported click on the Repair Permissions button. Wait until the operation completes, then quit DU and return to the main menu.
Reinstall Lion/Mountain Lion: Select Reinstall Lion/Mountain Lion and click on the Continue button.
Note: You will need an active Internet connection. I suggest using Ethernet if possible because it is three times faster than wireless. -
Possibility of drawing numbers on java bouncing balls?
Can anyone show me how to put numbers on these moving balls in my code. I need the numbers 1-60 on them. I have two sets the red and white. Here is my code. Any help is appreciated. I am trying to write a program to represent the powerball.
import java.awt.*;
import java.applet.*;
import java.util.*;
import javax.swing.*;
import java.awt.Rectangle;
class CollideBall{
int width, height;
public static final int diameter=20;
//coordinates and value of increment
double x, y, xinc, yinc, coll_x, coll_y;
boolean collide;
Color color;
Graphics g;
Rectangle r;
//the constructor
public CollideBall(int w, int h, int x, int y, double xinc, double yinc, Color c){
width=w;
height=h;
this.x=x;
this.y=y;
this.xinc=xinc;
this.yinc=yinc;
color=c;
r=new Rectangle(150,80,130,90);
public double getCenterX() {return x+diameter/2;}
public double getCenterY() {return y+diameter/2;}
public void alterRect(int x, int y, int w, int h){
r.setLocation(x,y);
r.setSize(w,h);
public void move(){
if (collide){
double xvect=coll_x-getCenterX();
double yvect=coll_y-getCenterY();
if((xinc>0 && xvect>0) || (xinc<0 && xvect<0))
xinc=-xinc;
if((yinc>0 && yvect>0) || (yinc<0 && yvect<0))
yinc=-yinc;
collide=false;
x+=xinc;
y+=yinc;
//when the ball bumps against a boundary, it bounces off
//ball width is 6 so if the ball becomes less then 6 it is touching the frame
//if ball is greater than the entire width-the diameter of the rectangle, then the ball is just touching the frame of the rectangle and must switch to negative to go in opposit direction
if(x<6 || x>width-diameter){
xinc=-xinc;
x+=xinc;
//same thing as about just about the Y-axis instead of the x-axis
if(y<6 || y>height-diameter){
yinc=-yinc;
y+=yinc;
public void hit(CollideBall b){
if(!collide){
coll_x=b.getCenterX();
coll_y=b.getCenterY();
collide=true;
public void paint(Graphics gr){
g=gr;
g.setColor(color);
//the coordinates in fillOval have to be int, so we cast
//explicitly from double to int
g.fillOval((int)x,(int)y,diameter,diameter);
//Draws half white and half dark gray arc around the balls to give light and shadow effect
g.setColor(Color.white);
g.drawArc((int)x,(int)y,diameter,diameter,45,180);
g.setColor(Color.darkGray);
g.drawArc((int)x,(int)y,diameter,diameter,225,180);
public class BouncingBalls extends Applet implements Runnable {
Thread runner;
Image Buffer;
Graphics gBuffer;
CollideBall ball[];
//Obstacle o;
//how many balls?
static final int MAX=60;
boolean intro=true,drag,shiftW,shiftN,shiftE,shiftS;
boolean shiftNW,shiftSW,shiftNE,shiftSE;
int xtemp,ytemp,startx,starty;
int west, north, east, south;
public void init() {
Buffer=createImage(getSize().width,getSize().height);
gBuffer=Buffer.getGraphics();
ball=new CollideBall[MAX];
int w=getSize().width-5;
int h=getSize().height-5;
//our balls have different start coordinates, increment values
//(speed, direction) and colors
for (int i = 0;i<30;i++){
ball=new CollideBall(w,h,48+i,500+i,1.5,2.0,Color.white);
ball[i+30]=new CollideBall(w,h,890+i,200+i,1.5,2.0,Color.red);
public void start(){
if (runner == null) {
runner = new Thread (this);
runner.start();
/* public void stop(){
if (runner != null) {
runner.stop();
runner = null;
public void run(){
while(true) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
try {runner.sleep(15);}
catch (Exception e) { }
//move our balls around
for(int i=0;i<MAX;i++){
ball[i].move();
handleCollision();
repaint();
boolean collide(CollideBall b1, CollideBall b2){
double wx=b1.getCenterX()-b2.getCenterX();
double wy=b1.getCenterY()-b2.getCenterY();
//we calculate the distance between the centers two
//colliding balls (theorem of Pythagoras)
double distance=Math.sqrt(wx*wx+wy*wy);
if(distance<b1.diameter)
return true;
return false;
private void handleCollision(){
//we iterate through all the balls, checking for collision
for(int i=0;i<MAX;i++)
for(int j=0;j<MAX;j++){
if(i!=j){
if(collide(ball[i], ball[j])){
ball[i].hit(ball[j]);
ball[j].hit(ball[i]);
public void update(Graphics g){
paint(g);
public void paint(Graphics g) {
gBuffer.setColor(Color.lightGray);
gBuffer.fillRect(0,0,getSize().width,getSize().height);
gBuffer.draw3DRect(5,5,getSize().width-10,getSize().height-10,false);
//paint our balls
for(int i=0;i<MAX;i++)
ball[i].paint(gBuffer);
g.drawImage (Buffer,0,0, this);
Thanks againthis.user wrote:
JakeG27 post your code within the code tab it will be more clear.
You can do this by clicking on CODE when you do this will appear { code} { code} post your code inbetween those to tags.
ie
{ code} code... { code}
and it will look like this
code
This must be the first sensible post you've ever made. At least you're able to copy someone else's response and pretend you know something. -
Some problem with bouncing balls animation
can some body tell how would i move the balls and also detect when a ball is bouncing with other ball or wall in my applet or stand alone application.my program is supposed to generate atleast 2 balls and start moving around .they should reverse their direction,when they get bounced with other balls or walls.
Hmmm....
It's really as easy as you've made it - except that when you have intensive graphics calls you should Thread it and try to use a timer to smooth the animation.
Basically you should :
paint the balls
then move them.
if they're touching/outside the bounds or touching each other reverse their direction but make sure they're within the limits before you repaint
You should checkout http://www.javagaming.org
There's alot of code samples and questions related to this kind of thing.
If you're still in trouble mail me at [email protected] and I'll send you code for a single ball simply bouncing around
Maybe you are looking for
-
I have an iPhone, and IPad. I just got a iPod. I want to create a new apple ID for the iPod so I can access face time and messages separately. However can I use the same credit card account?
-
Air Drop problem iMac to iPad air.
My iMac on 10.10.2 Yosemite cannot/will not see my iPad air on iOS8.1.3 using the AirDrop, though both are on same network and only feet apart. Why might this be???? What am I missing?
-
Random Data Selection based on Worksheet results
I need to randomly select a percentage of records in a discoverer query. So if I have 1500 records from worksheet1 I want a second worksheet to select 6% of the records from sheet one and display them. Any ideas??
-
Hello fellow Macintosh user? I use System 10.8.4, which is the latest. I enjoy owning an iMac. :-) But I came-across a possible oversight by Apple? I haven't found the Euro symbol. [The Euro symbol is a bold, arabic c with two parallel, horizont
-
Imovie 09 unexpectedly quits!
As soon as I start working Im having the problem with it unexpectedly quitting. I have been walked through the erasing of plist files. I have also restarted holding shift. Software is updated. Never had any problems with imovie 08. ughhh,,,,.... I ha