Beispiel #1
0
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;
}