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

Java 处理游戏:Gif图像未按预期重生,java,processing,game-physics,Java,Processing,Game Physics,我是一名文凭学生,正在制作一款基于处理的游戏,这是一款塔防游戏,其中女主角会向冲向城堡的僵尸射箭。我对此有很多问题 充电器僵尸在被枪杀后不会重生 当我只射杀一个充电器僵尸时,所有的充电器僵尸一起死亡 据推测,我希望僵尸在一组僵尸被击落后以波浪的形式反复繁殖,然后我希望充电器僵尸根据我点击的那一个单独死亡 以下是我的源代码: import processing.opengl.*; // transparency import gifAnimation.*; // after add gifAnim

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

  • 充电器僵尸在被枪杀后不会重生
  • 当我只射杀一个充电器僵尸时,所有的充电器僵尸一起死亡 据推测,我希望僵尸在一组僵尸被击落后以波浪的形式反复繁殖,然后我希望充电器僵尸根据我点击的那一个单独死亡

    以下是我的源代码:

    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();
    }
    
    import processing.opengl.*//透明度
    导入动画。*;//添加动画库后
    导入ddf.minim.*;//导入音乐
    PImage背景IMG;
    PImage动画;
    整数计数器;
    //背景
    积分=50,总分=0;
    int titleX=200,titleY=200;
    布尔shotsFired=false;
    PFont分数、城堡分数、字体//启动屏幕的字体
    内电荷填充;
    //充电器等级
    int maxChargerOnScreen;
    充电器[]充电器//chargerArray未定义
    国际电荷指数;
    最终整数充电器=300;
    屏幕上的ArrayList=新建ArrayList();
    布尔chargerCachedTarget=false,chargerShot=false,chargerDive=true;
    Gif chargerCharge、ChargerTack、chargerDied、射击实例;
    内部chargerMoveX=800,chargerMoveY=450;
    //卡斯尔沃尔健康酒店
    int Castlehalth=1000;
    //音频
    极小极小;
    音频播放器歌曲;
    音频片段;
    //-------------------------------代码从这里开始------------------------------------------//
    无效设置(){
    //ipad迷你版
    //帧率(10);
    帧率(60);
    尺寸(800600);
    光滑的();
    最小值=新的最小值(本);
    //song=minim.loadFile(“InGameSoundtrack.mp3”);
    //歌曲。游戏();
    arrowshot=minim.loadSnippet(“arrowSound1.wav”);
    backgroundImg=loadImage(“GameBackground.jpg”);
    背景调整(800600);
    chargerCharge=new Gif(这是“chargerCharge.Gif”);
    chargerAttack=新的Gif(这是“chargerAttack.Gif”);
    chargerDied=新的Gif(这是“ChargerDie.Gif”);
    gargoyleFly=新的Gif(这是“gargoyleFly.Gif”);
    gargoyleAttack=new Gif(这是“gargoyleAttack.Gif”);
    ShootingInstance=新的Gif(这是“ShootingGif.Gif”);
    分数=createFont(“Arial”,16,真);
    castlehalthpoints=createFont(“Arial”,16,true);
    //loopingGif.play()播放不带循环的动画
    //必须做充电器
    chargerCharge.play();
    chargeratack.play();
    chargerDied.play();
    resetGames();//以重设5项费用开始
    }
    作废提款(){
    //背景
    背景(背景img);
    图像(拍摄实例,120200);
    //分数与健康
    textFont(分数15分);
    填充(0);
    文本(“分数:+totalScore,100100);
    DisplayCastlehalth();
    //*********************************************充电器设置代码********************************************************************
    //若并没有更多的僵尸。提示重置(屏幕并没有僵尸),索引从0添加到300,然后游戏获胜
    if(屏幕上的.size()==0&&chargerIndex==numCharger){
    println(“赢得比赛:)”;
    //gameWon=true;
    }
    //虽然屏幕上的充电器只有不到5个,而chargerIndex还没有达到300,但它只会重生
    
    虽然(onScreen.size() 所有
    Charger
    s实例的状态都相同

    boolean chargerReachedTarget = false, chargerShot = false, chargerDive = true;
    
    已全局定义。只需将此行(即这3个字段)移动到
    Charger
    类中,并更改行即可

    if (chargerShot==true) {
    

    游戏看起来已经非常接近你可能一直在寻找的东西。经过这次修改,可以射击单个对手,在旧对手消失后,新的对手不断出现


    同样:代码的结构不是很好,可能有很多小的改进。例如,像
    if(c.chargerShot==true){…}
    应该是
    if(charger.isShot()){…}
    。但是我对处理及其最佳实践不太熟悉,所以我不确定“最佳”是如何实现的解决方案看起来像是全局意义上的…

    对不起!我忘了!它是基于Java的。@Unihedron你真的尝试过这个吗?(我不确定是否需要在类中,我只是问…)@Marco13抱歉,我太累了,尝试了Java编译器。@Unihedron没问题。事实上,将处理脚本转换成Java类通常相当容易(通常只是将其包装成扩展
    PApplet
    ,IIRC的类)。也许我可以在未来几天内尝试这样做,因为否则,我想这个问题可能仍然没有答案(处理用户的数量与Java用户的数量相比是微不足道的…@Marco13非常受欢迎并被加入书签。热切期待您的解决方案!
    if (chargerShot==true) {
    
    if (c.chargerShot==true) {