ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
519
519
EMPFEHLEN
-
Hallo,

ich hab ein kleines Pong Spiel programmiert allerdings kann man dieses Spiel nicht auf jedem PC vernünftig ausführen. Dieses Spiel war ein Schulprojekt von mir und in dieser Schule hatten wir Rechner mit der selben Hardware und Software alles zu 100% gleich doch mein Spiel lief nur an meinem Platz und auf dem Rechner eines Mitschülers Zuhause an sonst keinem einzigen Platz, bei den Lehrern Zuhause und bei mir lief das Spiel auch nicht und ich weiß nicht woran das liegen kann. An der Version von Java kann es nicht liegen, da die Rechner in der Schule alle auf dem gleichen Stand sind und Fehlermeldungen werden auch nicht ausgegeben. Das einzigste Problem ist, dass das Spiel außer auf den 2 genannten Rechnern hängen bleibt und man auf dem Formular nichts mehr sieht.
-
Hallo Baopi,
wie startest du denn das Spiel? Direkt aus der Entwicklungsumgebung, von der Konsole oder hast du dir ein .jar File erstellt?
Schöne Grüßewww.itblogging.de - Informationen rund um die Informatik
Themen: Java, RCP, RAP, Linux, Shell, Ajax, Eclipse, Netzwerk, Security, PHP
-
20.10.10 21:02 #3SPiKEe Tutorials.de Gastzugang
ich kennen dieses problem ...
das passiert zur zeit aber nicht nur in apps sondern auch in applets
ich bin bei einem bekannten chat-system angemeldet welches ebenfalls java verwendet ...
auf meinem rechner ist das Java7-EA-b76 installiert ...
zusätzlich noch Java6 Update20
auf einem virtuellen rechner habe ich nur Java5.0 Update13 drauf ...
alle drei versionen lösen bei diesem chat-system einen änlichen fehler aus ...
an einem gewissen punkt bleibt nicht nur die GUI hängen sondern die gesamte VM und manchmal sogar mein browser gleich mit *mit verschiedenen kombinationen probiert*
jedoch kann ich alles andere ohne verzögerungen / abstürze ausführen ...
ich vermute daher das es an entweder an einem unsauberen programmier-stil liegt der sich halt gerne in DEADLOCKS verfängt oder probleme in der VM selbst welche durch ungewönliche konstrukte und innere abläufe hervorgerufen werden ...
ich denke da wir zwei nicht die einzigen sind die in letzter zeit ein solches verhalten von java mitbekommen haben *und das mit unterschiedlichen versionen und vor allem völlig von einander unabhängigen code* werden das wohl keine einzelfälle sein ...
wird wohl n rätzel bleiben was hier vor sich geht ...
wobei ich auch über eine klärung ganz froh wäre
-
ich starte es direkt aus der Entwicklungsumgebung
danke für deine Antwort Z-mon
-
Danke SPiKEe für diese Ausführliche Erklärung
-
Ein Chat verwendet auf jeden Fall Threads. Verwendet dein Pong Spiel auch Threads? Dann kann es durchaus sein, dass es durch unsaubere Programmierung zu solche Fehlern kommt, da sich die VM in den letzten Java-Versionen innerhalb der Spezifikation etwas anders verhält als zuvor. Threads werden z.B. häufiger mal zwischendurch aufgeweckt (spurious wakeup) was zwar immer schon erlaubt war, aber vorher einfach selten auftrat. Wenn dann die Bedingung nachdem aufwachen nicht erneut geprüft wird und das Programm annimmt dass die Bedingung eingetreten ist, wird natürlich auf einem eigentlich inkonsistenten Stand weitergearbeitet.
Diese Probleme betrafen auch große Softwarefirmen, weswegen die Umstellung von Java 1.4 auf die weiteren Versionen doch langsamer vonstatten ging als eigentlich angenommen.
Sollen wir uns dein Programm mal anschauen Baopi?
-
Ja gerne, ich werde es mal kopieren
aber nicht lachen .... gut programmiert ist es nicht
sowas hatten wir vorher noch nicht in der Schule also keine objektorientierte Programmierung, keine Formulare usw. und ich stand unter Zeitdruck =D
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675
import java.awt.*; import javax.swing.*; import java.awt.Toolkit; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JWindow; import java.awt.Label; public class PingPong extends JFrame { private final Dimension dim = new Dimension(600,300); private final Dimension pos = Toolkit.getDefaultToolkit().getScreenSize(); private Graphics2D bilder; private boolean[] druektasten = new boolean[7]; private boolean xrechts=true,xlinks=false,xrechts2=false,xlinks2=true,xrechts3=true,xlinks3=false,xrechts4=false,xlinks4=true,da1=true,da2=false,da3=false,da4=false,sicher=true; private int groesseschl1=50,groesseschl2=50,kollisionoben=40,x3=dim.width/2,y3=dim.height/2,ballx=10,bally=10,punktr=0,punktl=0,x4=dim.width/2,y4=dim.height/2,x5=dim.width/2,y5=dim.height/2,x6=dim.width/2,y6=dim.height/2; private int y1=dim.height/2-groesseschl1/2,y2=dim.height/2-groesseschl2/2,test=1,einmalL,einmalR,test2=1,pf=0,pf2=0,test3=2,test4=2,neu=3,geschw1=150,geschw2=180,geschw3=210,geschw4=120,kolschl1=20,kolschl2=20,tasth=1,tastg=1; final static int hoch=0,runter=1,w=2,s=3,b=4,h=5,g=6; private Thread bewegung = new Thread() //Thread für die Bewegung der Schläger { public void run() //Beginn des runns des Threads { while(true) //Endlosschleife für die Schläger { bilder.clearRect(585,y1,5,groesseschl1); //Schläger rechts wird "entfernt" bilder.clearRect(10,y2,5,groesseschl2); //Schläger links wird "entfernt" if(druektasten[hoch]) //überprüft ob die Variable druektasten[hoch] wahr ist { if(y1>kollisionoben) //überprüft ob y1 des rechten Schlägers größer als die Variable kollisionoben ist { y1 -=20; //wenn dies zutrifft, dann wird die Variable y1 um 20 verringert (der Schläger1 geht nach oben) } } if(druektasten[runter]) //überprüft ob die Variable druektasten[runter] wahr ist { if(y1<dim.height-groesseschl1-20) //überprüft ob y1 des rechten Schlägers kleiner als die Höhe des Frames minus die größe des Schlägers minus 20 ist { y1 +=20; //wenn dies zutrifft, dann wird die Variable y1 um 20 erhöht (der Schläger1 geht nach unten) } } if(druektasten[w]) //überprüft ob die Variable druektasten[w] wahr ist { if(y2>kollisionoben) //überprüft ob y2 des rechten Schlägers größer als die Variable kollisionoben ist { y2 -=20; //wenn dies zutrifft, dann wird die Variable y2 um 20 verringert (der Schläger2 geht nach oben) } } if(druektasten[s]) //überprüft ob die Variable druektasten[w] wahr ist { if(y2<dim.height-groesseschl2-20) //überprüft ob y2 des linken Schlägers kleiner als die Höhe des Frames minus die größe des Schlägers minus 20 ist { y2 +=20; //wenn dies zutrifft, dann wird die Variable y2 um 20 erhöht (der Schläger2 geht nach unten) } } bilder.fillRect(585,y1,5,groesseschl1); //zeichnet den rechten Schläger neu bilder.fillRect(10,y2,5,groesseschl2); //zeichnet den linken Schläger neu try { sleep(50); //Pause für 50 Millisekunden (damit die Schläger nicht zu schnell sind) } catch (InterruptedException e) { e.printStackTrace(); } } } }; private Thread ball = new Thread() //Thread für den ersten Ball { public void run() //Beginn des runns des Threads { while(true) //Endlosschleife { while(xrechts) //Schleife für den Flug des ersten Balles nach rechts { if(da1) //überprüft ob da1 wahr ist { if(y3+20>=dim.height) //wenn y3+20 größer oder gleich der Höhe des Frames ist { test=2; //wird test auf 2 gesetzt } else if(y3<=kollisionoben) //wenn y3 kleiner oder gleich kollisionoben ist { test=1; //wird test auf 1 gesetzt } bilder.clearRect(x3,y3,ballx,bally); //der Ball wird entfernt x3 +=10; //x3 wird um 10 erhöht (der erste Ball fliegt nach rechts) if(test==1) //wenn test gleich 1 ist { y3 +=10; //wird y3 um 10 erhöht (der erste Ball fliegt nach unten) } else if(test==2) //wenn test gleich 2 ist { y3 -=10; //wird y3 um 10 verringert (der erste Ball fliegt nach oben) } bilder.fillOval(x3,y3,ballx,bally); //der Ball wird gezeichnet try { sleep(geschw1); //Pause für die Länge geschw1 (damit der erste Ball nicht zu schnell ist) } catch (InterruptedException e) { e.printStackTrace(); } if(x3>580) //wenn x3 größer als 580 ist (also rechts aus dem Bild geht) { punktl +=1; //dann wird punktl um 1 erhöht bilder.clearRect(x3,y3,ballx,bally); //der Ball wird entfernt da1=false; //da1 wird auf false gesetzt neu +=1; //neu wird um 1 erhöht x3=dim.width/2; //x3 wird auf die Breite des Frames geteilt durch 2 gesetzt y3=dim.height/2; //y3 wird auf die Höhe des Frames geteilt durch 2 gesetzt (dadurch ist er in der Mitte des Frames) JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL); //die Klasse PunkteL wird aufgerufen und ihr werden Variablen übergeben einmalL=1; //einmalL wird auf 1 gesetzt } if((x3>=580-20)&&(y3<=y1+kolschl1+groesseschl1/2)&&(x3>=585-20)&&(y3>=y1+kolschl1-groesseschl1/2)) //damit wird gesagt, dass wenn der erste Ball gegen den rechten Schläger kommt, dass { xrechts=false; //xrechts auf false gesetzt wird xlinks=true; //xlinks auf true gesetzt wird if(geschw1>10) //wenn die Geschwindigkeit des ersten Balls höher als 10 ist, { geschw1 -=10; //dann wird die Geschwindigkeit des ersten Balls um 10 verringert } } } } while(xlinks) //die Schleife für den Flug des ersten Balles nach links { if(da1) //wenn da1 auf true ist { if(y3+20>=dim.height) //wenn y3+20 größer oder gleich der Höhe des Frames ist { test=2; //wird test auf 2 gesetzt } else if(y3<=kollisionoben) //wenn y3 kleiner oder gleich kollisonoben ist { test=1; //wird test auf 1 gesetzt } bilder.clearRect(x3,y3,ballx,bally); //der Ball wird entfernt x3 -=10; //x3 wird um 10 verringert (der erste Ball fliegt nach links) if(test==1) //wenn test gleich 1 ist { y3 +=10; //wird y3 um 10 erhöht (der erste Ball fliegt nach unten) } else if(test==2) //wenn test gleich 2 ist { y3 -=10; //wird y3 um 10 verringert (der erste Ball fliegt nach oben) } bilder.fillOval(x3,y3,ballx,bally); //der erste Ball wird gezeichnet try { sleep(geschw1); //Pause für die Höhe von geschw1 (damit der erste Ball nicht zu schnell ist) } catch (InterruptedException e) { e.printStackTrace(); } if(x3<=0) //wenn x3 kleiner oder gleich 0 ist (also links aus dem Bild geht) { punktr +=1; //wird punktr um 1 erhöht bilder.clearRect(x3,y3,ballx,bally); //der erste Ball wird entfernt da1=false; //da1 wird auf false gesetzt neu +=1; //neu wird um 1 erhöht x3=dim.width/2; //x3 wird auf die Breite des Frames geteilt durch 2 gesetzt y3=dim.height/2; //y3 wird auf die Höhe des Frames geteilt durch 2 gesetzt JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR); //dke Klasse PunteR wird aufgerufen und ihr werden Variable übergeben einmalR=1; //einmalR wird auf 1 gesetzt } if((x3<=20)&&(y3<=y2+kolschl2+groesseschl2/2)&&(x3<=20)&&(y3>=y2+kolschl2-groesseschl2/2)) //beschreibt, dass wenn der erste Ball gegen den linken Schläger kommt, dass { xlinks=false; //xlinks auf false gestezt wird xrechts=true; //xrechts auf true gesetzt wird if(geschw1>10) //wenn geschw1 görßer als 10 ist { geschw1 -=10; //wird geschw1 um 10 verringert } } } } } } }; private Thread ball2 = new Thread() //das Gleiche wie bei dem ersten Ball nur für den zweiten Ball { public void run() { while(true) { while(xrechts2) { if(da2) { if(y4+20>=dim.height) { test2=2; } else if(y4<=kollisionoben) { test2=1; } bilder.clearRect(x4,y4,ballx,bally); x4 +=10; if(test2==1) { y4 +=10; } else if(test2==2) { y4 -=10; } bilder.fillOval(x4,y4,ballx,bally); try { sleep(geschw2); } catch (InterruptedException e) { e.printStackTrace(); } if(x4>580) { punktl +=1; bilder.clearRect(x4,y4,ballx,bally); da2=false; neu +=1; x4=dim.width/2; y4=dim.height/2; JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL); einmalL=1; } if((x4>=580-20)&&(y4<=y1+kolschl1+groesseschl1/2)&&(x4>=585-20)&&(y4>=y1+kolschl1-groesseschl1/2)) { xrechts2=false; xlinks2=true; if(geschw2>10) { geschw2 -=10; } } } } while(xlinks2) { if(da2) { if(y4+20>=dim.height) { test2=2; } else if(y4<=kollisionoben) { test2=1; } bilder.clearRect(x4,y4,ballx,bally); x4 -=10; if(test2==1) { y4 +=10; } else if(test2==2) { y4 -=10; } bilder.fillOval(x4,y4,ballx,bally); try { sleep(geschw2); } catch (InterruptedException e) { e.printStackTrace(); } if(x4<=0) { punktr +=1; bilder.clearRect(x4,y4,ballx,bally); da2=false; neu +=1; x4=dim.width/2; y4=dim.height/2; JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR); einmalR=1; } if((x4<=20)&&(y4<=y2+kolschl2+groesseschl2/2)&&(x4<=20)&&(y4>=y2+kolschl2-groesseschl2/2)) { xlinks2=false; xrechts2=true; if(geschw2>10) { geschw2 -=10; } } } } } } }; private Thread ball3 = new Thread() //das Gleiche wie bei dem ersten Ball nur für den dritten Ball { public void run() { while(true) { while(xrechts3) { if(da3) { if(y5+20>=dim.height) { test3=2; } else if(y5<=kollisionoben) { test3=1; } bilder.clearRect(x5,y5,ballx,bally); x5 +=10; if(test3==1) { y5 +=10; } else if(test3==2) { y5 -=10; } bilder.fillOval(x5,y5,ballx,bally); try { sleep(geschw3); } catch (InterruptedException e) { e.printStackTrace(); } if(x5>580) { punktl +=1; bilder.clearRect(x5,y5,ballx,bally); da3=false; neu +=1; x5=dim.width/2; y5=dim.height/2; JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL); einmalL=1; } if((x5>=580-20)&&(y5<=y1+kolschl1+groesseschl1/2)&&(x5>=585-20)&&(y5>=y1+kolschl1-groesseschl1/2)) { xrechts3=false; xlinks3=true; if(geschw3>10) { geschw3 -=10; } } } } while(xlinks3) { if(da3) { if(y5+20>=dim.height) { test3=2; } else if(y5<=kollisionoben) { test3=1; } bilder.clearRect(x5,y5,ballx,bally); x5 -=10; if(test3==1) { y5 +=10; } else if(test3==2) { y5 -=10; } bilder.fillOval(x5,y5,ballx,bally); try { sleep(geschw3); } catch (InterruptedException e) { e.printStackTrace(); } if(x5<=0) { punktr +=1; bilder.clearRect(x5,y5,ballx,bally); da3=false; neu +=1; x5=dim.width/2; y5=dim.height/2; JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR); einmalR=1; } if((x5<=20)&&(y5<=y2+kolschl2+groesseschl2/2)&&(x5<=20)&&(y5>=y2+kolschl2-groesseschl2/2)) { xlinks3=false; xrechts3=true; if(geschw3>10) { geschw3 -=10; } } } } } } }; private Thread ball4 = new Thread() //das Gleiche wie bei dem ersten Ball nur für den vierten Ball { public void run() { while(true) { while(xrechts4) { if(da4) { if(y6+20>=dim.height) { test4=2; } else if(y6<=kollisionoben) { test4=1; } bilder.clearRect(x6,y6,ballx,bally); x6 +=10; if(test4==1) { y6 +=10; } else if(test4==2) { y6 -=10; } bilder.fillOval(x6,y6,ballx,bally); try { sleep(geschw4); } catch (InterruptedException e) { e.printStackTrace(); } if(x6>580) { punktl +=1; bilder.clearRect(x6,y6,ballx,bally); da4=false; neu +=1; x6=dim.width/2; y6=dim.height/2; JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL); einmalL=1; } if((x6>=580-20)&&(y6<=y1+kolschl1+groesseschl1/2)&&(x6>=585-20)&&(y6>=y1+kolschl1-groesseschl1/2)) { xrechts4=false; xlinks4=true; if(geschw4>10) { geschw4 -=10; } } } } while(xlinks4) { if(da4) { if(y6+20>=dim.height) { test4=2; } else if(y6<=kollisionoben) { test4=1; } bilder.clearRect(x6,y6,ballx,bally); x6 -=10; if(test4==1) { y6 +=10; } else if(test4==2) { y6 -=10; } bilder.fillOval(x6,y6,ballx,bally); try { sleep(geschw4); } catch (InterruptedException e) { e.printStackTrace(); } if(x6<=0) { punktr +=1; bilder.clearRect(x6,y6,ballx,bally); da4=false; neu +=1; x6=dim.width/2; y6=dim.height/2; JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR); einmalR=1; } if((x6<=20)&&(y6<=y2+kolschl2+groesseschl2/2)&&(x6<=20)&&(y6>=y2+kolschl2-groesseschl2/2)) { xlinks4=false; xrechts4=true; if(geschw4>10) { geschw4 -=10; } } } } } } }; public PingPong() { super("PingPong"); //Frame wird erzeugt setDefaultCloseOperation(EXIT_ON_CLOSE); //Wenn der Frame geschlossen wird wird die DOS-BOX beendet setResizable(false); //der Frame wird in der Größe unveränderbar setSize(dim); //die Größe des Frames wird gesetzt // ImageIcon icon1 = new ImageIcon( PingPong.class.getResource( "tennisfeld.gif" ) ); // JLabel tennis = new JLabel( icon1 ); // add( tennis, BorderLayout.LINE_START ); setLocation( (pos.width - dim.width ) / 2,(pos.height - dim.height) / 2 ); //die Position des Frames wird bestimmt addKeyListener(new KeyAdapter() //Beginn des KeyListeners { public void keyPressed(KeyEvent evt) //bei gedrückter Taste { pruef(evt.getKeyCode(),true); //der Variable pruef wird der Tastencode der gedrückten Taste und den Wert true übergeben } public void keyReleased(KeyEvent evt) //bei loslassen der gedrückten Taste { pruef(evt.getKeyCode(),false); //der Variable pruef wird der Tastencode der losgelassenen Taste und den Wert false übergeben } public void keyTyped(KeyEvent evt2) //bei kurzem drücken einer Taste { if(druektasten[b]) //wenn druektasten[b] wahr ist { if(neu>0) //wenn neu größer als 0 ist { neu -=1; //wird neu um 1 verringert if(da1==false) //wenn da1 gleich false ist { da1=true; //wird da1 auf true gestezt geschw1=150; //wird die Geschwindigkeit von dem ersten Balls auf 150 gesetzt } else if(da2==false) //wenn da2 gleich false ist { da2=true; //wird da2 auf true gesetzt geschw2=180; //wird die Geschwindigkeit von dem zweiten Balls auf 180 gesetzt } else if(da3==false) //wenn da3 gleich false ist { da3=true; //wird da3 auf true gesetzt geschw3=210; //wird die Geschwindigkeit von dem dritten Balls auf 210 gesetzt } else if(da4==false) //wenn da4 gleich false ist { da4=true; //wird da4 auf true gesetzt geschw4=170; //wird die Geschwindigkeit von dem vierten Balls auf 170 gesetzt } } } if(druektasten[h]) //wenn druektasten[h] wahr ist { if(tasth==1) //wenn tasth gleich 1 ist { if(y1<=kollisionoben) //wenn y1 kleiner oder gleich kollisionoben ist { groesseschl1=300; //wird die größe des rechten Schlägers auf 300 gesetzt kolschl1=100; //die Kollision des rechten schlägers wird auf 100 gesetzt tasth=0; //tasth wird auf 0 gesetzt } } else if(tasth==0) //wenn tasth gleich 0 ist { groesseschl1=50; //wird die Größe des rechten Schlägers auf 50 gesetzt kolschl1=20; //die Kolllision des rechten Schlägers wird auf 20 gesetzt tasth=1; bilder.clearRect(585,0,5,300); //der rechte Schläger wird entfernt } } if(druektasten[g]) //das Gleiche wie bei Taste h nur mit der Taste g und dem linken Schläger { if(tastg==1) { if(y2<=kollisionoben) { groesseschl2=300; kolschl2=100; tastg=0; } } else if(tastg==0) { groesseschl2=50; kolschl2=20; tastg=1; bilder.clearRect(10,0,5,300); } } } private void pruef(int taste,boolean wert) { switch(taste) { case KeyEvent.VK_UP: //wenn die Taste Hoch gedrückt ist druektasten[hoch]=wert; //wird druektasten[hoch] auf den Wert von wert gesetzt break; //Abbruch case KeyEvent.VK_DOWN: //Wenn die Taste Runter gedrückt ist druektasten[runter]=wert; //wird druektasten[runter] auf den Wert von wert gesetzt break; //Abbruch case KeyEvent.VK_W: //wenn die Taste W gedrückt ist druektasten[w]=wert; //wird druektasten[w] auf den Wert von wert gesetzt break; //Abbruch case KeyEvent.VK_S: //wenn die Taste S gedrückt ist druektasten[s]=wert; //wird druektasten[s] auf den Wert von wert gesetzt break; //Abbruch case KeyEvent.VK_B: //wenn die Taste B gedrückt ist druektasten[b]=wert; //wird druektasten[b auf den Wert von wert gesetzt break; //Abbruch case KeyEvent.VK_H: //wenn die Taste H gedrückt ist druektasten[h]=wert; //wird druektasten[h] auf den Wert von wert gesetzt break; //Abbruch case KeyEvent.VK_G: //wenn die Taste G gedrückt ist druektasten[g]=wert; //wird druektasten[g] auf den Wert von wert gesetzt break; //Abbruch default:; //wenn nichts davon zutrifft } } }); setVisible(true); //der Frame wird gezeigt bilder = (Graphics2D)this.getGraphics(); //damit kann gezeichnet werden } public static void main(String[] args) { new PingPong().start(); } private void start() { JWindow pkt1 = new PunkteR(100,100,600/2,300/2,punktr,einmalR); //die Klasse PunkteR wird aufgerufen und ihr werdne Variablen übergeben JWindow pkt2 = new PunkteL(100,100,-600/2-100,300/2,punktl,einmalL); //die Klasse PunkteL wird aufgerufen und ihr werdne Variablen übergeben bewegung.start(); //der Thread Bewegung wird gestartet ball.start(); //der Thread für den ersten Ball wird gestartet ball2.start(); //der Thread für den zweiten Ball wird gestartet ball3.start(); //der Thread für den dritten Ball wird gestartet ball4.start(); //der Thread für den vierten Ball wird gestartet } }Geändert von Baopi (21.10.10 um 17:31 Uhr)
-
21.10.10 20:20 #8SPiKEe Tutorials.de Gastzugang
da die klassen PunkteL.java und PunkteR.java fehlen ist ein compilen nicht möglich ...
bitte diese klassen auch noch posten *und eventuell weitere* damit wir das ding compilen und testen können
dann die frage : warum 4 bälle und warum für jeden eigene variablien und eigene threads ?
spielst du mit 4 bällen gleichzeitig ?
die funktion für B H und G sind nicht ersichtlich ... bitte mal erklären was diese machen
warum sind PunkteR und PunkteL vom Type JWindow ? ... werden diese sichtbar dagestellt ? wofür dienen sie ? was ist in den klassen drin ? *bitte posten*
deine threads werden falsch invoked ...
du musst schreiben
(new Thread()).start();
und nicht einfach
Thread.start();
ist klar das das so nichts werden kann ...
wie gesagt ... mal bitte die fragen beantworten und fehlendes material posten ...
-
ja ich spiele mit 4 Bällen zur gleichen Zeit
die Taste "B" ist um einen neuen Ball einfügen zu können
die Taste "G" und "H" sind nur um die Schläger nach einer bestimmten Bedingung so groß zu machen dass die Bälle nicht mehr aus dem spiel fliegen können war zu dies diente nur zu Testzwecken.
(new Thread()).start(); habe ich getestet doch da gibt der compiler nur iene Fehlermeldung aus
und der rest kommt jetz
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
//linke Punktetafel import java.awt.*; import java.awt.event.*; import javax.swing.JWindow; import javax.swing.JLabel; import javax.swing.border.Border; import javax.swing.border.LineBorder; public class PunkteL extends JWindow { private JLabel label; public PunkteL(int x,int y,int posx, int posy,int punkt,int einmal) { Border border = LineBorder.createBlackLineBorder(); //Umrandung für das Window setSize(x, y); //Größe des Windows Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); //übergibt d die Bildschirmgröße setLocation((d.width-getSize().width)/2+posx+(getSize().width)/2,(d.height-getSize().height)/2-posy+(getSize().height)/2); //die Position wird gesetzt label = new JLabel(String.valueOf(punkt)); //Label mit der Ausgabe des Werts der Variable punkt wird wird bestimmt label.setFont(new Font("Arial",Font.BOLD,50)); //die Schriftart und Größe wird des Labels wird bestimmt label.setBorder(border); //Umrandung für das Label add(label); //Label wird hinzugefügt setVisible(true); //Window wird sichtbar gemacht } }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
//rechte Punktetafel import java.awt.*; import java.awt.event.*; import javax.swing.JWindow; import javax.swing.JLabel; import javax.swing.border.Border; import javax.swing.border.LineBorder; public class PunkteR extends JWindow { private JLabel label; public PunkteR(int x,int y,int posx, int posy,int punkt,int einmal) { Border border = LineBorder.createBlackLineBorder(); //Umrandung für das Window setSize(x, y); //Größe des Windows Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); //übergibt d die Bildschirmgröße setLocation((d.width-getSize().width)/2+posx+(getSize().width)/2,(d.height-getSize().height)/2-posy+(getSize().height)/2); //die Position wird gesetzt label = new JLabel(String.valueOf(punkt)); //Label mit der Ausgabe des Werts der Variable punkt wird wird bestimmt label.setFont(new Font("Arial",Font.BOLD,50)); //die Schriftart und Größe wird des Labels wird bestimmt label.setBorder(border); //Umrandung für das Label add(label); //Label wird hinzugefügt setVisible(true); //Window wird sichtbar gemacht } }
und nochmal danke für die Hilfe
-
23.10.10 14:05 #10SPiKEe Tutorials.de Gastzugang
gut ... nach dem ich dran rumgebastelt hab ohne ende und es dann doch irgendwie zum laufen bekommen hab muss ich sagen
SCHREIBE DAS BITTE NOCHT MAL NEU
es geht garnicht wie viele fehler da drin sind
wie viele neu-instanzierungen ... wie viele FEHLER-instanzierungen
überladungen
duplikationen
logik-fehler
ne ... also davon abgesehen das ich das schon beim ersten überfliegen des codes gesehen hab und mir nur gedacht hab : oh gott wird das witzig ... aber ich hab mich im vor-post ja noch zurück gehalten ...
aber jetzt reicht es mir ...
ich kann mich gerne dran machen und versuchen das noch mal von grund auf neu strukturieren und neu implementieren ...
aber so wie das jetzt ist es kein wunder das es einfach nicht funktioniert ...
von der extremen auslastung abgesehen ...
kleiner tipp : es liegt nicht daran das überhaupt nichts passiert ... es liegt nur daran das NICHTS gezeichnet wird ...
denk über diesen tipp nach und versuch mal was dagegen zu tun ...
wenn du das angebot annehmen willst das ich mal versuche das ganze neu zu implementieren schreib es einfach
-
Das starten der Threads ist schon okay.
Laufen tut das Spiel bei mir auch nicht. Was aber auch kein Wunder ist, da ich einen Dual-Core habe und die Threads damit wirklich gegeneinander laufen können. Das Problem ist dass du ohne jegliche Synchronisierung auf die selben Variablen von allen Threads zugreifst.
Dieses Problem solltest du erstmal beheben, denn so wie ich das spontan sehe, ist es für die meisten Variablen auch gar nicht nötig. Jeder Ball sollte seinen eigenen Status und seine eigenen Variablen haben.
Als Regel: Ohne Synchronisierung darfst du nur auf Variablen zugreifen, die nicht mehr veränderlich sind.
Bei einer InterruptedException in einem Thread, solltest du die Endlosschleife verlassen und nicht nur den Fehler ausgeben
-
SPiKEe: Das dachte ich mir auch

Irgendwo hier im Forum gibt's schon nette Pong-Implementierung, also neu schreiben von dir hat für ihn ja keinen Lerneffekt
-
23.10.10 16:52 #13SPiKEe Tutorials.de Gastzugang
doppel-post FTW
was das mit den threads angeht ... ich habs mal anstatt mit anonymen-inneren-klassen mal mit diskreten klassen probiert *also nichts verschachtelt sondern dierekt als eigene klasse* ... effekt leider der selbe
das man threads auch so deklarieren und starten kann wusste ich nicht ... aber wenns laut dir keinen unterschied macht glaub ich dir das einfach mal
das mit der parallel-läufigkeit auf multi-core systemen halte ich für wenig warscheinlich
ich habe es soweit zum laufen bekommen das ich ungefähr eine runde lange hin-und-her spielen konnte ...
so bald allerdings der ball ausm spiel lief is das teil in dem sinne nicht abgestürzt ... ich konnte also mit der funktion einen neuen sich sogar bewegenden ball hinzufügen ... aber irgendwann nahmen die updates dermaßen zu das die app garnicht mehr dazu kam zu zeichnen ... hier muss auf jedenfall synchronized werden ...
und ich habe nur ein 1-core-system ...
und das mit der neu-implementation von mir war auch eingentlich mehr als hilfe-stellung gemeint ... nicht das ich seine arbeit mache ...
das es hier beispiele noch und nöcher gibt ... ich denke da wird die sufu ordentlich was liefern können ...
also ... um mich noch mal etwas verständlicher auszudrücken
hilfe von uns : ja ...
abnehmen von arbeit : nein
entscheid also was du möchtest
-
nee wenn dann mach ich das selbst
aber ich versteh nich warum dass dann bie uns in der Schule an dem einen Platz ohne Probleme funktioniert hat .... ich konnte mit allen Bällen spielen und es ist auch nicht abgestürzt oder sonstiges .... egal ob ich hin und her gespielt hab oder ob der Ball raus geflogen ist ..... das hat alles funktioniert
-
Inkorrekte Programm die Threads verwenden können durchaus auf einem System laufen und auf dem anderen nicht.... Solang das Programm nicht korrekt ist braucht man da nicht weiter drüber nach grübeln warum das so ist, da dies viel zu viel mit dem Timing der einzelnen Komponenten im System zu tun hat.
Ähnliche Themen
-
Probleme beim Ausführen einer jar-Datei im Browser
Von thobeoz im Forum JavaAntworten: 8Letzter Beitrag: 23.09.08, 21:20 -
Probleme beim Ausführen meiner .exe
Von Mahatmas im Forum C/C++Antworten: 2Letzter Beitrag: 25.10.07, 07:50 -
c++ schritte beim ausführen..
Von wpb im Forum C/C++Antworten: 1Letzter Beitrag: 19.06.06, 15:37 -
Probleme beim Ausführen eines PHP-Scriptes in der Kommandozeile
Von mki_germo im Forum PHPAntworten: 0Letzter Beitrag: 12.01.06, 14:34 -
Probleme beim Ausführen von Test Client meines EJB mit Eclipse, Jboss und Lomboz
Von Buteur im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 3Letzter Beitrag: 06.10.04, 13:37





Zitieren

Login





