| @@ -8,7 +8,7 @@ libcommon_a_SOURCES = \ | |||
| scene.cpp scene.h font.cpp font.h layer.cpp layer.h map.cpp map.h \ | |||
| entity.cpp entity.h ticker.cpp ticker.h tileset.cpp tileset.h \ | |||
| forge.cpp forge.h video.cpp video.h timer.cpp timer.h bitfield.h \ | |||
| profiler.cpp profiler.h input.h input.cpp \ | |||
| profiler.cpp profiler.h input.h input.cpp mapviewer.cpp mapviewer.h \ | |||
| debugfps.cpp debugfps.h debugsprite.cpp debugsprite.h \ | |||
| debugrecord.cpp debugrecord.h | |||
| libcommon_a_CXXFLAGS = `pkg-config --cflags sdl gl SDL_image` | |||
| @@ -26,6 +26,7 @@ | |||
| #include "font.h" | |||
| #include "game.h" | |||
| #include "tileset.h" | |||
| #include "mapviewer.h" | |||
| // Other objects | |||
| #include "dict.h" | |||
| @@ -76,7 +76,7 @@ static gint draw(GtkWidget *widget, GdkEventExpose *event) | |||
| ticking = 0; | |||
| /* Clear the screen, tick the renderer, show the frame and | |||
| * clamp to desired framerate. */ | |||
| * clamp to desired framerate */ | |||
| Video::Clear(); | |||
| Ticker::TickDraw(); | |||
| gtk_gl_area_swapbuffers(GTK_GL_AREA(widget)); | |||
| @@ -100,6 +100,7 @@ int main(int argc, char **argv) | |||
| return EXIT_FAILURE; | |||
| } | |||
| /* Build the rest of the application */ | |||
| GtkBuilder *builder = gtk_builder_new(); | |||
| if (!gtk_builder_add_from_file(builder, "src/gtk/editor.xml", NULL)) | |||
| { | |||
| @@ -107,20 +108,11 @@ int main(int argc, char **argv) | |||
| return EXIT_FAILURE; | |||
| } | |||
| /* Create new top level window. */ | |||
| GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); | |||
| GtkWidget *sw = GTK_WIDGET(gtk_builder_get_object(builder, "sw1")); | |||
| g_object_unref(G_OBJECT(builder)); | |||
| /* You should always delete gtk_gl_area widgets before exit or else | |||
| GLX contexts are left undeleted, this may cause problems (=core dump) | |||
| in some systems. | |||
| Destroy method of objects is not automatically called on exit. | |||
| You need to manually enable this feature. Do gtk_quit_add_destroy() | |||
| for all your top level windows unless you are certain that they get | |||
| destroy signal by other means. | |||
| */ | |||
| gtk_quit_add_destroy(1, GTK_OBJECT(window)); | |||
| /* Create new OpenGL widget. */ | |||
| /* Create new OpenGL widget */ | |||
| int attrlist[] = | |||
| { | |||
| GDK_GL_RGBA, | |||
| @@ -132,10 +124,10 @@ int main(int argc, char **argv) | |||
| }; | |||
| GtkWidget *glarea = gtk_gl_area_new(attrlist); | |||
| gtk_widget_set_events(glarea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); | |||
| gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), glarea); | |||
| gtk_widget_set_events(GTK_WIDGET(glarea), | |||
| GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); | |||
| /* Connect signals and show window */ | |||
| gtk_signal_connect(GTK_OBJECT(window), "delete_event", | |||
| GTK_SIGNAL_FUNC(main_quit), NULL); | |||
| gtk_signal_connect(GTK_OBJECT(glarea), "expose_event", | |||
| @@ -145,19 +137,15 @@ int main(int argc, char **argv) | |||
| gtk_signal_connect(GTK_OBJECT(glarea), "realize", | |||
| GTK_SIGNAL_FUNC(init), NULL); | |||
| // Create a scrolled window around our GL widget | |||
| GtkWidget *sw = GTK_WIDGET(gtk_builder_get_object(builder, "scrolledwindow1")); | |||
| gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), glarea); | |||
| /* Put scrolled window into main window */ | |||
| gtk_widget_show_all(GTK_WIDGET(window)); | |||
| gtk_widget_show_all(window); | |||
| // FIXME: detect when the game is killed | |||
| new Game("maps/testmap.tmx"); | |||
| // FIXME: detect when the map viewer is killed | |||
| new MapViewer("maps/testmap.tmx"); | |||
| new DebugFps(); | |||
| /* We tick from the idle function instead of a timeout to avoid | |||
| * stealing time from the GTK loop. */ | |||
| * stealing time from the GTK loop when the callback time exceeds | |||
| * the timeout value. */ | |||
| gtk_idle_add(tick, glarea); | |||
| gtk_main(); | |||
| @@ -153,7 +153,7 @@ | |||
| <property name="visible">True</property> | |||
| <property name="can_focus">True</property> | |||
| <child> | |||
| <object class="GtkScrolledWindow" id="scrolledwindow1"> | |||
| <object class="GtkScrolledWindow" id="sw1"> | |||
| <property name="width_request">640</property> | |||
| <property name="height_request">480</property> | |||
| <property name="visible">True</property> | |||
| @@ -0,0 +1,85 @@ | |||
| // | |||
| // Deus Hax (working title) | |||
| // Copyright (c) 2010 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| #include <cstdio> | |||
| #include "core.h" | |||
| /* | |||
| * MapViewer implementation class | |||
| */ | |||
| class MapViewerData | |||
| { | |||
| friend class MapViewer; | |||
| private: | |||
| Map *map; | |||
| int x, y; | |||
| int mousex, mousey; | |||
| int done; | |||
| Scene *scene; | |||
| }; | |||
| /* | |||
| * Public MapViewer class | |||
| */ | |||
| MapViewer::MapViewer(char const *mapname) | |||
| { | |||
| data = new MapViewerData(); | |||
| data->map = new Map(mapname); | |||
| data->x = data->y = 0; | |||
| data->done = 0; | |||
| data->scene = NULL; | |||
| } | |||
| MapViewer::~MapViewer() | |||
| { | |||
| delete data->map; | |||
| delete data; | |||
| } | |||
| Entity::Group MapViewer::GetGroup() | |||
| { | |||
| return Entity::GetGroup(); | |||
| } | |||
| void MapViewer::TickGame(float deltams) | |||
| { | |||
| Entity::TickGame(deltams); | |||
| } | |||
| void MapViewer::TickDraw(float deltams) | |||
| { | |||
| Entity::TickDraw(deltams); | |||
| GetScene(); | |||
| data->map->Render(data->scene, -data->mousex, -data->mousey, 0); | |||
| data->scene->Render(); | |||
| delete data->scene; | |||
| data->scene = NULL; | |||
| } | |||
| Scene *MapViewer::GetScene() | |||
| { | |||
| if (!data->scene) | |||
| data->scene = new Scene(); | |||
| return data->scene; | |||
| } | |||
| void MapViewer::SetMouse(int x, int y) | |||
| { | |||
| data->mousex = x; | |||
| data->mousey = y; | |||
| } | |||
| @@ -0,0 +1,41 @@ | |||
| // | |||
| // Deus Hax (working title) | |||
| // Copyright (c) 2010 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // | |||
| // The MapViewer class | |||
| // ------------------- | |||
| // | |||
| #if !defined __DH_MAPVIEWER_H__ | |||
| #define __DH_MAPVIEWER_H__ | |||
| #include "entity.h" | |||
| #include "scene.h" | |||
| class MapViewerData; | |||
| class MapViewer : public Entity | |||
| { | |||
| public: | |||
| MapViewer(char const *mapname); | |||
| ~MapViewer(); | |||
| protected: | |||
| /* Inherited from Entity */ | |||
| virtual Group GetGroup(); | |||
| virtual void TickGame(float deltams); | |||
| virtual void TickDraw(float deltams); | |||
| public: | |||
| /* New methods */ | |||
| Scene *GetScene(); | |||
| void SetMouse(int x, int y); | |||
| private: | |||
| MapViewerData *data; | |||
| }; | |||
| #endif // __DH_MAPVIEWER_H__ | |||