有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java处理游戏:Gif图像未按预期重生

我是一名文凭学生,正在制作一款基于处理的游戏,这是一款塔防游戏,女主角会向冲向城堡的僵尸射箭。我对此有很多问题

  1. 充电器僵尸在被枪杀后不会重生
  2. 当我只射杀一个充电器僵尸时,所有的充电器僵尸一起死亡

据推测,我希望在一群僵尸被击落后,它们能在波浪中反复产卵,然后我希望充电器僵尸能独立死亡,具体取决于我点击的那一个

以下是我的源代码:

import processing.opengl.*; // transparency
import gifAnimation.*; // after add gifAnimation library
import ddf.minim.*; // importing music

PImage backgroundImg;
PImage animation;

int counter;

//settings
int score = 50, totalScore = 0;
int titleX = 200, titleY = 200;
boolean shotsFired = false;
PFont scorePoints, castleHealthPoints, font; //font for startingScreen
int chargerKilled;

//Charger class
int maxChargerOnScreen;
Charger[] chargerArr;   //chargerArray undefined
int chargerIndex;
final int numCharger = 300;
ArrayList<Charger> onScreen = new ArrayList<Charger>();

boolean chargerReachedTarget = false, chargerShot = false, chargerDive = true;
Gif chargerCharge, chargerAttack, chargerDied, shootingStance;
int chargerMoveX = 800, chargerMoveY = 450;


// CastleWallHealth
int castleHealth = 1000;

// audio 
Minim minim;
AudioPlayer song;
AudioSnippet arrowShoot;

//-------------------------------Codes start here --------------------------------------------------// 
void setup() {
    //ipad mini size
    //  frameRate(10);
    frameRate(60);
    size(800, 600);
    smooth();

    minim = new Minim(this);
    // song = minim.loadFile("InGameSoundtrack.mp3");
    // song.play();
    arrowShoot = minim.loadSnippet("arrowSound1.wav");

    backgroundImg = loadImage("GameBackground.jpg"); 
    backgroundImg.resize(800, 600);
    chargerCharge = new Gif(this, "ChargerCharge.gif");
    chargerAttack = new Gif(this, "ChargerAttack.gif");
    chargerDied   = new Gif(this, "ChargerDie.gif");
    gargoyleFly   = new Gif(this, "GargoyleFly.gif");
    gargoyleAttack = new Gif(this, "GargoyleAttack.gif");
    shootingStance = new Gif(this, "ShootingGif.gif");

    scorePoints =  createFont("Arial", 16, true);
    castleHealthPoints = createFont("Arial", 16, true);
    // loopingGif.play() plays the animation without loop
    // must make charger
    chargerCharge.play();
    chargerAttack.play();
    chargerDied.play();

    resetGames();  // starts with respawning 5 charges 
}

void draw() {
    // backgroud
    background(backgroundImg);
    image(shootingStance, 120,200);

    // scores and health
    textFont(scorePoints, 15);
    fill(0);
    text("Score: " + totalScore, 100, 100);
    displayCastleHealth();

  //*********************************************charger settings code********************************************************************
    // If there's no more zombies. prompt reset (screen no zombies) , index from 0 add till 300 then game won
    if (onScreen.size() == 0 && chargerIndex == numCharger) {
        println("Game won! :)");
        // gameWon = true;
    }

    // while onScreen charger less than 5 only and chargerIndex havent reach 300 it will only respawn 
    while (onScreen.size () < maxChargerOnScreen && chargerIndex <= numCharger - 1) {

        if (chargerIndex < chargerArr.length) { // <--- this is the problem chargerArrayLength
            Charger chargerMobs = chargerArr[chargerIndex];
            // starts from chargerArray[0] to chargerArray[300]
            onScreen.add(chargerMobs);                         
            chargerIndex++;
            // chargerIndex keeps looping why?
            // println("ADDED ZOMBIE TO ONSCREEN Zombs on screen: " + onScreen.size());
        }
    }

    // Adjusts maxZombOnScreen based off the current index   Difficulties?
    if (chargerIndex == 10)
        maxChargerOnScreen++;
    else if (chargerIndex == 50)
        maxChargerOnScreen++;
    else if (chargerIndex == 100)
        maxChargerOnScreen += 2;
    else if (chargerIndex == 150)
        maxChargerOnScreen += 2;
    else if (chargerIndex == 190)
        maxChargerOnScreen += 3;
    else if (chargerIndex == 250)
        maxChargerOnScreen += 3;
    else if (chargerIndex == 260)
        maxChargerOnScreen += 3;
    else if (chargerIndex == 270)
        maxChargerOnScreen += 5;

    // removes dead zombies, living zombies act normally
    for(int i = 0; i < onScreen.size(); i++) {
        Charger c = onScreen.get(i);

        // add money when a zombie is dead
        // if (c.getHealth() <= 0)
        if (chargerShot==true) {
            c.chargerDying();
            onScreen.remove(i);
            chargerKilled++;
            i--;
        } else {
            c.act(); ///it should just act
        //  c.displayHealth(); // if gt time only do
    //  }
        }
    }

    // creating list of predetermined zombies and their characteristics
    println("chargerIndex: " + chargerIndex); // debug
    println("onScreenSize: " + onScreen.size());
//  println("ChargerArray: " + chargerArray.length); chargerArray point null?

    // cursor
    if (mouseY > height - 500) {
        noFill();
        stroke(255, 0, 0);
        ellipse(mouseX, mouseY, 35, 35);
        line(mouseX - 25, mouseY, mouseX + 25, mouseY);
        line(mouseX, mouseY - 25, mouseX, mouseY + 25);
    }

}

void resetGames() {
    // resetting variables
    chargerIndex = 0;
    maxChargerOnScreen = 5;
    chargerKilled = 0;
    createNewCharger();
}

void createNewCharger() {

    Charger[] temp = new Charger[numCharger];
    for (int i = 0; i < numCharger; i++)    
        temp[i] = new Charger((int) random(800, 1200), chargerMoveY);

    chargerArr = temp;
}

//____________________________________________________________________________________________________________-
class Charger {

    private int chargerMoveX, chargerMoveY;
    Gif chargerGif; // by default
    // chargerGif will change based on input (either it reaches the castle or its shot)

    // no constructor
    Charger() {
        chargerMoveX = 0;
        chargerMoveY = 450; 
    }

    // overloaded constructor
    Charger(int cMoveX,int cMoveY) {
        chargerMoveX = cMoveX;
        chargerMoveY = cMoveY;
    }

    void act() { // use 

        // if reached castle it wont move
        if (chargerMoveX <= 180) {
            // remove gif images
            chargerDive = false;
            chargerReachedTarget = true;
        }

        // if not shot or reached castle it will move 
        if (chargerDive == true) {
            chargerGif = chargerCharge;
            image(chargerGif, chargerMoveX, chargerMoveY);
            chargerMoveX -= 2;
        }

        // if reached castle perform attack animation
        if (chargerReachedTarget == true) {
            chargerGif = chargerAttack;
            image(chargerGif, chargerMoveX - 80, chargerMoveY - 120);
        }

        if (mousePressed &&
            mouseX < chargerMoveX + 180
            && mouseX > chargerMoveX
            && mouseY < chargerMoveY + 120
            && mouseY > chargerMoveY) {

            // score board     
            totalScore = totalScore + score ;      
            float r = random(50);
            println(r);
            chargerShot = true;
            chargerDive = false;
        }

    }

    void chargerDying() {
        chargerReachedTarget = false;
        chargerGif = chargerDied;
        image(chargerGif, chargerMoveX, chargerMoveY);
    }
}

void displayCastleHealth() {
    if (castleHealth <= 0) {
      fill(250, 70, 0);
      textFont(castleHealthPoints, 20);
      text("HP: 0", 100, 50);
    } else {
      fill(250, 70, 0);
      textFont(castleHealthPoints, 20);
      text("HP: " + castleHealth, 100, 50);
    }
}

void mousePressed() {
    strokeWeight(2);  
    arrowShoot.rewind();
    arrowShoot.play(); 

    for (int i = 0 ; i < 3; i++)
        shootingStance.play();

    shotsFired = true;
}

void mouseReleased() {
    strokeWeight(1);

    if (shotsFired == true)
        shootingStance.pause();
}

public void stop() {
    arrowShoot.close();
}

充电器的大部分问题都来自这里:

if (onScreen.size() == 0 && chargerIndex == numCharger) {
    println("Game won! :)");
    // gameWon = true;
}

// while onScreen charger less than 5 only and chargerIndex havent reach 300 it will only respawn 
while (onScreen.size () < maxChargerOnScreen && chargerIndex <= numCharger - 1) {

    if (chargerIndex < chargerArr.length) { // <--- this is the problem chargerArrayLength
        Charger chargerMobs = chargerArr[chargerIndex];
        // starts from chargerArray[0] to chargerArray[300]
        onScreen.add(chargerMobs);                         
        chargerIndex++;
        // chargerIndex keeps looping why?
        // println("ADDED ZOMBIE TO ONSCREEN Zombs on screen: " + onScreen.size());
    }
}

// Adjusts maxZombOnScreen based off the current index   Difficulties?
if (chargerIndex == 10)
    maxChargerOnScreen++;
else if (chargerIndex == 50)
    maxChargerOnScreen++;
else if (chargerIndex == 100)
    maxChargerOnScreen += 2;
else if (chargerIndex == 150)
    maxChargerOnScreen += 2;
else if (chargerIndex == 190)
    maxChargerOnScreen += 3;
else if (chargerIndex == 250)
    maxChargerOnScreen += 3;
else if (chargerIndex == 260)
    maxChargerOnScreen += 3;
else if (chargerIndex == 270)
    maxChargerOnScreen += 5;

// removes dead zombies, living zombies act normally
for(int i = 0; i < onScreen.size(); i++) {
    Charger c = onScreen.get(i);

    // add money when a zombie is dead
    // if (c.getHealth() <= 0)
    if (chargerShot==true) {
        c.chargerDying();
        onScreen.remove(i);
        chargerKilled++;
        i--;
    } else {
        c.act(); ///it should just act
    //  c.displayHealth(); // if gt time only do
//  }
    }
}

感谢您的评价和批评


共 (1) 个答案

  1. # 1 楼答案

    代码中有几个问题,但现在,我将忽略一些“不干净”或“不优雅”的部分,并将重点放在问题的主要原因上:

    所有Charger实例的状态是相同的。田野

    boolean chargerReachedTarget = false, chargerShot = false, chargerDive = true;
    

    已在全球范围内定义。只需将这一行(即这3个字段)移动到Charger类中,并更改这一行即可

    if (chargerShot==true) {
    

    if (c.chargerShot==true) {
    

    游戏似乎已经离你想要的东西更近了。在这次修改之后,可以射击个人对手,在旧对手消失后,新的对手不断出现

    再说一遍:代码的结构不是很好,还有很多可能的小改进。例如,像if (c.chargerShot==true) { ... }这样的东西最好是if (charger.isShot()) { ... }。但我不太熟悉处理及其最佳实践,所以我不确定“最佳”解决方案在全球范围内会是什么样子