2012-07-16 10 views
11

Obecnie mam statyczne odniesienie do wszystkich moich sprite'ów i ładuję je i inicjuję w moim OnCreateResource mthod of SimpleBaseGameActivity, Ale teraz muszę przesłonić na Attitude Attendant na spirtes i sposób w jaki może zmienić to podczas Inicjowania Sprite. Ale mam statyczną metodę tworzenia Atlasu i regionu tekstur dla każdego sprite'a. Używam tych ikonek w mojej klasie scen i chcę je zastąpić w aplikacji AreaTouched. Mogę zarejestrowaćTouchArea dla tej konkretnej ikonki w mojej scenie, aby można było to zrobić Ale chcę Nadpisać OnAreaTouched w taki sposób, aby możliwe było ponowne wykorzystanie kodu. Oto jak obecnie tworzę i ładuję sprite.Najlepsza praktyka używania Sprites w grze przy użyciu AndEngine GLES2

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

I to jest moja metoda 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; 
} 

Teraz, w jaki sposób można zastąpić onAreaTouched dla niektórych duszków, nie tracąc przy tym możliwości ponownego użycia kodu.

Odpowiedz

8

Czy istnieje powód, aby ładować tekstury w czasie wykonywania? Normalnym sposobem jest załadowanie wymaganych tekstur do jednego atlasu podczas ładowania aplikacji, aby można było z nich później szybko korzystać.

Jeśli chodzi o możliwość ponownego użycia kodu, pomysł Todilo na temat wyliczeń wydaje się być tym, czego potrzebujesz. Powiedz na przykład, że masz dwa rodzaje obiektów - przedmioty, które znikają, gdy je dotykasz, oraz obiekty, które latają, gdy je dotykasz. Wymieniasz obie kategorie i umieszczasz fragment kodu w kodzie obsługi zdarzeń dotykowych, który sprawdza, czy obiekt powinien zniknąć, czy polecić w górę.

Jeśli nie wiesz, co obiekty powinny robić w dotyku przed uruchomieniem aplikacji, istnieje bardziej dynamiczny sposób osiągnięcia tego samego wyniku. Po prostu utwórz dwie listy w czasie wykonywania i umieść odniesienie do obiektu na jednej z list, zgodnie z tym, co obiekt powinien zrobić po dotknięciu. Następnie w dotyku obsługi zdarzeń zrobić coś takiego:

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

Szkoda AndEngine nie pozwala użytkownikom ustawić słuchaczy na duchy, to uczynić rzeczy nieco łatwiejsze.

EDIT: Dodane wyjaśnienie stosowania BlackPawnTextureBuilder: Twój Atlas musi być typu BuildableBitmapTextureAtlas, następnie dodać wszystkie tekstury jak ten

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

i po tej

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

I don Nie wiesz, czy to zadziała dla animowanych Sprites, czy nie, będziesz musiał spróbować. Ponadto nie ma mowy o nadpisaniu funkcji onTouch, należy to zrobić w metodzie onAreaTouched. Jednym z przykładów takiego stanu jest

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

jaki powinien być rozmiar atlasu, a następnie jeśli załaduję wszystkie wymagane tekstury do pojedynczego atlasu? Co będzie zaletą korzystania z pojedynczego atlasu, a przy okazji, co masz na myśli przez czas pracy, zainicjuję wszystkie sprite'y na createResources mojego silnika, a następnie wykorzystam je później w mojej aplikacji. – Waqas

+1

I po prostu nie muszę animować ikonki na onTouch, muszę nazywać różne metody mojego Modelu według różnych duszków. – Waqas

+1

Rozmiar atlasu zależy od rozmiaru używanych obrazów, na przykład potrzebuję 1024x512. Zaletą jest mniejsze zużycie pamięci i szybsze renderowanie. Przez środowisko wykonawcze miałem na myśli czas uruchomienia aplikacji. Możesz użyć BlackPawnTextureBuilder, który umieści tekstury na atlasie, tak abyś nie musiał tego robić ręcznie.Używając mojego podejścia możesz robić co chcesz, nie jest to ograniczone animowaniem sprite'ów. – JohnEye

0

Czy na pewno nie chcesz większej funkcjonalności niż zastąpienie ontouch? Co powiesz na stworzenie klasy dziedziczącej dla sprite'a dla tych, którzy potrzebują onarea, aby zostać zastąpionymi i wszystkich innych potrzeb.

+0

Mogę: t mieć oddzielną klasę dla każdego duszka. Muszę nadać inną implementację w każdym wydarzeniu onTouch każdego sprite'a. – Waqas

+0

Potem nie mogę myśleć o dobrej drodze, która nie zaśmieca implementacji. To zależy od implementacji, ale mówię, że masz wyliczenie typów, więc być może onareatouch może być przez to określony.Wszystkie inne rozwiązania (takie jak użycie jakiejś odmiany wzorca polecenia, aby przekazać metodę jako parametr), wydają się nieco przesadzone, niestety. Widzę, co próbujesz zrobić, ale niestety nie mam żadnego rozwiązania. – Todilo

+0

Dzięki za pomoc :) – Waqas

Powiązane problemy