2016-04-08 25 views
1

Bu yüzden, her nesnenin duvar bölümleri gibi öğeleri gruplamak için kullanabileceğim bir etiket kümesinin bulunduğu, etiketler fikrine dayalı temel bir oyun motoru oluşturmaya çalışıyorum. ve hepsini bir kerede gerçekleştirin. Her bir nesneyi her nesne üzerinde aramak için bir döngü ile çevrelemek istemediğim için, her nesnede geçirilen yöntemi çağırabilecek bir yöntem yapmaya çalışıyorum. Burada Nesnelerin bir listesi üzerine parametre olarak bir işlev geçirme

bazı örnek Suto-koddur: Zaten sorunun bu tip diğer yanıtlar bir demet aracılığıyla baktım

//have a list of objs. some door, some not. 

//an example of stuff I could want to do 
// - check returns on any functions called 
// - call a function on a bunch of objects, possibly with parameters 
if (runOnTag("door", isClosed())[aPositionInReturnList] == true){ 
    runOnTag("door", open()); 
} 

//the method 
public couldBeAnyType[] runOnTag(String tag, function(anyPerams)){ //dont want the function to compile here 
    for (String currentObj : listOfObjsWith[tag]){ 
     returns[index++] = currentObj.function(anyPerams);  //so that it can be executed on this object 
    } 
    return returns; //want to be able to colect returns 
} 

ama onlarda ne olup bittiğini anlamıyorum. Eğer bunu daha kolay anlatabilirseniz, bunu çok takdir ediyorum.

+0

nesneler listenizin tanımını gösterebilir misin? Bunu yapmanın daha iyi bir yolu olmalı – jack3694078

cevap

0

Varsayım: Etiketleri dinamik olarak değiştiren nesneleriniz yok.

Etiketlerinizi neden arayüz olarak kullanmıyorsunuz? Bu, string eşleştirmeden daha hızlı, tip güvenli ve genel olarak daha verimli.

interface Door {boolean isClosed(); void open();} 

class State { 
    private Collection<Object> gameObjects; 

    public <T,R> Stream<R> onTagged(Class<T> type, Function<T,R> apply) { 
     return gameObjects 
      .stream() 
      .filter(type::isInstance) 
      .map(type::cast) 
      .map(apply); 
    } 
} 

Adını (onTagged) dikkate almayın, kendiniz yapın. Bu, bu gibi kullanılabilir

State state = ...; 
if(state.onTagged(Door.class, door -> !door.isClosed()).anyMatch(Boolean.TRUE::equals)) { 
    // ... do stuff ... 
} 

Sen ancak genellikle daha iyi böyle olduğunu bulacaksınız o zaman işlemleri (harita/filtre/herhangi *) oluşturabilirsiniz çünkü çok kolay,: Açık herhangi bir kapı varsa bulmak için

public <T> Stream<T> withTag(Class<T> type) { 
     return gameObjects 
      .stream() 
      .filter(type::isInstance) 
      .map(type::cast); 
    } 

if(state.withTag(Door.class).anyMatch(door -> !door.isClosed())) { 
    // ... do stuff ... 
} 
İlgili konular