このタイトルは、私がかなりうまく表現しているわけではありませんが、お詫び申し上げますが、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'の変数を継承し、特定のサブクラスが呼び出されたときに必要なメソッドを実行するにはどうすればいいですか?
コンストラクタと初期化<>()の両方がサブクラスで同じですから、代わりに 'スプライト'で実装できるのでしょうか?ちょっと考えましたが、私はすでにかなり混乱しています。だからアイデアはありません。
ありがとうございました。
のオブジェクトを作成する場所からちょうどあなたのサブクラスにコンストラクタヒーロー(int型のx、int型のy)を追加し、BadGuyの(int型のx、int型のY) super(x、y)を呼び出します。 – BigMike
スプライトSTATICのxとy変数を作成したからです。 これは、変数を変更するすべてのサブクラスが、その変更を他のすべてのクラスで見られるようにすることを意味します。 それらを保護して、サブクラスは対処できます – jr593
'x'と' y'変数を 'static'にしないでください。それらはクラスのインスタンス変数でなければなりません。それぞれの 'Sprite'オブジェクトを追跡する必要があります。また、 'Sprite'クラスを抽象化することも検討してください。 –