java thread beter sig väldigt märkligt

Permalänk
Medlem

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.

Permalänk
Medlem

Först tycker jag ni ska försöka göra klasser och separata filer om ni inte har gjort det redan (Ser inte så ut iaf).
Blir mycket lättare att läsa koden och leta efter fel om koden inte är så grötig.
Sen försöka hålla samma standard på hur ni skriver koden kan vara att rekommendera också.
Brukar finnas färdiga format code selections man kan köra.
Sen finns det massor av optimeringar och annat i koden som man kan göra.

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);

Försök att undvika att skapa upp nya i varje iteration det kostar och är hel onödigt, återanvända samma och istället uppdatera positionerna etc.
Aja ska inte gå in för mycket på detta, över till felet.

Ser ni nåt mönster, stannar allt bara slumpat, eller kan ni ana efter nån tidsperiod som allt stannar?
Vad händer när ni kör en stepdebug?
Provat utan trådar?

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Svårt att säga om det finns nåt mönster. det är inte så att de slutar komma på samma sätt hela tiden, dock möjligt att det finns vissa sätt det händer på. tiden varierar allt från att ddet funkar i cirka 4 sekunder till nån minut. det jag dock kan säga är att om jag ökar hastigheten på plattformarna så slutar det funka mycket snabbare ( det är då jag har ibland fått det att bara funka i typ 4 sekunder) så det kanske är till nån hjälp. jag förstår verkligen inte heller hur mina System.out gåt från 1 till 6 och sen 7, det verkar precis som om den hoppar över allt men det funkar ändå. sen när den slutar funka så får jag 1, 2 och 3.

Permalänk
Medlem

Har för mig att java trådar ska vara "trådsäkra", prova utan trådar.
Dina trådar är inte så bra i spel, då en gameloop ska ske i korrekt ordning.
Försök att testa utan trådar till att börjar med.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770