c – 限制不同计算机上的游戏速度
发布时间:2020-12-16 10:27:14 所属栏目:百科 来源:网络整理
导读:我正在使用OpenGL和C创建2D游戏. 我想要它以便游戏在不同的计算机上以相同的速度运行,此时我的桌面上的游戏比我的笔记本电脑运行得更快(即我的播放器在我的桌面上移动得更快) 我被告知QueryPerformanceCounter()但我不知道如何使用它. 我该如何使用它还是有
我正在使用OpenGL和C创建2D游戏.
我想要它以便游戏在不同的计算机上以相同的速度运行,此时我的桌面上的游戏比我的笔记本电脑运行得更快(即我的播放器在我的桌面上移动得更快) 我被告知QueryPerformanceCounter()但我不知道如何使用它. 我该如何使用它还是有更好/更简单的方法? 我的显示功能 void display() { static long timestamp = clock(); // First frame will have zero delta,but this is just an example. float delta = (float)(clock() - timestamp) / CLOCKS_PER_SEC; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); createBackground(); int curSpeed = (player.getVelocity()/player.getMaxSpeed())*100; glColor3f(1.0,0.0,0.0); glRasterPos2i(-screenWidth+20,screenHeight-50); glPrint("Speed: %i",curSpeed); glRasterPos2i(screenWidth-200,screenHeight-50); glPrint("Lives: %i",lives); glRasterPos2i(screenWidth-800,screenHeight-50); glPrint("Heading: %f",player.getHeading()); for(int i = 0;i<90;i++){ if (numBullets[i].fireStatus == true){ numBullets[i].updatePosition(player); if (numBullets[i].getXPos() > screenWidth || numBullets[i].getXPos() < -screenWidth || numBullets[i].getYPos() > screenHeight || numBullets[i].getYPos() < -screenHeight ){ numBullets[i].fireStatus = false; numBullets[i].reset(player); numBullets[i].~Bullet(); } } } player.updatePosition(playerTex,delta); glFlush(); timestamp = clock(); } 我的更新positiom方法 void Player::updatePosition(GLuint playerTex,float factor){ //draw triangle glPushMatrix(); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glBindTexture(GL_TEXTURE_2D,playerTex); glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); glTranslatef(factor*XPos,factor*YPos,0.0); glRotatef(heading,1); glColor3f(1.0,0.0); glBegin(GL_POLYGON); glTexCoord2f(0.0,1.0); glVertex2f(-40,40); glTexCoord2f(0.0,0.0); glVertex2f(-40,-40); glTexCoord2f(1.0,0.0); glVertex2f(40,1.0); glVertex2f(40,40); glEnd(); glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); glPopMatrix(); XPos += speed*cos((90+heading)*(PI/180.0f)); YPos += speed*sin((90+heading)*(PI/180.0f)); } 解决方法
通常,您希望基于时间增量进行所有游戏玩法计算,即自上一帧以来经过的时间量.这将标准化所有机器的速度.除非您需要极高的精度,否则可以使用clock()(来自< ctime>)来获取当前时间戳.
例: void main_loop() { static long timestamp = clock(); // First frame will have zero delta,but this is just an example. float delta = (float)(clock() - timestamp) / CLOCKS_PER_SEC; calculate_physics(delta); render(); timestamp = clock(); } void calculate_physics(float delta) { // Calculate expected displacement per second. applyDisplacement(displacement * delta); } void render() { // Do rendering. } 编辑:如果您想要更高的精度,您应该使用您的操作系统计时器功能.在Windows上,最精确的方法是使用QueryPerformanceCounter().例 #include <windows.h> void main_loop(double delta) { // ... } int main() { LARGE_INTEGER freq,last,current; double delta; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&last); while (1) { QueryPerformanceCounter(¤t); delta = (double)(current.QuadPart - last.QuadPart) / (double)freq.QuadPart; main_loop(delta); last = current; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |