2012-04-04 2 views
0

현재 C++에서 SFML을 사용하는 방법을 배우기 위해 간단한 게임을 작성하고 있습니다. 지금까지는 일들이 순조롭게 진행되어 왔고 SFML과 관련된 대부분의 것들에 대한 기본적인 이해를했습니다. 내가 겪은 문제는 효율적인 방법과 시간 기반 이벤트를 찾는 것입니다.시간 기반 이벤트 처리

내가 작업하고있는 게임은 레벨 중에 미리 정의 된 시간에 와서 적의 파도가있는 매우 단순한 우주 침입자의 독수리 게임입니다. 현재로서는 간단한 이벤트를 여러 번 재사용 할 수 있도록 각 호출 된 이벤트에서 발생해야하는 것을 보유하고 제어하는 ​​이벤트 클래스가 있습니다. 지금은 SFML 클럭을 이용하여 루핑하고 게임 루프의 각 반복마다 현재 레벨에 대한 모든 이벤트 벡터를 실행하고 시계의 경과 시간을 이벤트의 지정된 시간과 비교하여 이러한 이벤트를 트리거합니다. 불리다. 문제는 모든 게임 루프 반복마다 이벤트의 전체 벡터를 확인해야하며 이벤트 목록이 충분히 길면 게임 성능에 영향을 미치기 시작할 것이라고 걱정됩니다.

타임 라인에서 각 이벤트에 해당 위치에 대한 간단한 숫자 ID를 지정하고 다음 이벤트에서 실행해야하는 이벤트를 저장한다는 아이디어가있었습니다. 루프 반복 당 하나의 이벤트 시간 만 확인하면됩니다. 이것이 꽤 잘 작동하는 동안, 모든 루프 반복을 검사 할 필요가없는보다 효율적인 방법이 가능한지 궁금했습니다. 이벤트 중심 프로그래밍에 대해 조금 살펴 보았지만 시간 기반 이벤트와 관련이있는 것은 많이 찾을 수 없었습니다.

따라서 누군가 타임 라인 또는 시간 기반 이벤트 트리거링에 대한 경험이 있었는지 궁금한 점이 있었고 더 효율적인 아이디어를 찾기 위해 볼 수있는 팁이나 리소스가 있습니까? 어떤 도움이라도 좋을 것입니다, 고마워요!

+0

이벤트가 ** 실행되는 것으로 가정되는 시간 ** 해당 ID는 다른 번호가 필요하지 않는 한 다른 목적으로는 필요하지 않습니다. –

+0

이벤트 목록을 시간순으로 정렬하여 첫 번째 항목 만 살펴 봐야합니다. –

답변

2

당신이 제안하는 방법은 매번 게임 루프를 통해 하나씩 비교하는 것입니다. 그것보다 빨리 빠르지는 않습니다.

동시에 여러 이벤트를 발생 시키려면 키가 이벤트 시간이고 값이 이벤트 자체 인 multimap을 사용하십시오. 그런 다음 멀티 맵이 시간순으로 정렬됩니다.

게임 루프를 통해 때마다,이 (의사)과 같은 작업을 수행합니다

now = getCurrentTime() 
while not events.isEmpty() and events.firstElement().key() < now: 
    e = events.firstElement().value 
    e.execute() 
    events.removeFirst() 
0

정렬 이벤트 '시간에 다음 당신이 지금까지의 경로를 통해 들어 왔 얼마나 저장을 기반으로 벡터 . 각 루프는 다음 이벤트가 아직 발생하지 않을 때까지 해당 위치로 이동하고 방금 반복 한 이벤트를 시작합니다.

std::vector<Event> time_line; 
size_t time_line_position; 

void fire_new_events(Time t) { 
    size_t new_time_line_position = time_line_position; 

    while(new_time_line_position < time_line.size() 
      && time_line[new_time_line_position].time <= t) 
     ++new_time_line_position; 

    fire_events(time_line.begin() + time_line_position, 
       time_line.begin() + new_time_line_position); 

    time_line_position = new_time_line_position; 
}