2012-07-16 58 views
11

目前我有靜態引用所有我的精靈並加載和初始化他們在我的SimpleBaseGameActivity的OnCreateResource方法,但現在我必須重寫onAreaTouched偵聽器spirtes和我的方式可以在初始化Sprite時覆蓋它。但我有一個靜態方法爲每個精靈創建Atlas和Texture Region。我在場景類中使用這些精靈,我想在那裏覆蓋onAreaTouched。我可以在我的場景中爲該特定的精靈註冊觸摸區域,這樣就可以完成但我想以一種方式覆蓋OnAreaTouched,以便可以完成代碼重用。 這是我目前如何創建和加載精靈。使用AndEngine GLES2在遊戲中使用Sprites的最佳實踐

defualtCageSprite = createAndLoadSimpleSprite("bg.png", this, 450, 444); 

而這是我的方法createAndLoadSimpleSprite。

public static Sprite createAndLoadSimpleSprite(String name, 
     SimpleBaseGameActivity activity, int width, int height) { 

    BitmapTextureAtlas atlasForBGSprite = new BitmapTextureAtlas(
      activity.getTextureManager(), width, height); 
    TextureRegion backgroundSpriteTextureRegion = BitmapTextureAtlasTextureRegionFactory 
      .createFromAsset(atlasForBGSprite, activity, name, 0, 0); 
    Sprite sprite = new Sprite(0, 0, backgroundSpriteTextureRegion, 
      activity.getVertexBufferObjectManager()); 
    activity.getTextureManager().loadTexture(atlasForBGSprite); 

    return sprite; 
} 

現在我怎樣才能重寫onAreaTouched一些精靈,而不會丟失代碼的可重用性。

回答

8

是否有任何理由需要在運行時加載紋理?正常的方法是在加載應用程序時將所需紋理全部加載到單個圖集中,以便稍後快速使用它們。

至於代碼的可重用性,Todilo關於枚舉的想法似乎幾乎是你所需要的。舉例來說,你有兩種物體 - 當你觸摸它們時會消失的物體,當你碰觸它們時會飛起來的物體。您枚舉這兩個類別並將一段代碼放入觸摸事件處理代碼中,以檢查該對象是否應該消失或飛起來。

如果您在運行應用程序之前不知道對象應該在觸摸屏上進行什麼操作,則可以採用更動態的方式來實現相同的結果。只需在運行時創建兩個列表,並根據對象觸摸時應該執行的操作,將對象引用到其中一個列表中。然後在觸摸事件處理做這樣的事情:

if (disappearList.contains(touchedObject)) { 
    disappear(object) 
} 
if (flyUpList.contains(touchedObject)) { 
    flyUp(object) 
} 

太糟糕了AndEngine不允許用戶在精靈設置監聽器,它將使事情變得更簡單。

編輯:使用BlackPawnTextureBuilder的 加解釋: 你阿特拉斯的類型必須爲BuildableBitmapTextureAtlas的,那麼你添加的所有紋理像這樣

BitmapTextureAtlasTextureRegionFactory.createFromAsset(buildableAtlas, this, "image.png")); 

try { 
    this.buildableAtlas.build(new BlackPawnTextureBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(1)); 
} catch (final TextureAtlasSourcePackingException e) { 
    Debug.e(e); 
} 

我不後不知道這是否適用於動畫Sprites,你將不得不嘗試。 此外,沒有重寫的onTouch,你必須在onAreaTouched方法中做到這一點。這種情況的一個例子是

if (pSceneMotionEvent.getAction() == MotionEvent.ACTION_DOWN && disappearList.contains(pTouchArea)) {disappear();} 
+1

如果我將所有需要的紋理加載到單個圖集,那麼圖集的大小應該是多少?使用單個圖集有什麼好處,順便說一句,運行時的意思是,我初始化引擎的createResources上的所有精靈,然後在我的應用程序中使用它們。 – Waqas 2012-07-23 09:56:01

+1

我只需要在onTouch上設置動畫精靈,我必須根據不同的精靈調用我的模型的不同方法。 – Waqas 2012-07-23 10:03:14

+1

圖集大小取決於您使用的圖像大小,例如,我需要1024x512。好處是內存消耗更少,渲染速度更快。運行時,我的意思是應用程序運行的時間。您可以使用BlackPawnTextureBuilder將紋理放置到地圖集中,以便您不必手動執行該操作。使用我的方法,您可以隨心所欲地執行任何操作,它不受動畫製作精靈的限制。 – JohnEye 2012-07-23 12:14:19

0

你確定你不想要比覆蓋ontouch更多的功能嗎?如何創建一個繼承Sprite的類,以便那些需要重寫和需要的區域。

+0

我不能爲每個精靈分開一個類。我需要爲每個sprite的onTouch事件提供不同的實現。 – Waqas 2012-07-17 15:36:33

+0

然後,我不能想到一個好辦法,而不是干擾實施。它取決於實現,但是說你有一個枚舉類型,那麼onareatouch可能由此決定。不幸的是,所有其他解決方案(比如使用命令模式的一些變體來傳遞方法作爲參數)看起來有點矯枉過正。我明白你想要做什麼,但不幸的是,我沒有辦法給予。 – Todilo 2012-07-18 18:19:53

+0

感謝您的幫助:) – Waqas 2012-07-19 04:19:12