[Processing] Gleichzeitig bewegen und schießen
Garrett 12.01.2014 - 13:34 3039 5
Garrett
Here to stay
|
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: 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
|
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: 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
AdministratorLegends never die
|
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
|
Danke mal für den Hinweis. Also Programmieranfänger kann ich zwar nicht viel damit anfangen aber trotzdem. Falls das was hilft: void shoot(){
if(millis() - timeLastShot > coolDown){
Bullet bullet = new Bullet(this.x+12.5, this.y, -40);
bullets.add(bullet);
timeLastShot = millis();
}
|
mat
AdministratorLegends never die
|
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
|
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: 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/Threadingersteres dürfte wohl einfacher sein. e: unsere funktionen schaun sich sogar sehr ähnlich evtl hiflts ja: 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: 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
|