java thread beter sig väldigt märkligt
Hej
håller på att utveckla ett enkelt spel jag och en kompis, har fått grund iden att funka men stött på ett problem jag verkligen inte förstår mig på. Spelet är en simpel 2D side scrolling plattformare. saken är den att efter ett tag slutar plattformarna att komma?
import javax.swing.*;
import java.awt.*;
import java.awt.Rectangle.*;
import java.awt.event.*;
import java.net.*;
import java.applet.*;
public class RotateImage extends JPanel {
int xk = 0;
int yk = 720-70-162*3;
int Layer1x = -2000;
int Layer1y = 720-70;
int Layer2x = -2000;
int Layer2y = 720-70-162;
int Layer3x = 0;
int Layer3y = 720-70-162*2;
int Layer4x = -2000;
int Layer4y = 720-70-162*3;
int character_number = 1;
int layer_number =0;
int jumptimer = 1;
int layer1_width=1318, layer2_width=1318, layer3_width=1318, layer4_width=1318;
int last_layer = 0;
int last_height = 3;
int height_decider = 0;
int animation = 0;
public volatile boolean right, left, up, down, ground, action, change, layer1, layer2, layer3, layer4, level_boolean = true;
String character_type = "Viking ";
String character_string = character_type + character_number + ".png";
String layer_type = "Earth ";
String layer_string = layer_type + "step " + layer_number + ".png";
String layer1_name="Earth step 14.png", layer2_name="Earth step 14.png", layer3_name="Earth step 14.png", layer4_name="Earth step 14.png";
Image character, buttone, buttonb, buttonv, Layer1_block, Layer2_block, Layer3_block, Layer4_block, background, sky;
Rectangle rec_character, rec_layer1, rec_layer2, rec_layer3, rec_layer4;
// Create a constructor method
public RotateImage() {
buttone = Toolkit.getDefaultToolkit().getImage("earth.png");
buttonb = Toolkit.getDefaultToolkit().getImage("back.png");
buttonv = Toolkit.getDefaultToolkit().getImage("valhalla.png");
background = Toolkit.getDefaultToolkit().getImage("hill.png");
sky = Toolkit.getDefaultToolkit().getImage("hax sky.png");
Layer1_block = Toolkit.getDefaultToolkit().getImage(layer1_name);
Layer2_block = Toolkit.getDefaultToolkit().getImage(layer2_name);
Layer3_block = Toolkit.getDefaultToolkit().getImage(layer3_name);
Layer4_block = Toolkit.getDefaultToolkit().getImage(layer4_name);
game go = new game();
go.start();
level platform = new level();
platform.start();
jump_class uptime = new jump_class();
uptime.start();
this.setFocusable(true);
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
right = true;
} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
left = true;
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
up = true;
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
down = true;
} else if (e.getKeyCode() == KeyEvent.VK_A) {
action = true;
yk=0;
System.out.println(layer1_name + " " + layer2_name + " " + layer3_name + " " + layer4_name);
}
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
right = false;
if(e.getKeyCode()==KeyEvent.VK_LEFT)
left = false;
if(e.getKeyCode()==KeyEvent.VK_UP)
up = false;
if(e.getKeyCode()==KeyEvent.VK_DOWN)
down = false;
if(e.getKeyCode()==KeyEvent.VK_A)
action = false;
}
});
}
class level extends Thread
{
public void run()
{
while(true)
{
System.out.println("check 1");
if(change==true)
{
System.out.println("check 2");
if(Layer1x + layer1_width > 0)
layer1=true;
else
layer1=false;
if(Layer2x + layer2_width > 0)
layer2=true;
else
layer2=false;
if(Layer3x + layer3_width > 0)
layer3=true;
else
layer3=false;
if(Layer4x + layer4_width > 0)
layer4=true;
else
layer4=false;
if(layer_type.equals("Ragnarock"))
{
layer_number = ((int) (0+Math.random()*12));
if(last_layer==layer_number)
{
while(last_layer==layer_number)
{
layer_number = ((int) (0+Math.random()*12));
}
}
}
else
{
layer_number = ((int) (0+Math.random()*15));
if(last_layer==layer_number)
{
while(last_layer==layer_number)
{
layer_number = ((int) (0+Math.random()*15));
}
}
}
System.out.println("check 3");
last_layer = layer_number;
height_decider = ((int) (1+Math.random()*4));
if(height_decider==1 && layer1==true || height_decider==2 && layer2==true || height_decider==3 && layer3==true || height_decider==4 && layer4==true || last_height == 1 && (height_decider == 3 || height_decider == 4) || last_height == 2 && height_decider == 4)
{
while(height_decider==1 && layer1==true || height_decider==2 && layer2==true || height_decider==3 && layer3==true || height_decider==4 && layer4==true || last_height == 1 && (height_decider == 3 || height_decider == 4) || last_height == 2 && height_decider == 4)
{
height_decider = ((int) (1+Math.random()*4));
}
}
last_height = height_decider;
layer_string = layer_type + "step " + layer_number + ".png";
System.out.println("check 4");
if(height_decider==1)
{
layer1_name = layer_string;
Layer1_block = Toolkit.getDefaultToolkit().getImage(layer1_name);
Layer1x=1280;
layer1_width=119+82*layer_number-layer_number;
}
else if (height_decider==2)
{
layer2_name = layer_string;
Layer2_block = Toolkit.getDefaultToolkit().getImage(layer2_name);
Layer2x=1280;
layer2_width=119+82*layer_number-layer_number;
}
else if (height_decider==3)
{
layer3_name = layer_string;
Layer3_block = Toolkit.getDefaultToolkit().getImage(layer3_name);
Layer3x=1280;
layer3_width=119+82*layer_number-layer_number;
}
else if (height_decider==4)
{
layer4_name = layer_string;
Layer4_block = Toolkit.getDefaultToolkit().getImage(layer4_name);
Layer4x=1280;
layer4_width=119+82*layer_number-layer_number;
}
change = false;
System.out.println("check 5");
}
System.out.println("check 6");
try{
Thread.sleep(10);}
catch(InterruptedException f){
System.out.println("sleep failar");
}
System.out.println("check 7");
}
}
}
class jump_class extends Thread
{
public void run()
{
while(true)
{
if(up==true && ground == true)
{
while(jumptimer < 100)
{
yk = yk - 3;
try {
Thread.sleep(5);
} catch (InterruptedException f) {
}
jumptimer = jumptimer + 1;
}
while(jumptimer < 160)
{
yk = yk - 2;
try {
Thread.sleep(5);
} catch (InterruptedException f) {
}
jumptimer = jumptimer + 1;
}
while(jumptimer < 220)
{
try {
Thread.sleep(5);
} catch (InterruptedException f) {
}
jumptimer = jumptimer + 1;
}
while(ground == false)
{
yk = yk + 1;
try {
Thread.sleep(5);
} catch (InterruptedException f) {
}
jumptimer = jumptimer + 1;
}
jumptimer = 0;
}
}
}
}
class game extends Thread
{
public void run()
{
while(true)
{
if (animation == 5)
{
character = Toolkit.getDefaultToolkit().getImage(character_string);
if(character_number==1)
xk = 10;
else if(character_number==2)
xk = 7;
else if(character_number==3)
xk = 5;
else if(character_number==4)
xk = 1;
else if(character_number==5)
xk = -4;
else if(character_number==6)
xk = 1;
else if(character_number==7)
xk=6;
else if(character_number==8)
xk =7;
character_number = character_number + 1;
if(character_number == 9)
character_number = 1;
character_string = character_type + character_number + ".png";
animation = 0;
}
rec_character = new Rectangle(xk, yk, 81, 116);
rec_layer4 = new Rectangle(Layer4x, Layer4y, layer4_width, 42);
rec_layer3 = new Rectangle(Layer3x, Layer3y, layer3_width, 42);
rec_layer2 = new Rectangle(Layer2x, Layer2y, layer2_width, 42);
rec_layer1 = new Rectangle(Layer1x, Layer1y, layer1_width, 42);
if(down==true && rec_character.intersects(rec_layer4) || down==true && rec_character.intersects(rec_layer3) || down==true && rec_character.intersects(rec_layer2) || down==true && rec_character.intersects(rec_layer1))
{
ground = false;
yk= yk + 2;
}
else if (rec_character.intersects(rec_layer4) && yk + 113 > Layer4y ||rec_character.intersects(rec_layer3) && yk + 113 > Layer3y || rec_character.intersects(rec_layer2) && yk + 113 > Layer2y || rec_character.intersects(rec_layer1) && yk + 113 > Layer1y)
{
ground = false;
yk = yk + 2;
}
else if(rec_character.intersects(rec_layer4) ||rec_character.intersects(rec_layer3) || rec_character.intersects(rec_layer2) || rec_character.intersects(rec_layer1))
{
ground = true;
}
else
{
ground = false;
yk = yk + 2;
}
Layer1x = Layer1x-3;
Layer2x = Layer2x-3;
Layer3x = Layer3x-3;
Layer4x = Layer4x-3;
if(Layer1x + layer1_width >= 1080 || Layer2x + layer2_width >= 1080 || Layer3x + layer3_width >= 1080 || Layer4x + layer4_width >= 1080)
{
change = false;
}
else
{
change = true;
}
repaint();
try{
Thread.sleep(10);}
catch(InterruptedException f){
}
animation++;
}
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g; // Create a Java2D version of g.
g2d.rotate(0); // Rotate the image by 1 radian.
g2d.drawImage(sky, 0, 0, this);
g2d.drawImage(background, 0, 720-325, this);
g2d.drawImage(Layer1_block, Layer1x, Layer1y, this);
g2d.drawImage(Layer2_block, Layer2x, Layer2y, this);
g2d.drawImage(Layer3_block, Layer3x, Layer3y, this);
g2d.drawImage(Layer4_block, Layer4x, Layer4y, this);
g2d.drawImage(character, xk, yk, this);
}
public static void main(String[] arg) {
try
{
URL musicurl = new URL("file:spanishf.mid");
AudioClip musicclip = Applet.newAudioClip(musicurl);
musicclip.loop();
}
catch (MalformedURLException m)
{
}
JFrame frame = new JFrame("Viking");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1280, 720);
RotateImage panel = new RotateImage();
frame.setContentPane(panel);
frame.setVisible(true);
frame.setResizable(false);
}
}
i threaden level så bestäms platformarnas längd genom en random variabel, sedan kollar den upp vilken höjd platformen ska ligga på och ger den sen rätt storlek på kollisionsrutan. Som sagt slutar det dock att funka efter ett tag och jag kan verkligen inte förstå varför. när jag lagt in 7 stycken check variabler så förstår jag ännu mindre. Den skriver ut 1, 6 och 7 fram tills den sista plattformen ( som vad jag förstår inte följer nåt bestämt mönster, möjligt dock att den har vissa möjliga "slut") då den skriver ut 1, 2 och 3 och sen inget mer. Det är precis som om while satsen dör.
Hoppas nån kan hjälpa oss.