저는 C++ 프로그래밍이 처음인데 우주 침략자와 비슷하게 느슨한 게임을 만들고 있습니다.시간 경과 후 변수 값 변경
내가 원하는 것은 부울 값인 "player.shield"입니다.이 값은 false 일 때 20 초 후에 다시 값을 true로 변경합니다.
어떻게해야합니까?
어떤 도움에 감사드립니다 : D
저는 C++ 프로그래밍이 처음인데 우주 침략자와 비슷하게 느슨한 게임을 만들고 있습니다.시간 경과 후 변수 값 변경
내가 원하는 것은 부울 값인 "player.shield"입니다.이 값은 false 일 때 20 초 후에 다시 값을 true로 변경합니다.
어떻게해야합니까?
어떤 도움에 감사드립니다 : D
플랫폼에 따라 다릅니다
2) 시작 타이머, 당신은 일반적으로 등을 사용하는 라이브러리, 비동기 타이머의 경우, 게임에서 이것은 일반적으로 모든 게임 메 커닉을 제어 된 방식으로 다루는 메인 루프에서 다르게 수행됩니다.
e.e. 대신 가능성이 언제든지 임의의 순서로 실행할 수있는 타이머의 수십 가지고, 당신은 오히려이 같은 함수를 만들 :
void onGameTick()
{
DWORD currentTime = ::GetTickCount();
if (player.shield && currentTime - player.shieldAcquiredTime < 20) {
player.shield = false;
// You can also do other things here like trigger a sound effect etc.
}
// Do other logic, like move players, enemies, shots etc.
}
그런 다음 각 화면 업데이트하기 전에 또는 타이머 또는 무엇이든하여이 함수를 호출합니다.
이 기술을 사용하면, 항상 선형 방식으로 디버깅 할 쉽게, 같은 순서로 이루어, 게임 상태의 변경이 매우 명시 적으로 만들
그것은 당신이 값을 업데이트하는 콜백을 등록 할 수 Win32 API 함수 SetTimer
를 통해 수행 할 수 있습니다.
다음은 C++ 타이머 기준에 a link입니다. 설정
1) "player.shield = true"로 당신은 몇 가지 더 많거나 적게 사용할 수있는 경우에도
#include <ctime>
inline void timeSec(clock_t sec)
{
clock_t start_time = clock();
clock_t end_time = sec * 1000 + start_time
while(clock() != end_time);
}
이 당신을 순전히 감사 가능한 멀티 스레드 데이터 레이스 등을 피하기 이! 나는 그것을 약간 조정했고 완벽하게 작동했다. void ShieldDisabled() { DWORD currentTime = :: GetTickCount(); player.shieldAcquiredTime + = 1; if ((player.shield == false) && player.shieldAcquiredTime> 2000) { player.shield = true; \t 경우 (player.shieldAcquiredTime> 2,500) \t \t \t { player.shieldAcquiredTime = 0; \t} } } – user3045068
OK, 그 방법은 다른 방법이지만 정확한 간격으로 호출해야하므로 매번 변수가 균등하게 증가합니다. 그럼에도 불구하고'currentTime' 부분을 제거 할 수 있습니다. – Yirkha