Link to home
Start Free TrialLog in
Avatar of dgossage
dgossage

asked on

Activate graphics in new threads in java 6

I am fairly new to java and having some trouble with graphics in threads.
 
I am making an application that solves a maze by using a ball.  When the ball comes into contact with a wall at a steep angle, it will divide into two separate balls.  This is done using threads.  When a collision is triggered, the current thread will stop and two new threads will carry on with the end coordinates of the previous thread.

I have been unable to finish this part of the code as I cannot get new threads to display graphics.  For some reason, only threads declared in the superclass are able to display graphics.  Once the graphics have been sorted, I will be able to finish the ball-splitting part of the program.  I have attached snippets of the code as well as full code in txt files.  

On another note, I want to pass several variables to the new threads, such as x, y and angle. Is it possible to do this when it is creating a new version of itself?
public void run () {
		boolean alive = true;
		int x_speed = 0;
		int y_speed = 0;
		int angle = 60;
		int wall_angle = 0;
		boolean collision = false;
		int collision_angle =0;
		// lower ThreadPriority 
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 
		
		// run a long while (true) this means in our case "always" 
		while (alive = true)
		{
			System.out.println("maze(x,y)=" + maze[x_pos][y_pos]);
			x_speed = get_x(x_pos, x_speed, angle);		
			y_speed = get_y(y_pos, y_speed, angle);
			collision = detect_collision(x_pos, y_pos, collision);
			wall_angle = get_wall_angle(x_pos, y_pos, wall_angle);
			if (collision==true){
			collision_angle = get_collision_angle(angle, wall_angle, collision_angle);
				if ((collision_angle <55) || (collision_angle >125)) {
					angle = wall_angle;
					angle = solve_collision_angle(angle, wall_angle, collision_angle);
					collision=false;
				}
				else{ //make new thread
				new Thread(this).start();
				alive = false;
				break;}
			}
			
			//System.out.println(collision);
 
			x_pos += x_speed;
			//System.out.println("x = " + x_pos + " ");
			y_pos += y_speed;
			//System.out.println("y = " + y_pos + " ");
 
		// repaint the applet 
			
		repaint(); 
 
		try 
		{
		// Stop thread for 20 milliseconds 
		Thread.sleep (20); 
		} 
		catch (InterruptedException ex) 
		{
		// do nothing 
		} 
		// set ThreadPriority to maximum value 
		Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
		}
		
	} 
 
// paint function
	public void paint (Graphics draw_tip) {
 
		int i=0;
		int j=0;
		int scale = 20;
		
		super.paint(draw_tip);
		Graphics2D comp2D = (Graphics2D)draw_tip;
 
		comp2D.setPaint(Color.black);
 
		int x = 0;
		int y = 0;
		
		//draw the maze
		for (i=0; i<=19; i++){
			for (j=0; j<=19; j++){
				//System.out.println("maze[i][j] = " + maze[i][j]);
			if (big_maze[i][j] == 1){
			comp2D.fillRect(j*scale, i*scale, 20, 20);}
			}}
		
		// paint a filled colored circle 
		Graphics2D tip = (Graphics2D)draw_tip;
		tip.setPaint (Color.red); 
		tip.fillOval (x_pos - real_radius, y_pos - real_radius, 2 * real_radius, 2 * real_radius); 
	}

Open in new window

Ball.txt
BallMain.txt
TextFrame.txt
Avatar of CEHJ
CEHJ
Flag of United Kingdom of Great Britain and Northern Ireland image

Only components can display graphics so your threads will have to access the paint or paintComponent (depending on what kind of component it is) method of one of those
Also, your line 13 is eternally setting "alive" to "true," as opposed to checking to see if it is true. It should instead read:
while (alive)
{
   ...
}

Open in new window

Avatar of dgossage
dgossage

ASKER

Thanks, I thought the while loop was acting a bit funny.  Do you have any examples of threads accessing paintComponents?  Is this easy to do?
>  Do you have any examples of threads accessing paintComponents?

threads should never call paintComponent(), thats the job of the paint system.

you should separate your thread class from your component class.
your thread class is effectively a ball class and would handle updating position for that ball.
your component class would contain a list of balls which it would display
when you add a new ball, create a new ball/thread and add it to the list
Ok, I think I understand it a bit now, although I am still a novice so it doesnt sound all that straightforward. so the paint component needs to be in a separate class.  Would this be a sub-class of the ball  class or of the ball's superclass?

Could you reccomend a good tutorial for this?  Ever one Ive tried tries to put them in the same class, but are usually only dealing with drawing one object.
> Would this be a sub-class of the ball  class or of the ball's superclass?

no, it would contain a list of balls



ASKER CERTIFIED SOLUTION
Avatar of Mick Barry
Mick Barry
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks, that sounds like a better idea.  However, each ball will eventually be travelling at different dynamic velocities.  This will be done with the sleep() command.  Will this be possible, as I think the sleep() applies to the whole thread?
you wouldn't use sleep() like that  instead you should be thinking of frames per second for the entire animation and moving your balls appropriately


By that, do you mean moving each ball a certain number of pixels per frame?  And presumably writing in some code to prevent appearing in walls as well.
basically yes