2015-09-09 3 views
0

В UE4 Я работаю над играми с головоломкой в ​​классе Graphics 2. Наш профессор и наш класс изучают UE4 вместе. Наш класс в целом немного смущен одной вещи в коде на С ++, и мой профессор сказал, что он попытается понять ответ сам, но я решил, что я начну наш следующий класс с информацией, которую я нахожу здесь.UE4.9 Адресация головоломок C++

Хорошо, поэтому в файле BlockGrid.cpp этот раздел кода используется для создания блоков.

void AMyProject2BlockGrid::BeginPlay() 
{ 
    Super::BeginPlay(); 

    // Number of blocks 
    const int32 NumBlocks = Size * Size; 

    // Loop to spawn each block 
    for(int32 BlockIndex=0; BlockIndex<NumBlocks; BlockIndex++) 
    { 
     const float XOffset = (BlockIndex/Size) * BlockSpacing; // Divide by dimension 
     const float YOffset = (BlockIndex%Size) * BlockSpacing; // Modulo gives remainder 

     // Make postion vector, offset from Grid location 
     const FVector BlockLocation = FVector(XOffset, YOffset, 0.f) + GetActorLocation(); 

     // Spawn a block 
     AMyProject2Block* NewBlock = GetWorld()->SpawnActor<AMyProject2Block>(BlockLocation, FRotator(0,0,0)); 

     // Tell the block about its owner 
     if(NewBlock != NULL) 
     { 
      NewBlock->OwningGrid = this; 
     } 
    } 
} 

Путаница начинается со следующей строкой в ​​этой функции:

AMyProject2Block* NewBlock = GetWorld()->SpawnActor<AMyProject2Block>(BlockLocation, FRotator(0,0,0)); 

Каждый раз, когда он выглядит, как он переписывает NewBlock для каждого нового блока в головоломке. Наша проблема заключается в создании игры, которая является Lights Out game, если NewBlock постоянно переписывается, то как она отслеживает адреса для информации для блоков, отображаемых на экране? Это можно было бы исправить, просто создав массив для хранения информации, но если информация все еще хранится где-то, это будет неэффективно. Итак, как мы можем получить доступ к информации для блоков, если NewBlock перезаписывается каждым циклом, не делая массив для неэффективного хранения данных?

СПАСИБО !!!! :)

+0

Примечание: Я не знаю каких-либо особенностей UE4. Основываясь на вышеприведенном коде (который, как я предполагаю, является шаблоном из других источников), мир (из 'GetWorld()') хранит ссылку на созданного актера, поэтому указатель 'NewBlock' существует только для поля' OwningGrid' могут быть установлены. Любой дополнительный доступ к Актерам в мире должен был бы найти эту ссылку другим способом. (См. Например: https://answers.unrealengine.com/questions/16805/c-find-specific-actor-in-scene.html).Обратите внимание, что сохранение массива указателей не является неэффективным, хотя я не знаю политики UE4 по сохранению указателей Actor. –

ответ

0

@ Комментарий Мэтью имеет правильную идею, когда вы используете SpawnActor, Unreal делает целую кучу за кулисами, но по существу создает своего актера в мире и управляет своей жизнью. (Например, чтобы удалить актер от уровня, вам нужно будет использовать:

MyActor->Destroy(); 

, а не метод C++:

delete PtrToActor; 

Это обрабатывает его удаление из сцены, обновление тома столкновений и т.д. перед удалением актера.

К вашему коду вы, конечно же, переписываете указатель на свой блок, поэтому сам блок остается нетронутым. Вы можете использовать TActorIterator<T> iterable для прокрутки всех участников типа, который бы сэкономил вам нужно сохранить n массив. Вы бы сделать что-то вроде этого:

for (TActorIterator<AMyProject2Block> ActorItr(GetWorld()); ActorItr; ++ActorItr) 
{ 
    AMyProject2Block* PtrToActor = *ActorItr; 
} 

Где здесь PtrToActor укажет каждый экземпляр в своей очереди, по мере продвижения петли.

Однако, это не совсем неэффективно (и во многих случаях, является эффективным) для хранения вашего собственного отдельного массива указателей. Это лишь небольшая стоимость памяти (так как это просто указатели) и может быть быстрее, поскольку вам не нужно фильтровать участников, чтобы найти тот, который вы хотите. В любом случае, это большая часть мушмы, поэтому вы должны выбрать тот, который будет более логичным.

В вашем примере я бы сохранил их в 2D-структуре данных, чтобы вы могли получить к ним доступ через свою позицию, а не просто получать неуправляемый список из них.