Subversion Repositories sssnakesss

Rev

Rev 14 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_opengl.h"

#include <dirent.h>
#include <iostream>
#include <vector>
#include <map>

using namespace std;

#include "point.hpp"
#include "snake.hpp"
#include "texture.hpp"
#include "sssnakesss.hpp"

SSSNAKESSS::SSSNAKESSS()
{
    running = false;
}

SSSNAKESSS::~SSSNAKESSS()
{
   
}

bool SSSNAKESSS::init()
{
    if (!initSDL())
    {
        return false;
    }
   
    if (!initOpenGL())
    {
        return false;
    }
   
    initData();
   
    snake = new Snake;
   
    return true;
}

bool SSSNAKESSS::initSDL()
{
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
    {
        return false;
    }
 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
 
    screen = SDL_SetVideoMode(640, 480, 16, SDL_OPENGL);
    if (!screen)
    {
        return false;
    }
   
    return true;
}

bool SSSNAKESSS::initOpenGL()
{
    glEnable(GL_TEXTURE_2D);
 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 
    glViewport(0, 0, 640, 480);
 
    glClear(GL_COLOR_BUFFER_BIT);
 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    glOrtho(0.0f, 640, 480, 0.0f, -1.0f, 1.0f);
       
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
   
    return true;
}

void SSSNAKESSS::initData()
{
    string dataDir = "data/";
   
    string graphicsDir = dataDir + "graphics/";
    vector<string> graphicsList = listDir(graphicsDir);
    for (unsigned int i = 0; i < graphicsList.size(); i++)
    {
        string file = graphicsList[i];
        string fullfilename = graphicsDir + file;
       
        textures[file] = new Texture(fullfilename);
    }
}

void SSSNAKESSS::initLevel(int level)
{
    obstacles.erase(obstacles.begin(), obstacles.end());
    for (int i = 0; i < level * 3; i++)
    {
        // add random obstacle
    }
    // reposition snakes
}

void SSSNAKESSS::run()
{
    running = true;
   
    while (running)
    {
        checkEvents();
        update();
        draw();
       
        SDL_GL_SwapBuffers();
    }
}

void SSSNAKESSS::checkEvents()
{
    SDL_Event event;

    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_QUIT:
                running = false;
                break;
        }
    }
}

void SSSNAKESSS::update()
{
    motion();
}

void SSSNAKESSS::motion()
{
    for (unsigned int i = 0; i < snakes.size(); i++)
    {
        Snake *s = snakes[i];
        s->move();
    }
}

void SSSNAKESSS::draw()
{
    //drawTexture(textures["food.png"], 20, 20);
}

void SSSNAKESSS::end()
{
    delete snake;
   
    SDL_FreeSurface(screen);
    SDL_Quit();
}

vector<string> SSSNAKESSS::listDir(string dirName)
{
    vector<string> files;
   
    DIR *dp = opendir(dirName.c_str());
    if (dp != NULL)
    {
        dirent *ep;
        while ((ep = readdir(dp)))
        {
            string n = ep->d_name;
            if (n != "." && n != "..")
            {
                files.push_back(n);
            }
        }
       
        closedir(dp);
    }

    return files;
}