2017-08-07 77 views
-1

我一直在做一個遊戲一段時間,我想爲每種類型的生物都有不同的類。現在,所有不同的生物的AI都以長開關運行,並且我希望一個超類能夠用那個AI的那個生物的功能來超越這個功能。我有這個設置,但不會覆蓋。Java:超類不會覆蓋功能

我忘了什麼嗎?

Bunny.java:

package creature; 

import org.newdawn.slick.opengl.Texture; 

import creature.Creature; 
import creature.CreatureType; 
import data.Tile; 

public class Bunny extends Creature{ 

    public Bunny(CreatureType type, float x, float y, float speed1) { 
     super(type, x, y, speed1); 

    } 

    public void AI(int type) { 
     System.out.println("test"); 
    } 

} 

Creature.java:

public Creature(CreatureType type, float x, float y, float speed1) { 
    this.texture = drawImg(type.textureName); 
    this.textureHamster = drawImg("creatures/HamsterFace"); 
    this.healthBackground = drawImg("health_background"); 
    this.healthForeground = drawImg("health_foreground"); 
    this.healthBorder = drawImg("health_border"); 
    this.startTile = startTile; 
    this.x = x; 
    this.y = y; 
    this.intX = (int) x; 
    this.intY = (int) y; 
    this.width = texture.getImageWidth(); 
    this.height = texture.getImageHeight(); 
    this.speed1 = speed1; 
    this.speed = speed; 
    this.intspeed = speed; 
    this.grid = grid; 
    this.health = type.health; 
    this.inithealth = type.health; 
    this.hiddenHealth = health; 
    this.startHealth = health; 
    this.dir = false; 
    this.dchosen = false; 
    this.setx = 0; 
    this.hurt = 0; 
    this.panick = 0; 
    this.deathWish = 0; 
    this.pdir = -1; 
    this.myX = x; 
    this.myY = HEIGHT/2; 
    this.right = false; 
    this.left = false; 
    this.fade = 0; 
    this.fir = true; 
    this.aiType = type.aiType; 
    this.yOffset = 0; 
} 

..... 

public void AI(int type) { 
    if(panic > 0) 
     panic--; 
    hurt(); 
    speed = speed1; 
    switch(type) { 

    case 1: 
     if(panic > 0) { 
      if(pickRandom(150, 300) < 10) { 
       direction = !direction; 
      } 

      if(direction) { 
       if(!right) { 
        x += speed; 
       } else { 
        if(falling < 2) 
        gravity = 8; 
       } 
      } else { 
       if(!left) { 
        x -= speed; 
       } else { 
        if(falling < 2) 
        gravity = 8; 
       } 
      } 

     } else { 
      if(getRange(WIDTH/2, myX) > 200) { 
       directionCoolDown++; 
       if(directionCoolDown > pickRandom(150, 3000)) { 
        direction = !direction; 
        directionCoolDown = 0; 
       } 



       if(direction) { 
        if(!right) { 
         x += speed/3.2; 
        } else { 
         if(falling < 2) 
         gravity = 8; 
        } 
       } else { 
        if(!left) { 
         x -= speed/3.2; 
        } else { 
         if(falling < 2) 
         gravity = 8; 
        } 
       } 


      } else { 
       if(myX < WIDTH/2) { 
        direction = true; 
       } else { 
        direction = false; 
       } 




      } 
     } 
     break; 

    case 2: 

     yOffset = -25; 
     if(!angry) { 
      pdir = 0; 
      if(getRange(Player.getX(), myX) < 300) { 
       hamsterFace = true; 
      } else { 
       hamsterFace = false; 
      } 

      if(!hamsterFace) { 
       directionCoolDown++; 
       if(directionCoolDown > pickRandom(150, 3000)) { 
        direction = !direction; 
        directionCoolDown = 0; 
       } 

       if(direction) { 
        if(!right) { 
         x += speed/3.2; 
        } else { 
         if(falling < 2) 
         gravity = 8; 
        } 
       } else { 
        if(!left) { 
         x -= speed/3.2; 
        } else { 
         if(falling < 2) 
         gravity = 8; 
        } 
       } 
      } 
     } else { 
      pdir++; 
      hamsterFace = false; 
      if(myX < Player.getX()) { 
       direction = true; 
      } else { 
       direction = false; 
      } 

      if(direction) { 
       if(!right) { 
        x += speed/1; 
       } else { 
        if(falling < 2) 
        gravity = 8; 
       } 
      } else { 
       if(!left) { 
        x -= speed/1; 
       } else { 
        if(falling < 2) 
        gravity = 8; 
       } 
      } 

      if(getRange(myX, Player.getX()) < 5 && getRange(myY, Player.getY()) < 5) { 
       hurtPlayer(-2); 
       direction = !direction; 
       if(direction) { 
        if(!right) { 
         x += speed * 10; 
        } else { 
         if(falling < 2) 
         gravity = 8; 
        } 
       } else { 
        if(!left) { 
         x -= speed * 10; 
        } else { 
         if(falling < 2) 
         gravity = 8; 
        } 
       } 
      } 
     } 

     if(panic > 1) { 
      angry = true; 
     } else { 
      if(pdir > pickRandom(1000,2000)) { 
       angry = false; 
      } 
     } 

     break; 

    } 
} 

..... 

(這兩個類是在相同的封裝)

編輯:我固定錯字....

+0

我在'Creature'類中看不到有簽名'void AI()'的方法,所以這裏沒有什麼可以重寫。 –

+0

此外,我沒有看到在'Bunny'類中籤名'void AI(int)'的方法,所以它不能覆蓋任何東西。 –

+0

將'@ Override'添加到您正在覆蓋的方法中。你的IDE會告訴你什麼是錯的 – n247s

回答

2

你有兔子類:

public void AI() { 
    System.out.println("test"); 
} 
在生物類

public void AI(int type) { 
    if(panic > 0) 
    .... 

所以

void AI(int type)void AI()同樣的方法(檢查簽名,以及他們如何採取不同的參數!)

因此兔子班並不壓倒父母班的任何東西

- 編輯:

現在你的類有一個方法void AI(int type)那麼我們可以說, 兔子覆蓋怪物AI方法和每次你打電話bunny.AI(f)你的兔子方法將被調用!

+0

這仍然不起作用...在放置重寫註釋後,我沒有得到任何錯誤。我覺得它沒有被稱爲...我需要打電話嗎? – Ekrcoaster

+0

但是你改變了方法簽名爲public void AI(int type)?如果重寫給出錯誤,則找不到父方法。 – wumpz