Jump to content

  • Log In with Google      Sign In   
  • Create Account

Calling all IT Pros from Canada and Australia.. we need your help! Support our site by taking a quick sponsored surveyand win a chance at a $50 Amazon gift card. Click here to get started!


c_fried_rice

Member Since 07 Oct 2013
Offline Last Active Private

Topics I've Started

How to "reset" a singleton?

22 February 2014 - 06:22 AM

This may come off as rather vague but I've been awake too long, and will post more info later if needed.

 

I have a state machine that deals with an abstract State class. Inherited from this are several Singleton gamestate classes. However, players will be able to transition back to certain states, and when they do I want the state to be totally reset - as if it were refreshed.

 

How would I go about doing this?

 

Thanks a ton!


"Use of Unregistered Class" + Luabind

02 February 2014 - 12:56 PM

Hey guys, 

 

I'm trying to convert my game engine's use of luabridge to luabind, and am running into a fairly large issue:

 

I get this error upon trying to transition to the "SongSelect" state:

 

 

std::runtime_error: 'Trying to use unregistered class'

 

Here's some of the C++ code calling the lua script:

SongSelect::Instance()->register_lua(L);

int error = luaL_loadfile(L, "Assets/Scripts/States/SongSelect.lua");

if (error)
{
	std::cout << lua_tostring(L, -1) << std::endl;
}

m_pGamestateManager->getStateMachine()->changeState(SongSelect::Instance());

if (lua_pcall(L, 0, 0, 0) != 0)
{
	std::cout<< " Error (in SM transition) "<< lua_tostring(L, -1) <<std::endl;
} 

Here's the registration of the Luabind Module:

void SongSelect::register_lua(lua_State* L)
{
	if (L != NULL)
	{
		luabind::module(L) [
			luabind::class_<SongSelect>("SongSelect")
			.scope[
					luabind::def("Instance", &SongSelect::Instance)
			]
				.def("init", &SongSelect::stateInit)
				.def("initSongs", &SongSelect::initSongs)
				.def("initAlbumArt", &SongSelect::initAlbumArt)
				.def_readwrite("bg", &SongSelect::bg)
				.def_readwrite("name", &SongSelect::name)
				.def_readwrite("font", &SongSelect::font)
				.def_readwrite("label", &SongSelect::label)
				.def_readwrite("artist", &SongSelect::artist_i)
				.def_readwrite("album_i", &SongSelect::album_i)
				.def_readwrite("title", &SongSelect::title_i)
				.def_readwrite("year", &SongSelect::year_i)
				.def_readwrite("genre", &SongSelect::genre_i)
				.def_readwrite("right", &SongSelect::right_i)
				.def_readwrite("left", &SongSelect::left_i)
				.def_readwrite("songs", &SongSelect::songs)
		];
	}
}
void Game::register_lua(lua_State* L)
{
	if (L != NULL)
	{
		luabind::module(L) [
				luabind::class_<Game>("Game")
					.scope[
						luabind::def("Instance", &Game::Instance)
					]
					.def_readwrite("title", &Game::title)
					.def_readwrite("x_pos", &Game::x)
					.def_readwrite("y_pos", &Game::y)
					.def_readwrite("width", &Game::width)
					.def_readwrite("height", &Game::height)
					.def_readwrite("fullscreen", &Game::fullscreen)
					.def_readwrite("font", &Game::font)
					.def_readwrite("label", &Game::label)
					.def("init", &Game::initialize),
				luabind::class_<Track>("Track")
					.def(luabind::constructor<>())
					.def_readwrite("music", &Track::music)
					.def_readwrite("midi", &Track::midi)
					.def_readwrite("title", &Track::title)
					.def_readwrite("artist", &Track::artist)
					.def_readwrite("genre", &Track::genre)
					.def_readwrite("album", &Track::album)
					.def_readwrite("album_art", &Track::album_art)
					.def_readwrite("year", &Track::year)
					.def_readwrite("bpm", &Track::bpm)
					.def_readwrite("l_track", &Track::left_track)
					.def_readwrite("r_track", &Track::right_track),
				luabind::class_<GameObject>("GameObject")
					.def(luabind::constructor<>())
					.def_readwrite("row", &GameObject::m_row)
					.def_readwrite("frame", &GameObject::m_frame)
					.def_readwrite("rows", &GameObject::m_rows)
					.def_readwrite("frames", &GameObject::m_frames)
					.def_readwrite("x", &GameObject::m_x)
					.def_readwrite("y", &GameObject::m_y)
					.def_readwrite("width", &GameObject::m_width)
					.def_readwrite("height", &GameObject::m_height)
					.def_readwrite("filename", &GameObject::m_filename)
					.def_readwrite("texture", &GameObject::m_texture)
					.def_readwrite("speed", &GameObject::m_speed)
					.def("init", &GameObject::init),
				luabind::class_<FXObject, GameObject>("FXObject")
					.def(luabind::constructor<>())
					.def_readwrite("x2", &FXObject::m_x2)
					.def_readwrite("y2", &FXObject::m_y2)
					.def_readwrite("xc", &FXObject::m_xc)
					.def_readwrite("yc", &FXObject::m_yc)
					.def_readwrite("scale", &FXObject::m_sscale)
					.def_readwrite("end_scale", &FXObject::m_escale)
					.def_readwrite("start_alpha", &FXObject::m_startalpha)
					.def_readwrite("start_alpha_f", &FXObject::m_startalpha_f)
					.def_readwrite("alpha", &FXObject::m_alpha)
					.def_readwrite("end_alpha", &FXObject::m_endalpha),
				luabind::class_<UIObject, GameObject>("UIObject")
					.def(luabind::constructor<>()),
				luabind::class_<UIAnimator, UIObject>("UIAnimator")
					.def(luabind::constructor<>()),
				luabind::class_<UIButton, UIObject>("UIButton")
					.def(luabind::constructor<>()),
				luabind::class_<StaticUI, UIObject>("StaticUI")
					.def(luabind::constructor<>())
					.def_readwrite("flip", &StaticUI::m_flip)
					.def_readwrite("alpha", &StaticUI::m_alpha)
					.def("init", &StaticUI::init)
		];
	}
}

Here's the lua script where the error is occurring:

-- SongSelect Properties
ssInstance = SongSelect.Instance();

ssInstance.name = "Song Select";
ssInstance.bg = "Assets/Art/Song Select/bg.png";

-- Artist Icon
ssInstance.artist = StaticUI();
ssInstance.artist.filename = "Assets/Art/Other/placeholder.png";
ssInstance.artist.texture = "Artist Icon";
ssInstance.artist.frames = 1
ssInstance.artist.rows = 1
ssInstance.artist.frame = 1
ssInstance.artist.row = 1
ssInstance.artist.x = 15;
ssInstance.artist.y = 415;
ssInstance.artist.width = 35
ssInstance.artist.height = 35
ssInstance.artist.speed = 1;
ssInstance.artist.flip = false;
ssInstance.artist.alpha = 255;

ssInstance.artist:init(ssInstance.artist.x, ssInstance.artist.y,
  ssInstance.artist.width, ssInstance.artist.height,
  ssInstance.artist.filename, ssInstance.artist.texture, ssInstance.artist.flip);

-- Album Icon
ssInstance.album_i = StaticUI();
ssInstance.album_i.filename = "Assets/Art/Other/placeholder.png";
ssInstance.album_i.texture = "Album Icon";
ssInstance.album_i.frames = 1
ssInstance.album_i.rows = 1
ssInstance.album_i.frame = 1
ssInstance.album_i.row = 1
ssInstance.album_i.x = 15;
ssInstance.album_i.y = 450;
ssInstance.album_i.width = 35
ssInstance.album_i.height = 35
ssInstance.album_i.speed = 1;
ssInstance.album_i.flip = false;
ssInstance.album_i.alpha = 255;

ssInstance.album_i:init(ssInstance.album_i.x, ssInstance.album_i.y,
  ssInstance.album_i.width, ssInstance.album_i.height,
  ssInstance.album_i.filename, ssInstance.album_i.texture, ssInstance.album_i.flip);

-- Title Icon
ssInstance.title = StaticUI();
ssInstance.title.filename = "Assets/Art/Other/placeholder.png";
ssInstance.title.texture = "Title Icon";
ssInstance.title.frames = 1
ssInstance.title.rows = 1
ssInstance.title.frame = 1
ssInstance.title.row = 1
ssInstance.title.x = 15;
ssInstance.title.y = 485;
ssInstance.title.width = 35
ssInstance.title.height = 35
ssInstance.title.speed = 1;
ssInstance.title.flip = false;
ssInstance.title.alpha = 255;


ssInstance.title:init(ssInstance.title.x, ssInstance.title.y,
  ssInstance.title.width, ssInstance.title.height,
  ssInstance.title.filename, ssInstance.title.texture, ssInstance.title.flip);


-- Year Icon
ssInstance.year = StaticUI();
ssInstance.year.filename = "Assets/Art/Other/placeholder.png";
ssInstance.year.texture = "Year Icon";
ssInstance.year.frames = 1
ssInstance.year.rows = 1
ssInstance.year.frame = 1
ssInstance.year.row = 1
ssInstance.year.x = 15;
ssInstance.year.y = 520;
ssInstance.year.width = 35
ssInstance.year.height = 35
ssInstance.year.speed = 1;
ssInstance.year.flip = false;
ssInstance.year.alpha = 255;


ssInstance.year:init(ssInstance.year.x, ssInstance.year.y,
  ssInstance.year.width, ssInstance.year.height,
  ssInstance.year.filename, ssInstance.year.texture, ssInstance.year.flip);


-- Genre Icon
ssInstance.genre = StaticUI();
ssInstance.genre.filename = "Assets/Art/Other/placeholder.png";
ssInstance.genre.texture = "Genre Icon";
ssInstance.genre.frames = 1
ssInstance.genre.rows = 1
ssInstance.genre.frame = 1
ssInstance.genre.row = 1
ssInstance.genre.x = 15;
ssInstance.genre.y = 555;
ssInstance.genre.width = 35
ssInstance.genre.height = 35
ssInstance.genre.speed = 1;
ssInstance.genre.flip = false;
ssInstance.genre.alpha = 255;


ssInstance.genre:init(ssInstance.genre.x, ssInstance.genre.y,
  ssInstance.genre.width, ssInstance.genre.height,
  ssInstance.genre.filename, ssInstance.genre.texture, ssInstance.genre.flip);

-- Right Track Icon
ssInstance.right = StaticUI();
ssInstance.right.filename = "Assets/Art/Other/placeholder.png";
ssInstance.right.texture = "Right Icon";
ssInstance.right.frames = 1
ssInstance.right.rows = 1
ssInstance.right.frame = 1
ssInstance.right.row = 1
ssInstance.right.x = 15;
ssInstance.right.y = 590;
ssInstance.right.width = 35
ssInstance.right.height = 35
ssInstance.right.speed = 1;
ssInstance.right.flip = false;
ssInstance.right.alpha = 255;


ssInstance.right:init(ssInstance.right.x, ssInstance.right.y,
  ssInstance.right.width, ssInstance.right.height,
  ssInstance.right.filename, ssInstance.right.texture, ssInstance.right.flip);


-- Left Track Icon
ssInstance.left = StaticUI();
ssInstance.left.filename = "Assets/Art/Other/placeholder.png";
ssInstance.left.texture = "Left Icon";
ssInstance.left.frames = 1
ssInstance.left.rows = 1
ssInstance.left.frame = 1
ssInstance.left.row = 1
ssInstance.left.x = 15;
ssInstance.left.y = 625;
ssInstance.left.width = 35
ssInstance.left.height = 35
ssInstance.left.speed = 1;
ssInstance.left.flip = false;
ssInstance.left.alpha = 255;


ssInstance.left:init(ssInstance.left.x, ssInstance.left.y,
  ssInstance.left.width, ssInstance.left.height,
  ssInstance.left.filename, ssInstance.left.texture, ssInstance.left.flip);

-- FONTS
ssInstance.font = "Assets/Fonts/ostrich-bold.ttf";
ssInstance.label = "ostrich16";

-- Init Songs
ssInstance:initSongs();

ssInstance:initAlbumArt(ssInstance.songs);

ssInstance:init();

Can anyone tell me what I'm doing wrong?

 

Thanks!


LuaBind + LNK2001 Error

31 January 2014 - 12:09 AM

Hey guys,

 

So I'm trying out Luabind as an alternative to Luabridge, but am struggling to get my game to work with it. I'm encountering this error:

 

 

Error 3 error LNK2001: unresolved external symbol "private: static unsigned int const luabind::detail::class_id_map::local_id_base" (?local_id_base@class_id_map@detail@luabind@@0IB)

 

Has anyone encountered this linker issue with Luabind before? I'm using VS2012, and can't figure out what the cause is. =\

 

Help would be appreciated!


Finding Files in a Directory on Windows, with Lua Scripts : Issue I Can't Figure Out

27 January 2014 - 03:08 PM

Hey guys, I have a pretty MAJOR issue with some of my code for a game I'm working on.

 

Basically, I have the following code to find all the lua scripts and then grab some information from them on a selection screen. It works fine when I run it from Visual Studio 2012 (as both release and debug) but doesn't appear to function properly. Some pictures don't appear, and some random text characters appear instead of the actual text, and in some place there's on text whatsoever. I don't have any include how to debug this to be honest.

 

Here's the code that initializes all the stuff.

void SongSelect::init(GamestateManager* gameStateManager, lua_State* L)
{
	m_pInputManager = InputManager::Instance();
	ImageManager* m_pImageManager = ImageManager::Instance();
	Game* m_pGame = Game::Instance();
	AudioManager* m_pAudioManager = AudioManager::Instance();

	songs = initSongs(L);
	std::cout << "Attemping to read songselect.lua\n";
	luaL_dofile(L, "Assets/Scripts/States/SongSelect.lua");
	std::cout << "Read songselect.lua\n";

	m_pImageManager->load(bg, "bg", m_pGame->getRenderer());

	current_pad = old_pad = NULL;


	initAlbumArt(songs);

	info_col.a = 200;
	info_col.r = 255;
	info_col.g = 255;
	info_col.b = 255;

	TextManager::Instance()->loadText(font, label, 36);

	selected = 0;
}

std::vector<Track*> SongSelect::initSongs(lua_State* L)
{
	std::vector<Track*> tracks;

	// code based off of code found on Google, with modifications to create the track objects
	WIN32_FIND_DATA file_search;

	HANDLE handle = FindFirstFile("Assets\\Scripts\\Songs\\*.lua", &file_search);

	while (handle != INVALID_HANDLE_VALUE)
	{
		std::string song_file;
		std::stringstream song_file_stream;
		song_file_stream << "Assets\\Scripts/Songs\\" << file_search.cFileName;
		song_file = song_file_stream.str();

		song_files.push_back(song_file);

		luaL_dofile(L, song_file.c_str());
		Track* track = luabridge::getGlobal(L, "music_track");
		tracks.push_back(track);

		if (!FindNextFile(handle, &file_search))
		{
			break;
		}
	}

	FindClose(handle);

	return tracks;
}

Any ideas why this may work when run from Visual Studio 2012 but not when launched directly from Windows Explorer in a different location? It makes it kind of hard to playtest/ release the game if I can't even get it to run properly on other computers!

 

Thanks a ton!


Time Sensitive Buttons Presses

26 December 2013 - 06:08 PM

Hey guys!

 

Sorry for the poorly titled thread. Basically I'm working on a music game, and want there to be an accuracy factor to when the player hits the note. My current code is as follows:

void Gameplay::detectHit(note_buttons pressed, double time)
{
	if ((note_gems_left.empty() && current_track == &note_gems_left) ||
		(note_gems_right.empty() && current_track == &note_gems_right))
	{
		return;
	}

	if (current_track == &note_gems_left)
	{
		if (pressed == notes_left_s.front()->getButton())
		{
			if (time <= notes_left_s.front()->getTimeStamp()  + great_t
				&& time >= notes_left_s.front()->getTimeStamp()  - great_t)
			{
				score += points * great;
				note_hit = GREAT;
				note_gems_left.erase(note_gems_left.begin());
				notes_left_s.erase(notes_left_s.begin());
			}
			else if (time <= notes_left_s.front()->getTimeStamp()  + nice_t
				&& time >= notes_left_s.front()->getTimeStamp()  - nice_t)
			{
				score += points * nice;
				note_hit = NICE;
				note_gems_left.erase(note_gems_left.begin());
				notes_left_s.erase(notes_left_s.begin());			
			}
			else if (time <= notes_left_s.front()->getTimeStamp()  + good_t
				&& time >= notes_left_s.front()->getTimeStamp() - good_t)
			{
				score += points * good;
				note_hit = GOOD;
				note_gems_left.erase(note_gems_left.begin());
				notes_left_s.erase(notes_left_s.begin());
			}			
			else if (time <= notes_left_s.front()->getTimeStamp()  + poor_t
				&& time >= notes_left_s.front()->getTimeStamp()  - poor_t)
			{
				score += points * poor;
				note_hit = POOR;
				note_gems_left.erase(note_gems_left.begin());
				notes_left_s.erase(notes_left_s.begin());
			}
			else
			{
				note_hit = MISS;
				note_gems_left.erase(note_gems_left.begin());
				notes_left_s.erase(notes_left_s.begin());
			}
		}
		else
		{
			note_hit = MISS;
		}
	}
	else if (current_track == &note_gems_right)
	{
		if (pressed == notes_right_s.front()->getButton())
		{
			if (time <= notes_right_s.front()->getTimeStamp()  + great_t
				&& time >= notes_right_s.front()->getTimeStamp()  - great_t)
			{
				score += points * great;
				note_hit = GREAT;
				note_gems_right.erase(note_gems_right.begin());
				notes_right_s.erase(notes_right_s.begin());
			}
			else if (time <= notes_right_s.front()->getTimeStamp()  + nice_t
				&& time >= notes_right_s.front()->getTimeStamp()  - nice_t)
			{
				score += points * nice;
				note_hit = NICE;
				note_gems_right.erase(note_gems_right.begin());
				notes_right_s.erase(notes_right_s.begin());
			}
			else if (time <= notes_right_s.front()->getTimeStamp() + good_t
				&& time >= notes_right_s.front()->getTimeStamp()  - good_t)
			{
				score += points * good;
				note_hit = GOOD;
				note_gems_right.erase(note_gems_right.begin());
				notes_right_s.erase(notes_right_s.begin());
			}			
			else if (time <= notes_right_s.front()->getTimeStamp()  + poor_t
				&& time >= notes_right_s.front()->getTimeStamp()  - poor_t)
			{
				score += points * poor;
				note_hit = POOR;
				note_gems_right.erase(note_gems_right.begin());
				notes_right_s.erase(notes_right_s.begin());
			}
			else
			{
				note_hit = MISS;
				note_gems_right.erase(note_gems_right.begin());
				notes_right_s.erase(notes_right_s.begin());
			}
		}
		else
		{
			note_hit = MISS;
		}
	}
}

My main issue is that I feel like this could be done in a MUCH better way. I'm just not sure how to go about it. Basically there are different accuracy levels for hitting the note - ranging from MISS to GREAT (with POOR, GOOD, & NICE in between). It affects the score, and the amount of "life" the player has.

 

Anyone got any suggestions?

 

Thanks a ton!


PARTNERS