2016-04-07 14 views
1

このタイトルは、私がかなりうまく表現しているわけではありませんが、お詫び申し上げますが、OOPの不足により何が起こっているのかよく分かりません。知識と経験。サブクラス変数をJavaでスーパークラスで継承する

私は基本的なゲームを構築しています。このゲームは、 'badGuy'スプライトに追われて '英雄'スプライトでボードを走り回るようになります。 2つのスプライトが5-6のメソッドを共有しているので、スーパークラス 'スプライト'と2つのクラス 'ヒーロースプライト'と 'BadGuy extends Sprite'を作ることにしました。今のようなものを含む、すべてのものをスーパーメソッドのために:働く

getX(); getY(); getBounds(); render(); 

私は「ヒーロー」と「BadGuyの」の位置を追跡するために、スーパークラスが必要です。私は、異なる出発を与えたいときに問題がでキック

package game.sprites; 

import javafx.scene.shape.Rectangle; 

import javax.swing.*; 
import java.awt.*; 

public class Sprite { 

    public static int x; 
    public static int y; 
    private int imageWidth; 
    private int imageHeight; 
    public Image image; 

    public Sprite(int x, int y) { 
     Sprite.x = x; 
     Sprite.y = y; 
    } 

    public static void render(Graphics g, Image image) { 
     g.drawImage(image, x, y, null); 
    } 

    public Image loadImage(String filePath) {...} 

    public void getImageDimensions() {...} 

    public Rectangle getBounds() { 
     return new Rectangle(x, y, imageWidth, imageHeight); 
    } 

    public Image getImage() { 
     return image; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 
} 

「ヒーロー」と「BadGuyの」オブジェクトに座標:だから私はこのような「スプライト」を実施しました。現在、私はそれらを別のものに設定すると、 'Sprite'の2番目の呼び出しが最初の呼び出しを上書きし、両方が同じ場所で開始します(badGuyから実行するのが非常に不満です)。 「ヒーロー」と「BadGuyのは、」現在、このように初期化されます。

public class BadGuy extends Sprite { 

    public BadGuy() { 
     super(x, y); 
     initBadGuy(); 
    } 

    public void initBadGuy() { 
     loadImage("resources/craft.gif"); 
     getImageDimensions(); 
     x = 860; // Hero x = 20; 
     y = 560; // Hero y = 20; 
    } 

だから、私は何をしようとしたことは、サブクラスは、スプライトのxとyを上書きしますです。しかし、私はそれをgoogledと私はこれが非常に悪い考えであることを理解し、したがってそれは不可能です。ですから、私の質問は、Spriteがサブクラス 'x'と 'y'の変数を継承し、特定のサブクラスが呼び出されたときに必要なメソッドを実行するにはどうすればいいですか?

コンストラクタと初期化<>()の両方がサブクラスで同じですから、代わりに 'スプライト'で実装できるのでしょうか?ちょっと考えましたが、私はすでにかなり混乱しています。だからアイデアはありません。

ありがとうございました。

+0

のオブジェクトを作成する場所からちょうどあなたのサブクラスにコンストラクタヒーロー(int型のx、int型のy)を追加し、BadGuyの(int型のx、int型のY) super(x、y)を呼び出します。 – BigMike

+3

スプライトSTATICのxとy変数を作成したからです。 これは、変数を変更するすべてのサブクラスが、その変更を他のすべてのクラスで見られるようにすることを意味します。 それらを保護して、サブクラスは対処できます – jr593

+0

'x'と' y'変数を 'static'にしないでください。それらはクラスのインスタンス変数でなければなりません。それぞれの 'Sprite'オブジェクトを追跡する必要があります。また、 'Sprite'クラスを抽象化することも検討してください。 –

答えて

1

クラスでは、xyが静的​​フィールドとして宣言されているため、この問題が発生しています。フィールドは静的に宣言されている場合は、フィールドの1つの化身は関係なく、最終的に作成することができるどのように多くのインスタンス(おそらくゼロ)クラスの、正確には存在しないJLS 8.3.1.1. static Fields

から
。静的フィールド(クラス変数とも呼ばれる)は、クラスが初期化されるときに生成されます(§12.4)。

次のコードを使用:

は、以下のようなあなたのSpriteクラスを変更:

public class Sprite { 

    public int x; 
    public int y; 
    .... 
} 

BadGuyのクラス:

public class BadGuy extends Sprite { 
    public BadGuy(int x, int y) { 
     super(x, y); 
     ... 
    } 
    .... 
} 

ヒーロークラス:

public class Hero extends Sprite { 
    public Hero(int x, int y) { 
     super(x, y); 
     ... 
    } 
    .... 
} 
をメインクラスから

は、次の手順を実行します//あなたは両方のクラス

public static void main(String[] args){ 
Hero hero = new Hero(20,20); 
BadGuy badGuy= new BadGuy(860,560); 
} 
+0

また、質問の文脈では 'static'の使用について注意してください。 –

+0

@SumitSingh詳細を説明する時間を取ってくれてありがとう。もう一つのこと(ちょっと分かりました):サブクラスの開始座標を、各サブクラスのコンストラクタに引数として渡す代わりに、サブクラスを呼び出すときに割り当てることができます。彼らは各ゲームの同じ場所から始める予定であるので、それらの開始座標をクラスにカプセル化することが理にかなっています。少なくとも、それは私にとって理にかなっている:D – Alex

関連する問題