#import "game.h" #import "graphics.h" #import "gl_headers.h" #import "vector.h" #import "interpolation.h" #import "memory.h" #import "resources.h" #import "model.h" #import "keyboard.h" #include "SDL.h" void process_events() { SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: case SDL_KEYUP: update_key_state(event.key.keysym.sym, event.key.state); break; case SDL_QUIT: return; default: break; } } } void draw_face() { glBegin(GL_TRIANGLES); { glVertex3i(-3,3,0); glVertex3i(-3,1,0); glVertex3i(-1,3,0); glVertex3i(-1,1,0); glVertex3i(-3,1,0); glVertex3i(-1,3,0); glVertex3i(3,3,0); glVertex3i(3,1,0); glVertex3i(1,3,0); glVertex3i(1,1,0); glVertex3i(3,1,0); glVertex3i(1,3,0); glVertex3i(0,-3,0); glVertex3i(3,-1,0); glVertex3i(-3,-1,0); } glEnd(); } void draw(game_state *g) { glPushMatrix(); { glColor3f(0,0,0); glTranslatef(UNPACK_VECTOR(g->player_pos)); draw_face(); } glPopMatrix(); glPushMatrix(); { glColor3f(1,0,0); draw_face(); } glPopMatrix(); glPushMatrix(); { glColor3f(1,0,0); draw_face(); } glPopMatrix(); glPushMatrix(); { glColor3f(0,1,0); glTranslatef(-10,0,-3); draw_face(); } glPopMatrix(); glPushMatrix(); { glColor3f(0,0,1); glTranslatef(10,0,-5); draw_face(); } glPopMatrix(); } void move_player(game_state *g, vector delta) { g->player_pos = vec_add(g->player_pos, delta); } #define GLIDE_AND_MOVE(x,y,z,t) register_vector_glide(g->gfx->cam, make_vector(x, y, z), &move_camera, t); register_vector_glide(g, make_vector(x, y, z), &move_player, t) void go_up (game_state *g) { GLIDE_AND_MOVE(0,0, 2, 0.1); } void go_down (game_state *g) { GLIDE_AND_MOVE(0,0,-2, 0.1); } void go_left (game_state *g) { GLIDE_AND_MOVE( 2,0,0, 0.1); } void go_right (game_state *g) { GLIDE_AND_MOVE(-2,0,0, 0.1); } void quit_game (game_state *g) { g->done = 1; } void run_game(graphics *g, game_settings settings) { game_state *game = autorelease(alloc(sizeof(game_state))); game->done = 0; game->gfx = g; game->player_pos = zero_vector; g->cam->eye = make_vector(0, 10, -10); bind_key(SDLK_UP, &go_up, 0.1); bind_key(SDLK_DOWN, &go_down, 0.1); bind_key(SDLK_LEFT, &go_left, 0.1); bind_key(SDLK_RIGHT, &go_right, 0.1); bind_key(SDLK_ESCAPE, &quit_game, key_down_only); model teapot = autodesk_3ds.load(resource_path("model", "Teapot C4d.3ds")); autodesk_3ds.load(resource_path("model", "Square C4d.3ds")); autodesk_3ds.load(resource_path("model", "Teapot 3ds.3DS")); autodesk_3ds.load(resource_path("model", "Eyething C4d.3ds")); while (!game->done) { push_autorelease(); glLoadIdentity(); process_events(); clear_screen(); keyboard_actions(game); run_glides(); apply_camera(g->cam); glPushMatrix(); { glScalef(0.1,0.1,0.1); autodesk_3ds.draw(teapot); } glPopMatrix(); draw(game); SDL_GL_SwapBuffers(); pop_autorelease(); } SDL_Quit(); }