void ArrowNavigationHandler::onKey(ArrowKey direction) { checkTimeBetweenKeyStrokes(direction); if (m_throttling[direction]) return; m_timeStart[direction] = std::chrono::system_clock::now(); switch (direction) { case ArrowKey::UP: moveCursorUp(); break; case ArrowKey::RIGHT: moveCursorRight(); break; case ArrowKey::DOWN: moveCursorDown(); break; case ArrowKey::LEFT: moveCursorLeft(); break; default: break; } }
void sdlMapBoucle(sdlMap *sdMap) { int continuGame = 1; int resultMenu; int i, num; char c; Menu menu; sdlMenuInit(&menu, getSdlMapEcran(sdMap)); //Lancement du menu resultMenu = sdlMenuBoucle(&menu); SDL_Event event; /* Horloges (en secondes) */ float currentClock, prevClock; /* Intervalle de temps (en secondes) entre deux Èvolutions du jeu */ float intervalClock = 0.1f; int rafraichissement; sdlMapAff(sdMap); assert(SDL_Flip(getSdlMapEcran(sdMap))!=-1); // RÈcupËre l'horloge actuelle et la convertit en secondes // clock() retourne le nombre de tops horloge depuis le lancement du programme prevClock = (float)clock()/(float)CLOCKS_PER_SEC; // Tant que ce n'est pas la fin ... while (continuGame == 1) { switch (resultMenu) { case 0: continuGame = 0; resultMenu = 1; break; case 2: num = getMapNum(getSdlMap(sdMap)); num++; if(num > 4) num = 1; setMapNum(getSdlMap(sdMap), num); setSdlMap(sdMap,newMap(15, 15, num)); setSdlMapMode(sdMap, 0); setSdlMapSpeed(sdMap, 0); continuGame = 1; resultMenu = 1; break; default: break; } rafraichissement = 0; // RÈcupËre l'horloge actuelle et la convertit en secondes currentClock = (float)clock()/(float)CLOCKS_PER_SEC; //printf("\n %f \n %f \n %f \n %f \n", horloge_precedente, horloge_courante, (horloge_courante - horloge_precedente), intervalle_horloge); // Si suffisamment de temps s'est ÈcoulÈ depuis la derniËre prise d'horloge if ((currentClock - prevClock) >= intervalClock) { if (getSdlMapSpeed(sdMap)) { for (i=0; i<10; i++) { updateMap(getSdlMap(sdMap)); } } else { for (i=0; i<5; i++) { updateMap(sdMap->map); } } updateInterface(getSdlMapInterface(sdMap), getSdlMap(sdMap)); rafraichissement = 1; prevClock = currentClock; if(getSdlMap(sdMap)->life <= 0) { resultMenu = sdlMenuBoucle(&menu); } if(getSdlMapMode(sdMap) && isWaveEnd(getSdlMap(sdMap))) { newWave(getSdlMap(sdMap)); } } // tant qu'il y a des evenements ‡ traiter : cette boucle n'est pas bloquante while (SDL_PollEvent(&event)) { // Si l'utilisateur a cliquÈ sur la croix de fermeture if ( event.type == SDL_QUIT ) continuGame = 0; // Si l'utilisateur a appuyÈ sur une touche if (event.type == SDL_KEYDOWN) { rafraichissement = 1; Map *map = getSdlMap(sdMap); Interface *interface = getSdlMapInterface(sdMap); Cursor *cursor = getInterfaceCursor(interface); switch (event.key.keysym.sym) { //Quiter (esc) case SDLK_ESCAPE: resultMenu = sdlMenuBoucle(&menu); break; //Deplacement curseur droite (left) case SDLK_LEFT: moveCursorLeft(cursor); break; //Deplacement curseur gauche (right) case SDLK_RIGHT: moveCursorRight(cursor); break; //Deplacement curseur haut (up) case SDLK_UP: moveCursorUp(cursor); break; //Deplacement curseur bas (down) case SDLK_DOWN: moveCursorDown(cursor); break; //Nouvelle vague (w) case SDLK_w: if(isWaveEnd(map)){ newWave(map); } break; //Nouvelle tours type archer (a) case SDLK_a: buyInterfaceTower('A', &(cursor->position), sdMap->map); break; //Nouvelle tours type knight (k) case SDLK_k: buyInterfaceTower('K', &(cursor->position), sdMap->map); break; //Nouvelle tours type mage (m) case SDLK_m: buyInterfaceTower('M', &(cursor->position), sdMap->map); break; case SDLK_c: buyInterfaceTower('C', &(cursor->position), sdMap->map); break; case SDLK_e: if(isCursorOnTower(cursor, getSdlMap(sdMap))) { evolveTower(interface->tower, &map->gold); } break; case SDLK_v: sellInterfaceTower(getSdlMap(sdMap), &(cursor->position), getInterfaceTower(interface)); break; case SDLK_s: if (getSdlMapSpeed(sdMap)) { setSdlMapSpeed(sdMap,0); } else { setSdlMapSpeed(sdMap,1); } break; case SDLK_i: if(getSdlMapMode(sdMap)){ setSdlMapMode(sdMap,0); } else { setSdlMapMode(sdMap,1); } break; default: break; } } } if (rafraichissement==1) { // on affiche le jeu sur le buffer caché sdlMapAff(sdMap); // on permute les deux buffers (cette fonction ne doit se faire qu'une seule fois dans a boucle) SDL_Flip( getSdlMapEcran(sdMap) ); } } sdlMenuLibere(&menu); }
bool appl::TextViewer::onEventEntry(const ewol::event::Entry& _event) { if (m_buffer == nullptr) { return false; } // First call plugin if (m_pluginManager->onEventEntry(*this, _event) == true) { markToRedraw(); return true; } // just forward event == > manage directly in the buffer if (_event.getType() == gale::key::keyboard::character) { //APPL_DEBUG("KB EVENT : \"" << UTF8_data << "\" size=" << strlen(UTF8_data) << "type=" << (int32_t)typeEvent); if (_event.getStatus() != gale::key::status::down) { return false; } char32_t localValue = _event.getChar(); if (localValue == u32char::Return) { if (true == _event.getSpecialKey().getShift()) { localValue = u32char::CarrierReturn; } } else if (localValue == u32char::Suppress ) { //APPL_INFO("keyEvent : <suppr> pos=" << m_cursorPos); if (m_buffer->hasTextSelected()) { remove(); } else { appl::Buffer::Iterator pos = m_buffer->cursor(); appl::Buffer::Iterator posEnd = pos; ++posEnd; replace("", pos, posEnd); } return true; } else if (localValue == u32char::Delete) { //APPL_INFO("keyEvent : <del> pos=" << m_cursorPos); if (m_buffer->hasTextSelected()) { remove(); } else { appl::Buffer::Iterator pos = m_buffer->cursor(); appl::Buffer::Iterator posEnd = pos; --pos; replace("", pos, posEnd); } return true; } m_buffer->setSelectMode(false); // normal adding char ... char output[5]; output[0] = '0'; u32char::convertUtf8(localValue, output); if ( m_buffer->hasTextSelected() == false && _event.getSpecialKey().getInsert() == true) { appl::Buffer::Iterator pos = m_buffer->cursor(); appl::Buffer::Iterator posEnd = pos; ++posEnd; replace(output, pos, posEnd); //TODO : choisce UTF ... replace(localValue, pos, posEnd); } else { std::string myString = output; write(myString); } return true; } // move events ... if (_event.getStatus() == gale::key::status::down) { // selection when shift is set: m_buffer->setSelectMode(_event.getSpecialKey().getShift()); // check selection event ... switch(_event.getType()) { case gale::key::keyboard::insert: m_insertMode = m_insertMode==true?false:true; markToRedraw(); break; case gale::key::keyboard::left: //APPL_INFO("keyEvent : <LEFT>"); moveCursorLeft(); break; case gale::key::keyboard::right: //APPL_INFO("keyEvent : <RIGHT>"); moveCursorRight(); break; case gale::key::keyboard::up: //APPL_INFO("keyEvent : <UP>"); moveCursorUp(1); break; case gale::key::keyboard::down: //APPL_INFO("keyEvent : <DOWN>"); moveCursorDown(1); break; case gale::key::keyboard::pageUp: //APPL_INFO("keyEvent : <PAGE-UP>"); moveCursorUp(15); // TODO : Set the real number of line ... break; case gale::key::keyboard::pageDown: //APPL_INFO("keyEvent : <PAGE-DOWN>"); moveCursorDown(15); // TODO : Set the real number of line ... break; case gale::key::keyboard::start: //APPL_INFO("keyEvent : <Start of line>"); moveCursorLeft(moveEnd); break; case gale::key::keyboard::end: //APPL_INFO("keyEvent : <End of line>"); moveCursorRight(moveEnd); break; default: break; } return true; } return false; }