[Processing] Gleichzeitig bewegen und schießen

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/processing-gleichzeitig-bewegen-und-schieszen_237550/page_1 - zur Vollversion wechseln!


Garrett schrieb am 12.01.2014 um 13:34

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


InfiX schrieb am 12.01.2014 um 13:43

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

click to enlarge

so schauts bei mir aus:

Code:
  if(key=='y'||key=='Y'||key==' ') 
    keyFire=true;
e: bei keyReleased dann natürlich wieder auf false.


mat schrieb am 13.01.2014 um 18:50

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.


Garrett schrieb am 13.01.2014 um 20:09

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


mat schrieb am 13.01.2014 um 20:14

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.


InfiX schrieb am 13.01.2014 um 20:45

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

oder du könntest es in einem extra thread probieren, das hab ich damals noch nicht gewusst und erst bei späteren sachen eingesetzt.
http://wiki.processing.org/w/Threading

ersteres dürfte wohl einfacher sein.

e: unsere funktionen schaun sich sogar sehr ähnlich :D
evtl hiflts ja:
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();   
  }
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.

hier die ganze funktion falls es interessiert:
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