我目前正在使用零部件模式進行遊戲,並一直在想如何做到這一點。 我有一個實體,實際上只是一個組件包。每個組件都擴展了Component類,它只具有一些基本功能。返回需要超類的擴展類
擴展組件類,創建新的組件,用於處理輸入,圖形等。現在出現這個問題;當我試圖從實體中獲取特定的組件時,它總是返回基本的Component類,這阻止了我使用特定的組件功能。
public class GameEntity
{
private ArrayList<Component> components;
public GameEntity()
{
components = new ArrayList<Component>();
}
public void addComponent(Component component)
{
components.add(component);
}
public void update()
{
}
public Component getComponent(Class type)
{
for (Component component : components)
{
if(component.getClass() == type)
{
//return component as Class;
}
}
return null;
}
public void draw(Canvas canvas)
{
for (Component component : components)
{
component.update();
component.draw(canvas);
}
}
}
一些示例組件:
公共類GraphicsComponent延伸元器件{
公共位圖的位圖; public Rect currentFrameRect; private ArrayList spriteAnimations; public SpriteAnimation currentAnimation; public int x = 0; public int y = 50; public GraphicsComponent(){ spriteAnimations = new ArrayList(); }
/** * Adds image [converts to spriteanimation] * @param image */ public void addImage(Bitmap image, String label) { Rect[] tmpRects = {new Rect(0, 0, image.getWidth(), image.getHeight())} ; addAnimation(new SpriteAnimation( image, tmpRects, label )); } public void addAnimation(SpriteAnimation spriteAnimation) { spriteAnimations.add(spriteAnimation); if(currentAnimation == null) { currentAnimation = spriteAnimation; } } @Override public void update() { currentFrameRect = currentAnimation.frames[currentAnimation.currentFrame]; }
@覆蓋公共無效畫(油畫畫布){
if(currentAnimation != null) { currentAnimation.draw(x, y, canvas); } }
public int getWidth()
{
return currentAnimation.frames[currentAnimation.currentFrame].width();
}
public int getHeight()
{
return currentAnimation.frames[currentAnimation.currentFrame].height();
}
}
public class InteractiveComponent extends Component
{
public GraphicsComponent graphics;
public InteractiveComponent(GraphicsComponent graphics)
{
this.graphics = graphics;
}
public boolean isOver(int tapX, int tapY)
{
//left top right bottom
if(tapX > graphics.x && tapX < graphics.x + graphics.getWidth() &&
tapY > graphics.y && tapY < graphics.y + graphics.getHeight()
)
{
return true;
}
return false;
}
}
似乎有一些問題與代碼的格式,但它應該是清楚的。 我無法訪問graphicComponent中的getHeight()或interactiveComponent中的isOver(),因爲我只是返回一個基本的組件。
我想基於我進入getComponent()類返回一個GraphicsComponent或InteractiveComponent。
降級到你想要的課程。 –
這是太多的示例代碼。 – millimoose
我對「downcasting」這個詞不熟悉,感謝提及它。 我爲冗長的代碼表示歉意,我擔心我的問題還不夠清楚。 – omgnoseat