"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[Processing] Gleichzeitig bewegen und schießen

Garrett 12.01.2014 - 13:34 3039 5
Posts

Garrett

Here to stay
Avatar
Registered: May 2003
Location: Wien
Posts: 1082
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

she/her
Avatar
Registered: Mar 2002
Location: Graz
Posts: 14195
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.
Bearbeitet von InfiX am 12.01.2014, 15:25

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
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

Here to stay
Avatar
Registered: May 2003
Location: Wien
Posts: 1082
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

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
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

she/her
Avatar
Registered: Mar 2002
Location: Graz
Posts: 14195
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();   
  }
}
Bearbeitet von InfiX am 13.01.2014, 21:05
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz