LINUX.ORG.RU

Как добавить экран приветствия/загрузки с прогресс баром?

 , , ,


1

2

Вот код:

#include "Game.h"
Game::Game()
{
        run=true;
	bonus = false;
	Logic_ = new Logic();
	loading = true;
}
void__ Game::draw_screen()
{
    while(run)
    {
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_MATERIAL);
		glEnable(GL_TEXTURE_2D);
		if (Math_->GetWin_() > 0 && !bonus && Math_->keyboard_->getF(3) == true)
		{
			bonus = true;
			Math_->keyboard_->setF(false, 3);
			Math_->keyboard_->setF(false, 0);
			Math_->keyboard_->setF(false, 1);
			Math_->keyboard_->setF(false, 2);
			Math_->keyboard_->setF(false, 4);
			Logic_->SetRandom();
		}
		if ((Math_->GetWin_() > 0 && bonus && Math_->keyboard_->getF(1) == true) || (bonus && Math_->GetWin_() == 0))
		{
			bonus = false;
			Math_->keyboard_->setF(false, 1);
			Math_->keyboard_->setF(false, 0);
			Math_->keyboard_->setF(false, 2);
			Math_->keyboard_->setF(false, 3);
			Math_->keyboard_->setF(false, 4);
		}
		if (!bonus){
			
			Scene1_->ShowDrum();
			//Scene1_->ShowWelcome(loading);
			//Scene_->Show(Math_->GetCountDrums(), Math_->GetRotate(), Math_->GetCountTextureOnDrums(), Math_->GetDrums(),
				//Math_->GetCredits(), Math_->GetWin_(), Math_->GetTotalBet(), Math_->GetLines_(), Math_->GetBet(),
				//Math_->GetLines(), Math_->GetMS(), Math_->keyboard_->GetF());
		}
		else
		{
			Logic_->SetCredits(Math_->GetCredits());
			Logic_->SetWin(Math_->GetWin_());
			Logic_->SetTotalBet(Math_->GetTotalBet());
			Scene2_->ShowBackGround(Math_->keyboard_->GetF(), Logic_->GetRandom(),
				Logic_->GetCredits(), Logic_->GetWin(), Logic_->GetTotalBet());
		}
		glDisable(GL_TEXTURE_2D);
#ifdef _WINDOWS_2
			Math_->keyboard_->keyboard__->Show();
#else
        SDL_GL_SwapWindow(window);
#endif
#ifndef _WINDOWS_2
        Math_->Update(&run,bonus,Logic_,event_);
#else
        Math_->Update(&run,bonus,Logic_);
#endif
	loading = false;
    }
    Exit();
}
void__ Game::setup_opengl(int__ width,int__ height)
{
    glClearColor(0,0,0,0);
    glViewport(0,0,width,height);
    glShadeModel(GL_SMOOTH);
    glCullFace(GL_BACK);
    glFrontFace(GL_CCW);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f);
    gluPerspective(189,0.5,0.6,0.6);
	ilInit(); // Инициализация основной библиотеки
	iluInit(); // Инициализация библиотеки утилит
	ilEnable(IL_CONV_PAL);
    ilEnable(IL_ORIGIN_SET);
    ilSetInteger(IL_ORIGIN_MODE, IL_ORIGIN_UPPER_LEFT);
}
int__ Game::Execute()
{
    Math_=new Math();
    bool fullscreen=Math_->Init();
#ifdef _WINDOWS_2
	if(!Math_->keyboard_->keyboard__->CreateWindow_(L"Tropic Island",Math_->GetResolution().x,Math_->GetResolution().y,32,fullscreen))
		return 0;
#else
    SDL_GLContext context;
    SDL_Init(SDL_INIT_VIDEO);
    window=SDL_CreateWindow("Tropic Island",0,0,Math_->GetResolution().x,Math_->GetResolution().y,SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
    context=SDL_GL_CreateContext(window);
    SDL_GL_SetSwapInterval(1);
#endif
	setup_opengl(Math_->GetResolution().x,Math_->GetResolution().y);

	Scene_ = new Scene();
	Scene2_ = new Scene2();
	Scene2_->SetData();
//	Scene2_->LoadWelcome();
	Scene1_ = new Scene1();
	Scene1_->LoadWelcome();
	Scene1_->LoadDrum();
    draw_screen();
#ifdef _WINDOWS_2
	Math_->keyboard_->keyboard__->KillWindow();
#else
    SDL_GL_DeleteContext(context);
    SDL_DestroyWindow(window);
    SDL_Quit();
#endif
    return 0;
}
void Game::Exit()
{
    run=false;
}
Game::~Game()
{
	//delete run;
    delete Math_;
    delete Scene_;
    delete Scene2_;
	delete Logic_;
}
Из-за долгой загрузки Scene2_->SetData(); Висит белый экран около 30 секунд,а нужно чтобы показывался код из Scene1_->ShowWelcome();



Последнее исправление: Gremlin_ (всего исправлений: 1)

Ну пусть Scene2_->SetData() выполняется в отдельном потоке, уведомляя о ходе процесса основной через какую-нибудь потокобезопасную очередь сообщений. В чём сложность-то?

XMs ★★★★★
()
Ответ на: комментарий от XMs

Зачем потокобезопасную, если задача просто прогрессбар нарисовать.

anonymous
()

почему ты иногда ставишь пробелы вокруг знака равно, а иногда нет? почему ты не используешь initializer list в конструкторе? зачем ты создаешь объект Logic в динамической памяти, почему не на стеке, почему не умный указатель?

это первая пачка вопросов. если осилишь на них ответить, задам еще пачку

anonymous
()

Блин столько возможностей выбирай не хочу Задача: у нас есть два потока и надо сообщать одному о состояние другого как это сделать:

  • callback функции
  • механизмы сигналы слоты (различные реализации Qt SDK GTK+ Boost)
  • mpi

Не уж-то нельзя погуглить

Silerus ★★★★
()
Ответ на: комментарий от XMs

Отвечаю всем и каждому. Если юзать std::thread , то данные не грузятся(из-за контекста),там проблемка в том ,что код рендера в бесконечном цикле while(run) и не получится загрузить ни до ни во время рендера

Gremlin_
() автор топика
Ответ на: комментарий от anonymous

1. Ставлю пробелы как хочу 2. Не знаю что это 3. Потому что работает и так 4. умный указатель впервые слышу

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

как тебе уже писали раньше

Положи компилятор и отойди на 3 шага и никто не пострадает или по другому дай дураку член хрустальный - он и член разобъет и сам порежется.

Еще раз есть стандартные механизмы использования меж поточного общения, надо просто выбрать и пользоваться. Кроме того есть такая штука, как mutex и семафоры - ими тоже надо пользоваться

Silerus ★★★★
()
Ответ на: комментарий от Gremlin_

многое прояснилось.

почему объект Math создаётся в методе Execute, а уничтожается в деструкторе? почему ты не ставишь пробелы после запятых? почему такое непостоянство в стиле?

bonus && Math_->keyboard_->getF(1) == true

почему не

bonus == true && Math_->keyboard_->getF(1) == true

или не

bonus && Math_->keyboard_->getF(1)

???

anonymous
()
Ответ на: комментарий от anonymous

потому что писалось в разное время, несколько лет промежуток

Gremlin_
() автор топика
Ответ на: комментарий от anonymous

что-то == тру, потому что менял на фалсе при отладке

Gremlin_
() автор топика
Ответ на: комментарий от Gremlin_

то данные не грузятся(из-за контекста)

Сделай и покажи, как сделал. Скорее всего, ты сделал что-то неправильно.


что код рендера в бесконечном цикле while(run)

И что? Сделай себе eventloop и делай всё через него, проблем-то

XMs ★★★★★
()
Ответ на: комментарий от anonymous

я не знаю opengl, поэтому насчет этих функций ничего сказать не могу. но в целом от кода пахнет шизофренией. мне трудно представить, что ТС нас не троллит, ибо так плохо даже первокурсники не пишут.

anonymous
()
Ответ на: комментарий от Gremlin_

Все очень плохо. Лучше почитай о том, что написал тебе анон. Как минимум облегчишь себе в будущем жизнь умными указателями. Как максимум тебя не выгонят на собеседовании за то, что ты не знашь что такое С++ в 2018ом.

Потому что работает и так

Кек. Если у тебя дырка в зубе будет, ты к стоматологу не пойдешь пока десна гнить не начнет?

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.