2012-11-08 4 views
2

나는 많은 다른 유형 (즉, 적, 총알 등)으로 확장 된 Entity 객체 클래스를 사용하는 안드로이드 게임을 만들고 있습니다. 엔티티 유형의 풀을 생성 한 다음 얻은 Entity 객체를 런타임에 필요한 모든 것으로 변환하는 방법이 있습니까 (예 : 글 머리 기호 유형)? 엔티티를 생성자에 인수로 전달하면 올바른 풀의 목적을 무시할 수 있습니까? 예는 다음과 같습니다 :Libgdx에서 객체 풀 사용하기

public class EntityPool extends Pool<Entity> { 


public EntityPool (int initialCapacity, int max) { 
    super(initialCapacity, max); 
} 

protected PooledEntity newObject() { 
    return new PooledEntity(); 
} 

public Entity obtain (int objectType) { 
    Entity ent = super.obtain(); 
    if (objectType==SOME_OBJECT_TYPE) 
       //Do something to make ent into that object type 
    return ent; 
} 

public class PooledEntity extends Entity { 
    PooledEntity() { 
     super(null, 0, 0); 
    } 

    public void free() { 
     EntityPool.this.free(this); 
    } 
} 

} 현재 코드

답변

0

, 엔터티 또는 개체의 하위 클래스의 모든 객체를 저장할 수있는 풀. 결과적으로 instanceof 또는 다운 캐스트를 사용하여 구체적인 개체 유형을 가져올 수 있습니다. 당신은 유형에 따라 서로 다른 풀을하고 싶은 경우

, 당신은에 풀의 선언을 변경하는 것을 고려 할 수 있습니다

public class EntityPool<T> extends Pool<T extends Entity> 

그리고 예를 들어 있습니다의

EntityPool<Bullet> bulletsPool = new EntityPool<Bullet>(); //only objects of Bullet of sub classes can be added 
+0

감사합니다. 나는 당신이 제안한 것과 함께갔습니다 (다른 유형의 다른 풀). – Fenster

+0

굉장! 나도 어쩌면 수영장이있는 공장을 가지고 있다고 생각했지만, 당신은 여전히 ​​다운 캐스팅 문제에 갇혀있을 것입니다. –

1

점을 객체 풀은 일반적으로 시스템 할당 및 할당 해제 오버 헤드를 피하기 위해 할당하려는 각 유형의 엔티티 수에 대한 "최악의 경우"제한을 알아야합니다. 따라서 엔티티의 수명과 사용 방식이 다르다고 가정하면 각 엔티티에 대해 별도의 풀을 사용하는 것이 좋습니다. (@ zaske의 대답처럼 풀을 확실히 향상시킬 수 있습니다.)

반면에 실제로 하나의 Entity 풀이 필요하고 런타임에 해당 엔터티를 사용자 지정하려는 경우 엔티티 같은 서브 클래스 : 수영장 밖으로 Entity을 가져올 때 다음

class Entity { 
    EntityCustomizer custom; 
    ... 
} 

당신은 Bullet 또는 Ship이든 카스타 객체를 전달 :

public Entity obtain (int objectType) { 
    Entity ent = super.obtain(); 
    if (objectType==SOME_OBJECT_TYPE) 
    ent.custom = EntityCustomizer.SOME_OBJECT_TYPE_IMPL; 
    return ent; 
} 

(나는 확신 이것은 잘 알려진 패턴이며 적절한 언어를 사용하여 부품을 식별해야합니다 ...)

모두 제가 말한 바에 따르면 각 작업 유형마다 별도의 풀이 사용하는 것이 좋습니다. 예쁜 해키 (일부 런타임 유연성을 위해 컴파일 타임 타입 검사를하고있다).

관련 문제