2016-04-07 50 views
1

Bu başlık oldukça iyi ifade ettiğimi ifade etmiyor, özür dilerim, ancak daha iyi ifade etmem benim için zor, çünkü OOP eksikliğinden dolayı neler olduğunu anlayamıyorum bilgi ve tecrübe.Java'da süper alt sınıf değişkenini inherit in

Oyuncunun 'badGuy' sprite tarafından kovalanan 'kahraman' sprite ile bir tahta etrafında koşacak olan temel bir oyun yapıyorum. İki sprite 5-6 yöntemi paylaştığından, süper bir 'Sprite' ve iki sınıf 'Hero'nun Sprite' ve 'BadGuy'un Sprite'i genişletmesini' sağlamaya karar verdim. Şimdi böyle şeyler dahil olmak üzere tüm bu süper yöntemleri için:

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

Ben 'Hero' ve 'Badguy' konumunu izlemek için süper sınıf gerekir çalışmak. Farklı başlangıç ​​vermek istediğinizde sorun devreye giriyor

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; 
    } 
} 

'Hero' ve 'Badguy' nesnelere koordinatları: Yani böyle 'Sprite' uyguladı. Şu anda onları farklı ayarlarsanız, ikinci 'Sprite' çağrısı ilkini geçersiz kılar ve her ikisi de aynı noktada başlar (hedefiniz 'badGuy'dan çalıştırmaksa çok sinir bozucu olur). 'Kahraman' ve 'Badguy' şu anda bu şekilde başlatılır:

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; 
    } 

yüzden yapmaya çalıştığım şey alt sınıfları Sprite x ve y geçersiz hale getirilmesidir. Ama ben googled ve bu çok kötü bir fikir olduğunu anlıyorum ve bu yüzden mümkün değildir. Yani benim sorum şu gibi bir şeydir: 'Sprite' alt sınıfı 'x' ve 'y' değişkenlerini miras bırakabilir ve belirli alt sınıflar çağrıldığında gerekli yöntemleri uygulayabilirim.

Şimdi buna bakıyorum - hem kurucu hem de init <>() alt sınıflar için aynıdır, bu yüzden belki "Sprite" uygulamasında uygulanabilirler? Sadece bir düşünce, ama zaten kafam karıştı, bu yüzden hiç bir fikrim yok.

Teşekkürler.

+0

sadece (int x, int y) yapıcı Hero eklemek ait Nesnesi oluşturmak istiyor ve Badguy nereden süper arama (x, y). – BigMike

+3

Bunun nedeni, x ve y değişkenlerini sprite STATIC'de yapmış olmanızdır. Bu, değişkeni değiştiren herhangi bir alt sınıfın, bu değişikliğin diğerlerinde görülmesine neden olacağı anlamına gelir. Sadece onların korumalı yapmak ve alt sınıfları daha sonra 'x' ve' y' değişkenler 'static' yapmak YAPMAYIN – jr593

+0

baş edebilecektir. Sınıfın örnek değişkenleri olmalılar. Her bir 'Sprite' nesnesini izlemelidirler. Ayrıca “Sprite” sınıfını “soyut” yapmayı da düşünmelisiniz. –

cevap

1

Bu sorunla karşılaşıyorsunuz, x ve ySprite sınıfınızda statik alanlar olarak bildirilmiştir. Bir alan statik ilan edilirse JLS 8.3.1.1. static Fields

itibaren
olursa olsun sonuçta oluşturulabilir kaç (muhtemelen sıfır) örneklerini sınıfın alanında, tam olarak bir canlanmasını vardır. Sınıf başlatıldığında, bazen sınıf değişkeni olarak adlandırılan statik alan enkarne edilir (§12.4).

kullanın aşağıdaki kodu:

aşağıda sevdiği Sprite sınıfı değiştirin:

public class Sprite { 

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

Badguy sınıfı:

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

Kahraman sınıfı:

public class Hero extends Sprite { 
    public Hero(int x, int y) { 
     super(x, y); 
     ... 
    } 
    .... 
} 
Ana sınıfından itibaren

aşağıdakileri yapın: // Eğer alt sınıflarına (int x, int y) her iki sınıfları

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

Ayrıca, soru bağlamında 'statik 'kullanımı hakkında not alın. –

+0

@SumitSingh detayları açıklamak için zaman ayırdığınız için teşekkür ederiz. Bir şey daha (sadece bu yüzden şeylerin daha iyi anlayabilirsiniz): Ben başlangıç ​​yerine denir, her alt sınıfın yapıcı, argümanlar olarak geçen sınıfının alt koordinatlarını atayabilir. Her oyunda aynı noktadan başlayacakları için sınıfta kapsanan başlangıç ​​koordinatlarının olması mantıklıdır. Ya da en azından bana mantıklı geliyor: D – Alex