123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- #include "edit.h"
- Editor::Editor()
- : m_multi( MULTI_DEFAULT ), m_last_save( 0 ), m_help( true ), m_leftPoint( 1 ),
- m_index("Niveaux/Level.idx"), m_name(NAME_DEFAULT),
- m_screen(nullptr)
- {
- // Construire les trois points de base
- m_vx.push_back(0.0f);
- m_vy.push_back(-1.0f);
- m_vx.push_back(0.0f);
- m_vy.push_back(0.0f);
- m_vx.push_back(6.0f);
- m_vy.push_back(0.0f);
- }
- Editor::~Editor()
- {
- if ( m_screen )
- SDL_FreeSurface( m_screen );
- }
- bool Editor::init()
- {
- m_screen = SDL_SetVideoMode(1366, 768, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
- if ( !m_screen )
- {
- std::cout << "Unable to set 1366x768 video: " << SDL_GetError() << std::endl;
- return false;
- }
- return true;
- }
- void Editor::addPlot( int ex, int ey )
- {
- // Change coordinates
- float fx( 1.0f / m_multi * ex);
- float fy( 1.0f / m_multi * ey);
- // Create a plot
- if ( fx > m_vx.back() )
- {
- m_vx.push_back(fx);
- m_vy.push_back(fy);
- return;
- }
- // Move a point
- unsigned int id_mov( m_leftPoint );
- float dist1( abs(m_vx[id_mov] - fx) );
- float dist2;
- if ( id_mov < m_vx.size() - 1 )
- {
- dist2 = abs(m_vx[id_mov + 1] - fx);
- while ( id_mov < m_vx.size() - 1 && dist2 <= dist1 )
- {
- dist1 = dist2;
- id_mov++;
- dist2 = abs(m_vx[id_mov] - fx);
- }
- if ( id_mov > 3 )
- id_mov --;
- else
- return;
- }
- m_vx[id_mov] = fx;
- m_vy[id_mov] = fy;
- }
- void Editor::removePlot()
- {
- if ( m_vx.size() > 3 )
- {
- m_vx.pop_back();
- m_vy.pop_back();
- }
- }
- void Editor::zoomIn()
- {
- m_multi += 25;
- }
- void Editor::zoomOut()
- {
- if ( m_multi > 25 )
- m_multi -= 25;
- }
- void Editor::draw( int ix, int iy )
- {
- // Variables
- Sint16 x1, y1, x2, y2;
- float fx( 1.0f / m_multi * ix);
- float fy( 1.0f / m_multi * iy);
- // Incrément
- unsigned int i(m_leftPoint);
- // Recherche du premier hors champ vers la gauche depuis le dernier point connu
- while ( i > 1 && m_vx[i] > fx )
- i --;
- // Recherche du premier point dans le champ
- while ( m_vx[i] < fx && i < m_vx.size() )
- i ++;
- // Mise a jour de l'indice optimal
- m_leftPoint = i;
- if ( m_leftPoint > 1 && m_leftPoint >= m_vx.size() )
- m_leftPoint = m_vx.size() - 1;
- // Premiers points du polygone
- x1 = ( m_vx[i-1] - fx ) * m_multi;
- y1 = ( m_vy[i-1] - fy ) * m_multi;
- // Nettoyage
- SDL_FillRect(m_screen, 0, SDL_MapRGB(m_screen->format, 0, 0, 128));
- // Dessin des points visibles
- for ( ; i < m_vx.size() && x1 < m_screen->w ; i++ )
- {
- x2 = ( m_vx[i] - fx ) * m_multi;
- y2 = ( m_vy[i] - fy ) * m_multi;
- lineRGBA( m_screen, x1, y1, x2, y2, 255, 255, 0, 255);
- x1 = x2;
- y1 = y2;
- }
- // Repère pour le liner
- rectangleRGBA( m_screen, 100, 323, 100 + m_multi * 150 / 100, 323 + m_multi * 71 / 100, 255, 128, 0, 255 );
- // Infos
- if ( m_help )
- {
- stringRGBA(m_screen, 16, 7, ("Nom de niveau : " + m_name).c_str(), 0, 255, 0, 255 );
- stringRGBA(m_screen, 16, 16, ("Deniere sauvegarde : " + std::to_string(m_last_save)).c_str(), 0, 255, 0, 255 );
- stringRGBA(m_screen, 16, 25, ("Zoom : " + std::to_string(m_multi)).c_str(), 0, 255, 0, 255 );
- stringRGBA(m_screen, 16, 35, "Sauvegarder : s", 0, 255, 0, 255);
- stringRGBA(m_screen, 16, 44, "Detruire dernier point : z", 0, 255, 0, 255);
- stringRGBA(m_screen, 16, 53, "Deplacer camera : clic droit", 0, 255, 0, 255);
- stringRGBA(m_screen, 16, 62, "Ajoute point : clic gauche", 0, 255, 0, 255);
- stringRGBA(m_screen, 16, 71, "Activer ou desactiver l'aide : h", 0, 255, 0, 255);
- stringRGBA(m_screen, 16, 80, "Charger un niveau : c", 0, 255, 0, 255);
- }
- // Actualisation
- SDL_Flip(m_screen);
- }
- void Editor::save()
- {
- // Nom de niveau
- if ( m_name == NAME_DEFAULT )
- SF_keyName( m_name, m_screen );
-
- // Nom de fichier
- std::string chemin( m_name + EXT );
- // Index update
- SF_addFile( m_index, chemin );
- // Chemin
- chemin = FOLDER + chemin;
- // Flux
- std::ofstream writeStream( chemin.c_str() );
- // Ecriture
- for ( unsigned int i(0); i < m_vx.size(); i ++ )
- writeStream << m_vx[i] << ' ' << m_vy[i] << std::endl;
- // Sauvegardé !
- m_last_save = SDL_GetTicks();
- }
- void Editor::load()
- {
- // Pick up a level
- std::string chemin;
- SF_choose( m_index, chemin, m_screen );
- // If given up
- if ( chemin == "" )
- return;
- else
- {
- chemin.erase( chemin.size() - 4 );
- m_name = chemin;
- }
- // Flux
- chemin = FOLDER + chemin + EXT;
- std::ifstream loadStream( chemin.c_str() );
- // Lecture
- float buff;
- std::vector<float> data;
- while ( loadStream >> buff )
- data.push_back( buff );
- loadStream.close();
- // Remplacment
- if ( !m_vx.empty() )
- {
- m_vx.clear();
- m_vy.clear();
- }
- // Remplissage
- for ( unsigned int i(0); i < data.size() / 2; i++ )
- {
- m_vx.push_back( data[2*i] );
- m_vy.push_back( data[2*i + 1] );
- }
- }
- void Editor::toggleHelp()
- {
- m_help = !m_help;
- }
|