void pushQueue(char *value) { if (sizeQueue() == 0) { tokenQueue = (token*)malloc(sizeof(token)); if (tokenQueue == NULL) { printf("The room is not eough for tokenQueue!\n"); return; } strcpy(tokenQueue->value, value); tokenQueue->next = NULL; return; } token *backOne = backQueue(); backOne->next = (token*)malloc(sizeof(token)); backOne = backOne->next; if (backOne == NULL) { printf("The room is not eough for new part of queue!\n"); return; } strcpy(backOne->value, value); backOne->next = NULL; return; }
/// /// 毎フレーム呼ばれるイベント通達処理 bool EventManager::broadCast( const DeltaTime dt ) { // キューを取得 auto& current_queue = currentQueue(); auto& back_queue = backQueue(); // 全イベントを処理 while (current_queue.size() > 0) { // イベントをキューから取り出す auto event = current_queue.front(); current_queue.pop_front(); // ブロードキャスト時間になっている? if (!event->isReady()) { // まだ時間になっていない event->update(dt); // バックキューに登録しなおし back_queue.push_back(event); // このイベントの処理はここで終了。次へ。 continue; } // イベント発行 const EventType& event_type = event->eventType(); EventListenerMap::iterator map_it =registry_.find(event_type.key()); if (map_it == registry_.end()) { // このイベント型にはリスナーが居ない // 処理の必要がないのでスキップ continue; } // リスナーリスト EventListenerTable& table = map_it->second; // 全リスナーにイベントを通知 auto table_it = table.begin(); auto table_end = table.end(); for (; table_it != table_end; ++table_it) { // 引数を設定 (*table_it)->arg1(&event); // イベントハンドラ呼び出し (*table_it)->invoke(); } } // カレントキューを入れ替え switchQueue(); return true; }