This document describes how to port your game from an old ClanLib version to a new one. Upgrading from 0.5.4 to 0.6.0 ============================= 1. Signals have been made consistent all over ClanLib ----------------------------------------------------- In a few cases you need to add a parenthesis to a signal. Example: CL_Timer timer; // ClanLib 0.5.x: sig_timer.connect(...) // ClanLib 0.6.0: sig_timer().connect(...) The affected signals are as follows: CL_Timer::sig_timer CL_Input::sig_button_press CL_Input::sig_button_release CL_Input::sig_mouse_move CL_Mouse::sig_move CL_Mouse::sig_button_press CL_Mouse::sig_button_release 2. Input signals were changed in clanGUI ---------------------------------------- CL_Component::sig_key_up(CL_Component *comp, CL_InputDevice *device, const CL_Key &key) CL_Component::sig_key_down(CL_Component *comp, CL_InputDevice *device, const CL_Key &key) CL_Component::sig_mouse_move(CL_Component *comp, int x, int y); were changed to: CL_Component::sig_key_up(const CL_Key &key) CL_Component::sig_key_down(const CL_Key &key) CL_Component::sig_mouse_move(int x, int y); Also, the following signals were added: CL_Component::sig_input_up(CL_InputDevice *device, const CL_Key &key) CL_Component::sig_input_down(CL_InputDevice *device, const CL_Key &key) sig_key_up/down used to include both mouse and keyboard events, but now sig_key_up/down is ONLY keyboard, and the newly added sig_input_up/down is ANY inputdevice (mouse, keyboard, joystick, etc). So, if you want the old behaviour, hook into the sig_input instead of sig_key signals. Remember, you can always use CL_InputDevice::get_type() to check which inputdevice the sig_input_up/down got its event from (returns CL_InputDevice::type_mouse, type_joystick, type_keyboard). Upgrading from 0.5.2 to 0.5.3 ============================= 1. Default videomode has been set to windowed, and not fullscreen as previously. To override default, you specify fullscreen-mode like this: CL_Display::set_videomode(640, 480, 16, true); or, window-mode: CL_Display::set_videomode(640, 480, 16, false); Upgrading from 0.5.1 to 0.5.2 ============================= 1. Resource pathhandling is changed ----------------------------------- Now all resources are loaded with path from the location of the resource file, and not the location of the executable as before. So, for example, if you have this structure: data/ data/images/ data/images/surface.tga data/images.scr Previously, the images.scr would look like this: surface = data/images/surface.tga (type = surface); Now, it must be changed into: surface = images/surface.tga (type = surface); without the first data/, as the resourcefile itself is in the data directory. 2. Signal connection API changed -------------------------------- Earlier you had to use CL_CreateSlot when connecting to a signal: CL_Slot slot = sig_something.connect(CL_CreateSlot(this, &MyApp::on_signal)); It has been modified to this shorter method instead: CL_Slot slot = sig_something.connect(this, &MyApp::on_signal); Just remove CL_CreateSlot from your code, and you're set. Also, we added a handy CL_SlotContainer. If you find it awkward storing all those CL_Slot objects, you can do use this instead: CL_SlotContainer slots; // Put this where you earlier stored your CL_Slot objects. Don't make it local! ... slots.connect(sig_something, this, &MyApp::on_signal); slots.connect(sig_something2, this, &MyApp::on_signal2); slots.connect(sig_something_else, this, &MyApp::on_signal_else); 3. GUI Themeing --------------- If you have created your own StyleManager, you need to remove the CL_ComponentOptions &options from the void CL_StyleManager::connect_styles(..) function. For example: void CL_StyleManager_OpenGL::connect_styles( const std::string &type, CL_Component *owner) Also, remove the ComponentOptions from all the components. Check the GUIGL example for more specific details. ------------------------------------------------------------------------------- Upgrading from 0.5.0 to 0.5.1 ============================= 1. CL_Input::sig_mouse_move --------------------------- This signal was moved into the CL_Mouse class, and is now called CL_Mouse::sig_move(int x, int y); 2. ClanGUI ---------- Sorry, but this module is so rapidly changing these days, so its no use updating this document regarding that. ------------------------------------------------------------------------------- Upgrading from 0.4.x to 0.5.0 ============================= 1. Multithreaded on Windows 2. Separated modules (Sound, Display, Network & Application) 3. Init/Deinit modules 4. Debug console 5. Datafile invocation 6. Event Chains 7. Input/OutputSource 8. Resources 9. Network 1. Multithreaded on Windows --------------------------- ClanLib now uses multithreaded libraries on Windows, and you need to upgrade your libraries (zlib, libpng etc) - see http://clanlib.org/download/foreign-win32.html and download the needed libraries there. Also, you need to change your own application to use multithreaded libraries: 1. Select Project->Settings... 2. Select the 'C/C++' tab, and then Category 'Code Generation' 3a. For Release version, change the 'Use run-time library' to Multithreaded. 3b. For Debug version, change the 'Use run-time library' to Debug Multithreaded. 2. Separated modules (Sound, Display, Network & Application) ------------------------------------------------------------ Sound, Display, Network, Application was separated from clanCore, and you need to do some changes to the initialization and library including in your game. ClanApplication --------------- ClanCore was separated from the CL_ClanApplication initializing, and therefore you need to link with both clanCore and clanApp if you want to use the "standard" way of initializing ClanLib (the easy way). Windows: Add clanApp.lib (release) or clanAppd.lib (debug) to your project settings. Linux: Add -lclanApp to your Makefile. You also need to add this: #include <ClanLib/application.h> If you want to initialize ClanLib yourself (for example if you want to use ClanNetwork without anything else from ClanLib), you do not link with ClanApplication, and do a manual initialization. ClanDisplay ----------- ClanDisplay was separated from ClanCore, and therefore you need to link with both clanCore and clanDisplay. Windows: Add clanDisplay.lib (release) or clanDisplayd.lib (debug) to your project settings. Linux: Add -lclanDisplay to your Makefile. Codewise, you need to replace CL_SetupCore::init_display(); CL_SetupCore::deinit_display(); with CL_SetupDisplay::init(); CL_SetupDisplay::deinit(); You also need to add this: #include <ClanLib/display.h> ClanSound --------- ClanSound was separated from ClanCore, and therefore you need to link with both clanCore and clanSound IF you want to use sound in your game. Windows: Add clanSound.lib (release) or clanSoundd.lib (debug) to your project settings. Linux: Add -lclanSound to your Makefile. Codewise, you need to replace CL_SetupCore::init_sound(); CL_SetupCore::deinit_sound(); with CL_SetupSound::init(); CL_SetupSound::deinit(); You also need to add this: #include <ClanLib/sound.h> ClanNetwork ----------- ClanNetwork was separated from ClanCore, and therefore you need to link with both clanCore and clanNetwork IF you want to use network in your game. Windows: Add clanNetwork.lib (release) or clanNetworkd.lib (debug) to your project settings. Linux: Add -lclanNetwork to your Makefile. Codewise, you need to replace CL_SetupCore::init_network(); CL_SetupCore::deinit_network(); with CL_SetupNetwork::init(); CL_SetupNetwork::deinit(); You also need to add this: #include <ClanLib/network.h> 3. Init/Deinit modules ---------------------- The CL_ClanApplication no longer uses the init_modules() and deinit_modules() functions. Move the initialization into your main() instead, and remove these functions. Or, add functions calling init_modules() and deinit_modules() from your main(). 4. Debug console ---------------- The debug window under Windows is no longer enabled by default. If you want a console window (for std::cout and printf), add this code: (at the beginning of CL_Application::main for example) CL_ConsoleWindow console("My console"); console.redirect_stdio(); 5. Datafile invocation ---------------------- Datafile support is no longer enabled by default. To support the feature with "app -datafile ..." add something like the following code to your main(): (You can of course improve this to use filenames from the command line as well) ... CL_SetupCore::init(); ... CL_SetupGL::init(); if (argv[1] == "-datafile") { CL_DatafileCompiler::write("my_file.scr", "my_file.dat"); return; } ... CL_SetupCore::init_display(); ... CL_Display::set_videomode(640, 480, 16 false); Lines starting with ... are just to show where you could put the code. 6. Event Chains --------------- Event chains has been removed, and replaced with a signal-system. So, if any of your classes inherit the following classes, read on to find out how to upgrade your app to the signal system: CL_Event_ButtonRelease CL_Event_ButtonPress CL_Event_WindowResize CL_Event_MouseMove CL_Event_MouseEnter CL_Event_MouseExit 1. Remove these inherited classes from your classes. 2. Replace the lines: CL_Input::chain_button_press.push_back( this ); ... CL_Input::chain_button_press.remove( this ); with CL_Slot slot; // Put this is a non-local location (like your class-header) ... slot = CL_Input::sig_button_press.connect(CL_CreateSlot(this, &MyClass::on_button_press)); This just shows the buttonpress event, the others are similar. Refer to the reference for correct API. 7. Input/OutputSource --------------------- This change is represented in all CL_InputSource* and CL_OutputSource* classes. The read_bool() function was renamed to read_bool8(). The write_bool() function was renamed to write_bool8(). 8. Resources ------------ The resource API has changed a little bit. First, the construction of the CL_ResourceManager is uses a standard constructor instead of the previous ::create() method. Replace CL_ResourceManager *resource = CL_ResourceManager::create(...); with CL_ResourceManager *resource = new CL_ResourceManager(...); or CL_ResourceManager resource(...); Second, if you use custom resources, go read the new Documentation/Overview about resources. It is now much easier to create custom resources, but it uses a different method than earlier. Third, the classes CL_Res_Integer, CL_Res_Boolean and CL_Res_String was replaced with CL_Integer, CL_Boolean and CL_String. Instead of previously doing: int my_integer = CL_Res_Integer::load("resource_name", resource_manager); you now do: int my_integer = CL_Integer("resource_name", resource_manager); 9. Network ---------- CL_NetGame was renamed to CL_NetSession, as it is now possible to use ClanNetwork in other than games; ClanNetwork is no longer dependent on the rest of ClanLib. Various other stuff was altered in ClanNetwork, but the specifics we cannot recall. If you have any additions, please send mail to the mailing-lists.