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?
BallMain.txt
TextFrame.txt
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);
}
Ball.txtBallMain.txt
TextFrame.txt
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)
{
...
}
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
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
ASKER
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.
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
no, it would contain a list of balls
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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
ASKER
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