1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-26 03:52:01 +02:00

framerate keeper for main loop, working wersion of color converter (blue -> player's) and small tweak

This commit is contained in:
mateuszb 2007-07-15 13:36:04 +00:00
parent bcc3b16f80
commit 21bbfda899
4 changed files with 226 additions and 4 deletions

22
CMT.cpp
View File

@ -6,6 +6,7 @@
#include "SDL_mixer.h"
#include "CBuildingHandler.h"
#include "SDL_Extensions.h"
#include "SDL_framerate.h"
#include <cmath>
#include <stdio.h>
#include <string.h>
@ -267,6 +268,9 @@ int _tmain(int argc, _TCHAR* argv[])
THC std::cout<<"Loading .lods: "<<tmh.getDif()<<std::endl;
CPreGame * cpg = new CPreGame(); //main menu and submenus
THC std::cout<<"Initialization CPreGame (together): "<<tmh.getDif()<<std::endl;
//CMessage * ll = new CMessage;
//CSDL_Ext::blueToPlayersAdv(ll->piecesOfBox[0].ourImages[0].bitmap, 0);
//SDL_SaveBMP(ll->piecesOfBox[0].ourImages[0].bitmap, "test2.bmp");
cpg->mush = mush;
cpg->runLoop();
THC tmh.getDif();
@ -374,7 +378,13 @@ int _tmain(int argc, _TCHAR* argv[])
bool scrollingUp = false;
bool scrollingDown = false;
bool updateScreen = false;
unsigned char animVal=0; //for animations handling
unsigned char animVal = 0; //for animations handling
unsigned char animValHitCount = 0; //for slower animations
//initializing framerate keeper
FPSmanager * mainLoopFramerateKeeper = new FPSmanager;
SDL_initFramerate(mainLoopFramerateKeeper);
SDL_setFramerate(mainLoopFramerateKeeper, 30);
//framerate keeper initialized
for(;;) // main loop
{
try
@ -535,9 +545,15 @@ int _tmain(int argc, _TCHAR* argv[])
{ continue; }
updateScreen = true;
++animVal; //for animations
++animValHitCount; //for animations
if(animValHitCount == 2)
{
animValHitCount = 0;
++animVal;
}
SDL_Delay(30); //give time for other apps
SDL_Delay(5); //give time for other apps
SDL_framerateDelay(mainLoopFramerateKeeper);
}
return 0;
}

View File

@ -514,13 +514,70 @@ void CSDL_Ext::blueToPlayersAdv(SDL_Surface * sur, int player)
std::swap(sort2[0], sort2[1]);
for(int hh=0; hh<3; ++hh)
{
(*sort2[hh].second) = (sort1[hh] + sort2[hh].first)/2;
(*sort2[hh].second) = (sort1[hh]*0.8 + sort2[hh].first)/2;
}
}
}
}
else if(sur->format->BitsPerPixel == 24)
{
for(int y=0; y<sur->h; ++y)
{
for(int x=0; x<sur->w; ++x)
{
Uint8* cp = (Uint8*)sur->pixels + y+sur->pitch + x*3;
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
{
if(cp[2]>cp[1] && cp[2]>cp[0])
{
std::vector<long long int> sort1;
sort1.push_back(cp[0]);
sort1.push_back(cp[1]);
sort1.push_back(cp[2]);
std::vector< std::pair<long long int, Uint8*> > sort2;
sort2.push_back(std::make_pair(CGameInfo::mainObj->playerColors[player].r, &(cp[0])));
sort2.push_back(std::make_pair(CGameInfo::mainObj->playerColors[player].g, &(cp[1])));
sort2.push_back(std::make_pair(CGameInfo::mainObj->playerColors[player].b, &(cp[2])));
std::sort(sort1.begin(), sort1.end());
if(sort2[0].first>sort2[1].first)
std::swap(sort2[0], sort2[1]);
if(sort2[1].first>sort2[2].first)
std::swap(sort2[1], sort2[2]);
if(sort2[0].first>sort2[1].first)
std::swap(sort2[0], sort2[1]);
for(int hh=0; hh<3; ++hh)
{
(*sort2[hh].second) = (sort1[hh] + sort2[hh].first)/2.2;
}
}
}
else
{
if(cp[0]>cp[1] && cp[0]>cp[2])
{
std::vector<long long int> sort1;
sort1.push_back(cp[2]);
sort1.push_back(cp[1]);
sort1.push_back(cp[0]);
std::vector< std::pair<long long int, Uint8*> > sort2;
sort2.push_back(std::make_pair(CGameInfo::mainObj->playerColors[player].r, &(cp[2])));
sort2.push_back(std::make_pair(CGameInfo::mainObj->playerColors[player].g, &(cp[1])));
sort2.push_back(std::make_pair(CGameInfo::mainObj->playerColors[player].b, &(cp[0])));
std::sort(sort1.begin(), sort1.end());
if(sort2[0].first>sort2[1].first)
std::swap(sort2[0], sort2[1]);
if(sort2[1].first>sort2[2].first)
std::swap(sort2[1], sort2[2]);
if(sort2[0].first>sort2[1].first)
std::swap(sort2[0], sort2[1]);
for(int hh=0; hh<3; ++hh)
{
(*sort2[hh].second) = (sort1[hh]*0.8 + sort2[hh].first)/2;
}
}
}
}
}
}
}

84
SDL_framerate.c Normal file
View File

@ -0,0 +1,84 @@
/*
SDL_framerate: framerate manager
LGPL (c) A. Schiffler
*/
#include "SDL_framerate.h"
/*
Initialize the framerate manager
*/
void SDL_initFramerate(FPSmanager * manager)
{
/*
* Store some sane values
*/
manager->framecount = 0;
manager->rate = FPS_DEFAULT;
manager->rateticks = (1000.0 / (float) FPS_DEFAULT);
manager->lastticks = SDL_GetTicks();
}
/*
Set the framerate in Hz
*/
int SDL_setFramerate(FPSmanager * manager, int rate)
{
if ((rate >= FPS_LOWER_LIMIT) && (rate <= FPS_UPPER_LIMIT)) {
manager->framecount = 0;
manager->rate = rate;
manager->rateticks = (1000.0 / (float) rate);
return (0);
} else {
return (-1);
}
}
/*
Return the current target framerate in Hz
*/
int SDL_getFramerate(FPSmanager * manager)
{
if (manager == NULL) {
return (-1);
} else {
return (manager->rate);
}
}
/*
Delay execution to maintain a constant framerate. Calculate fps.
*/
void SDL_framerateDelay(FPSmanager * manager)
{
Uint32 current_ticks;
Uint32 target_ticks;
Uint32 the_delay;
/*
* Next frame
*/
manager->framecount++;
/*
* Get/calc ticks
*/
current_ticks = SDL_GetTicks();
target_ticks = manager->lastticks + (Uint32) ((float) manager->framecount * manager->rateticks);
if (current_ticks <= target_ticks) {
the_delay = target_ticks - current_ticks;
SDL_Delay(the_delay);
} else {
manager->framecount = 0;
manager->lastticks = SDL_GetTicks();
}
}

65
SDL_framerate.h Normal file
View File

@ -0,0 +1,65 @@
/*
SDL_framerate: framerate manager
LGPL (c) A. Schiffler
*/
#ifndef _SDL_framerate_h
#define _SDL_framerate_h
/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
extern "C" {
#endif
/* --- */
#include "SDL.h"
/* --------- Definitions */
/* Some rates in Hz */
#define FPS_UPPER_LIMIT 200
#define FPS_LOWER_LIMIT 1
#define FPS_DEFAULT 30
/* --------- Structure variables */
typedef struct {
Uint32 framecount;
float rateticks;
Uint32 lastticks;
Uint32 rate;
} FPSmanager;
/* --------- Function prototypes */
#ifdef WIN32
#ifdef BUILD_DLL
#define DLLINTERFACE __declspec(dllexport)
#else
#define DLLINTERFACE __declspec(dllimport)
#endif
#else
#define DLLINTERFACE
#endif
/* Functions return 0 or value for sucess and -1 for error */
void SDL_initFramerate(FPSmanager * manager);
int SDL_setFramerate(FPSmanager * manager, int rate);
int SDL_getFramerate(FPSmanager * manager);
void SDL_framerateDelay(FPSmanager * manager);
/* --- */
/* Ends C function definitions when using C++ */
#ifdef __cplusplus
}
#endif
#endif /* _SDL_framerate_h */