URL: https://www.overclockers.at/coding-stuff/processing-gleichzeitig-bewegen-und-schieszen_237550/page_1 - zur Vollversion wechseln!
Hi, für die Uni mach ich einen kleinen 2D Flugzeugshooter.
Nun funktioniert das gleichzeitige Schießen und Bewegen des Objektes nicht wirklich. Habt ihr eine Ahnung woran das liegen kann?
Das sollte der entsprechende Code Teil sein:
Code:void movePlayer1() { if (keyLEFTPressed && player1.x > width - 750) { player1.x -=5; } if (keyRIGHTPressed && player1.x < width - 50) { player1.x +=5; } if (keyUPPressed && player1.y > height - 750) { player1.y -=5; } if (keyDOWNPressed && player1.y < height - 50) { player1.y +=5; } } void keyPressed() { if (keyCode == LEFT) { keyLEFTPressed = true; } if (keyCode == RIGHT) { keyRIGHTPressed = true; } if (keyCode == UP) { keyUPPressed = true; } if (keyCode == DOWN) { keyDOWNPressed = true; } if (key == ' ') { player1.shoot(); } } void keyReleased() { if (keyCode == LEFT) { keyLEFTPressed = false; } if (keyCode == RIGHT) { keyRIGHTPressed = false; } if (keyCode == UP) { keyUPPressed = false; } if (keyCode == DOWN) { keyDOWNPressed = false; } }
probiers doch gleich wie bei den anderen über ein boolean "keyfire = true" oder so, so ähnlich hab ich das glaub ich damals gemacht, bin jetzt grad kurz weg, aber schaus mir sonst nachher nochmal an.
genau sowas hab ich nämlich auch mal gemacht 
so schauts bei mir aus:
e: bei keyReleased dann natürlich wieder auf false.Code:if(key=='y'||key=='Y'||key==' ') keyFire=true;
Man sieht in deinem Code nicht wirklich, was genau falsch läuft. Wahrscheinlich steckt der Fehler in player1.shoot(). Die Funktion muss jedenfalls asynchron/parallel sein und darf die CPU nicht auffressen.
Danke mal für den Hinweis. Also Programmieranfänger kann ich zwar nicht viel damit anfangen aber trotzdem. 
Falls das was hilft:
Code:void shoot(){ if(millis() - timeLastShot > coolDown){ Bullet bullet = new Bullet(this.x+12.5, this.y, -40); bullets.add(bullet); timeLastShot = millis(); }
Schaut auch gut aus, sofern ich das beurteilen kann.
Ich versuche bei schwer debugbaren Problemen immer den problematischen Code zu isolieren. Also zB die shoot()-Funktion auskommentieren und mal schauen, was dann passiert.
ahjo, was mat sagt macht auch sinn, wie gesagt entweder du machst das über ein boolean so wie beim movement, also irgendwo in der draw funktion (oder einer untergeordneten) abfragen:
Code:if(keyFire) shoot();

disclaimer: ich hab mit programmieren ned viel am hut, und das war das erste richtige "programm" das ich geschrieben hab, ist also vermutlich sehr ineffizient.Code:if(keyFire && shotTime <= millis()- 60 / speedFactor ) { float shotVelocity; if(keyUp) shotVelocity = 32+vXY.mag(); else shotVelocity = 32; shots.add( shotHistory[shotNum++] = new Shot(posX, posY, posZ, playerZR, shotVelocity) ); shotHistory = (Shot[]) expand(shotHistory, shotNum+1); shotTime = millis(); }
Code:void createShot(){ boolean hasHit = false; if(bombfired) { bomb.explode(); bomb.display(); bomb.hit(); if( bomb.exploded() ) { bombfired = false; } } shotsAlive = shots.size(); for(int i = 0; i < shotNum; i++) { if(shotHistory[i].alive()){ shotHistory[i].shoot(); shotHistory[i].display(); for(int j=0; j < enemyNum; j++) { if( enemyHistory[j].visible(visX, visY, visRange) && !enemyHistory[j].dead() ) { if(shotHistory[i].hit(enemyHistory[j].getX(), enemyHistory[j].getY())) { enemyHistory[j].hurt( 5 ); shotHistory[i].terminate(); //println("I'd hit it!"); } } else { hasHit = false; } } if(shotHistory[i].getDistance() > 440) shotHistory[i].terminate(); } } if(shotsAlive == 0) shotNum = 0; if(keyFire && shotTime <= millis()- 60 / speedFactor ) { float shotVelocity; if(keyUp) shotVelocity = 32+vXY.mag(); else shotVelocity = 32; shots.add( shotHistory[shotNum++] = new Shot(posX, posY, posZ, playerZR, shotVelocity) ); shotHistory = (Shot[]) expand(shotHistory, shotNum+1); shotTime = millis(); } }
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026