C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 限制不同计算机上的游戏速度大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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(&current);
    delta = (doublE)(current.QuadPart - last.QuadPart) / (doublE)freq.QuadPart;

    main_loop(delta);

    last = current;
  }
}

大佬总结

以上是大佬教程为你收集整理的c – 限制不同计算机上的游戏速度全部内容,希望文章能够帮你解决c – 限制不同计算机上的游戏速度所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。