2016-08-28 2 views
0

Edit: Удалены некоторые бесполезные кодИнициализация константный символ **

Я использую IMGUI для GUI библиотеки моей игры, и я пытаюсь реализовать ListBoxes. Однако мой const char **, похоже, не читается правильно IMGUI.

#include <tinydir.h> 
#include <tinyxml2.h> 
#include <cpplocate/ModuleInfo.h> 
#include <cpplocate/cpplocate.h> 
#include <iostream> 
#include <easylogging++.h> 

#include "DmuxCommon.hpp" 
#include "Garage.hpp" 
#include "client/Game.hpp" 

irr::f32 garageRotationRate = irr::f32(1.0f); 
irr::f32 gChassisRotation; 
irr::f32 gCameraRotation; 
int selection = 0; 

namespace menu { 

const char **Garage::names; 


    Garage::Garage() : 
    Gui(), 
    pMainScreen(Game::device->getSceneManager()->addEmptySceneNode()), 
    pMoonScreen(Game::device->getSceneManager()->addEmptySceneNode()), 
    availableChassis(getAvailableChassises()) { 

    // Prepare double rendering 
    pRenderTarget = Game::device->getVideoDriver()->addRenderTargetTexture(irr::core::dimension2d<irr::u32>(384, 300), "Moon"); 

    pRenderTextureID = pGUI->createTexture(pRenderTarget); 

    names = new const char *[availableChassis.size()]; 
    for(unsigned int i = 0; i < availableChassis.size(); ++i) { 
     names[i] = availableChassis[i].c_str(); 
    } 

    for(unsigned int i = 0; i < availableChassis.size(); ++i) { 
     std::cout << names[i] << std::endl; // This shows the content of the const char ** correctly 
    } 
    } 

    void Garage::show() { 

    //Rendering the node 
    Game::device->getVideoDriver()->setRenderTarget(pRenderTarget, true, true, irr::video::SColor(255, 120.0f, 120.0f, 120.0f)); 
    pMoonScreen->setVisible(true); 
    pMainScreen->setVisible(false); 
    Game::device->getSceneManager()->setActiveCamera(pMoonCam); 
    Game::device->getSceneManager()->drawAll(); 
    Game::device->getVideoDriver()->setRenderTarget(0, true, true, irr::video::SColor(255, 100, 101, 140)); 

    pMoonScreen->setVisible(false); 
    pMainScreen->setVisible(true); 
    Game::device->getSceneManager()->setActiveCamera(pMainCam); 

    pGUI->updateTexture(pRenderTextureID, pRenderTarget); 

    if(gChassis == nullptr) { 
     gChassis = Game::device->getSceneManager()->addMeshSceneNode(Game::device->getSceneManager()->getMesh((std::string(cpplocate::findModule("dmux").value("chassisDir") + "el-camino/el-camino.obj")).c_str())); 
     gChassis->setParent(pMoonScreen); 
     gChassis->setPosition(irr::core::vector3df(0, 0, 0)); 
     gChassis->setMaterialFlag(irr::video::EMF_LIGHTING, false); 
     gChassis->setMaterialFlag(irr::video::EMF_BACK_FACE_CULLING, false); 

     pMainCam = Game::device->getSceneManager()->addCameraSceneNode(pMoonScreen, irr::core::vector3df(0, 0, 0), irr::core::vector3df(0, 0, 0)); 
     pMoonCam = Game::device->getSceneManager()->addCameraSceneNode(pMoonScreen, irr::core::vector3df(0, 0, -5), irr::core::vector3df(0, 0, 0)); 
     pMoonCam->setTarget(gChassis->getPosition()); 
     gCameraRotation = irr::f32(1.0f); 
    } 

    ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f)); 
    ImGui::SetNextWindowSize(ImVec2(Game::playerSettings.currentWindowSize.first, 
            Game::playerSettings.currentWindowSize.second - (Game::playerSettings.currentWindowSize.second/9))); 

    ImGui::Begin("Customize a combat vehicle"); 

    ImGui::PushItemWidth(120); 
    ImGui::ListBox("", &selection, names, ((int)(sizeof(names)/sizeof(*names)))); 
    ImGui::PopItemWidth(); 

    ImGui::End(); 
    } 
} 

Компиляция этот файл с остальной частью моего проекта я получаю окно, которое выглядит как этот

https://s4.postimg.org/cyrdl2p8d/DMUX_130.png

Как вы можете видеть, что это не печатает из всего содержимого константным полукокса * * как это должно. Но заявления COUT правильно распечатав содержимое массива, который должен быть

  • "El Camino"
  • "Moscovitch"
  • "ElCamino"

без кавычек, это становится первое значение правильно, как показано на рисунке. Есть ли что-то неправильное, что я делаю с инициализацией переменной имен? SizeOf странно из-кода в imgui_demo.cpp IMGUI в его использовали этот макрос для SizeOf на ListBoxes

Так что я просто взял необработанный ввод, а не с помощью определения.

+0

Подсказка: что такое 'sizeof (names)'? –

+1

Попробуйте создать MCVE, который иллюстрирует вашу проблему. В коде, который вы опубликовали, так много несвязанных крутизны, что вы вряд ли можете ожидать, что кто-то еще пробирается, чтобы найти вашу проблему, если вы не беспокоили себя. В процессе вырезания ненужного материала у вас может быть «ага!». момент и решить для себя, в чем проблема. Если нет, у других людей будет шанс сразиться с вами. – Peter

+0

Если бы я предложил минимальный пример; то это просто привлечет меня к содержимому указанного const char **, о котором я уже упоминал, работает правильно, проблема заключается в коде GUI, поэтому я включил это в свой вопрос. – bkeys

ответ

0

Edit: ввод в лучшем ответ

Я получил это после того, как весь день смотреть на него! Я установил его, говоря

availableChassis.size() 

мне удалось это исправить, спасибо @Ismail Бадави @Paul и @ 1201ProgramAlarm указал мне в правильном направлении.

0

Это то, что вы говорите: отображение 1 выбор в списке. Ваш расчет количества элементов списка неверен. sizeof(names) - это то же самое, что и sizeof(*names), так как оба являются указателями.

+0

Любые предложения о том, на что я должен его изменить? Я попробовал доступный Chassis.size(), и он все равно делает то же самое. – bkeys

+0

@bkeys Вы выделяете 'availableChassis.size()' элементы для своих 'names', поэтому просто передайте' availableChassis.size() ', где вам нужно передать размер' names'. 'sizeof (array)/sizeof (* array)' работает для массивов в стеке, когда 'sizeof (array)' приведет к фактическому размеру 'array'. В вашем случае 'sizeof (names) == sizeof (char **)', который вам не нужен. – Paul

+0

@Paul Я пытаюсь передать sizeof (availableChassis.size()) в вызов функции ListBox, однако при попытке выполнить эту ошибку, когда я пытаюсь сделать это – bkeys

0

Также, если ваши данные не в том формате const char * [], то вместо создания временного массива вы можете передать лямбду в ListBox для доступа к вашим строкам непосредственно из ваших доступных имен [Chassis []].

Смежные вопросы