Gå til innhold

hvordan fjerne flimmer i fullskjerm med sdl?


Anbefalte innlegg

Alt flimrer noe helt grenseløst, når jeg kjører mitt program i fullskjerm, i motsetning til når jeg kjører i vindu. Hva kan dette skyldes?

 

EDIT:

Alt vises forresten riktig, og jeg har satt riktig oppløsning, ja, det er bare det at det på en måte veksler mellom å være svart og ikke-svart.

Endret av nahoy
Lenke til kommentar
Videoannonse
Annonse
Skal programmet oppdateres kontinuerlig? I såfall burde sleep, og double-buffering være på plass.

5725368[/snapback]

Programmet oppdateres kontinuerlig, ja. og jeg har sdl_delay(30); på slutten av loopen.

Er det forskjell på sleep og sdl_delay?

 

EDIT: Hvilken fil må jeg inkludere for å kunne bruke sleep i såfall (jeg bruker c++).

Har testet ved å sette sdl_delay høyt nå og funnet ut at alle bildene og teksten på skjermen blir borte i annenhver frame. Prikkene jeg plotter inn selv blir værende hele tiden.

Endret av nahoy
Lenke til kommentar

Kan ikke SDL, men flimmer i 3d programmer pleier å være pga at Double Buffering ikke er aktivert (double buffering = tegn hele bildet ferdig i et buffer før det vises på skjermen). Sjekk om du har aktivert dette, event finn en tutorial som viser hvordan du kan aktivere det.

Lenke til kommentar

har allerede skrudd på doublebuffering...

Jeg paster koden og legger ved en zip fil, som inneholder bilder og musikk.

Det er et 2d-snakespill, så det har nok ikke noe med 3d å gjøre.

 

 

//Bendelormer
//programmert av johan helsing
//kopiert diverse funksjoner fra cone3d
//
// 2005
#include <fstream>
#include <iostream> //denne kan fjernes etter hvert
#include <map> //hva gjør denne?? finn ut!!
#include <string>   // Hva gjør denne?
#include <cstdlib>
#include <ctime>
#include <SDL/SDL_mixer.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <sstream> //for å legge sammen tekst

SDL_Surface *back;
SDL_Surface *screen;
int xpos=0,ypos=0;
// config-greier
using namespace std;
typedef std::map<string, string> StringMap;

int done=0;
int skritt;
int players=0;
int pause=0;
int pang=0;
int lightcyclemodus=0;
int fliptime=1;
int pausedelay=0;

int highscore;
int pangtidspunkt=0;

int tast1;
int tast2;
int joy1;

int fart=15; //hastighet, jo høyere jo saktere


int cycles=0;
class epler
{
     public:
            int x;
            int y;
            int verdi;
            int r;
            int g;
            int b;
            //hvor mange cycler det tar før eplet respawner, -1 betyr evig
            int levetid;
            int fodselscycle;
            void spawn()
            {
                x=(rand()%160);
                y=(rand()%119);
                fodselscycle=cycles;
                fliptime=1;
                if((rand()%20)+1==10)
                {
                    verdi=250;
                    r=255;
                    g=255;
                    b=0;
                    levetid=400;
                }
                else if(rand()%2)
                {
                    verdi=20;
                    r=255;
                    g=0;
                    b=0;
                    levetid=-1;
                }
                else
                {
                    verdi=10;
                    r=0;
                    g=150;
                    b=0;
                    levetid=-1;
                }
                    
            }
            
};
int antallepler=10; //10 er default, men blir endret med cfg-filen
int standardepleverdi=10; // samme som over
epler eple[100];

TTF_Font *font;
TTF_Font *scorefont;
TTF_Font *menyfont;
TTF_Font *infofont;
TTF_Font *titlefont;
SDL_Surface *text_surface;
SDL_Surface *pausetext;
SDL_Surface *infotext;
SDL_Surface *title;


class ormer
{
     public:
            int x[10000];
            int y[10000];
            int lengde;
            int r;
            int g;
            int b;
            // 0 = opp, 1 = ned, 2 = venstre, 3 = høyre
            int retning;
            int tempretning;
            // poeng er ikke brukt til noe enda
            int poeng;
            int turbo;
            SDL_Surface *scoretext;
            SDL_Color farge;
            int scorecordx;
            int scorecordy;
            
            void oppdater_score(int ii)
            {
                poeng += ii;
                stringstream tmp;
                tmp << "Score: " << poeng;
                scoretext = TTF_RenderText_Solid(scorefont, tmp.str().c_str(), farge);
            }
};
ormer orm[3];
SDL_Surface *highscoretext;
SDL_Color highscorefarge={0,0,255};

SDL_Color color={255,255,255};

Mix_Music *music;

int selected=0;
SDL_Color merketfarge={0, 0, 150};
SDL_Color umerketfarge={190, 230, 255};
class meny
{
     public:
            int x;
            int y;
            int value;
            int multivalue;
            int r;
            int g;
            int b;
            char* textvalue;
            SDL_Surface *overflate;
            SDL_Color farge;
            char* caption;
            void oppdater_meny(int i)
            {
                value+=i;
                stringstream tmp2;
                if(caption=="Players: " && i)
                {
                    if(value==0)value=1;
                    if(value==4)value=3;
                    if(value==1)textvalue="1";
                    else if(value==2)textvalue="2";
                    else if(value==3)textvalue="3";
                    else textvalue="error";     
                }
                if(caption=="Speed: " && i)
                {
                    if(value==-1)value=0;
                    if(value==7)value=6;
                    if(value==0)     textvalue = "Slowest";
                    else if(value==1)textvalue = "Slower";
                    else if(value==2)textvalue = "Slow";
                    else if(value==3)textvalue = "Normal";
                    else if(value==4)textvalue = "Fast";
                    else if(value==5)textvalue = "Faster";
                    else if(value==6)textvalue = "Fastest";
                }
                if(caption=="Achtung die Ecke mode: " && i)
                {
                    if(value==-1)value=1;
                    if(value==2)value=0;
                    if(value)textvalue = "on";
                    if(!value)textvalue = "off";
                    lightcyclemodus=value;
                }
                if(caption=="Music: " && i)
                {
                    if(value==-1)value=1;
                    if(value==2)value=0;
                    if(!value)textvalue = "on";
                    if(value)textvalue = "off";
                    if(!value)Mix_ResumeMusic();
                    if(value)Mix_PauseMusic();
                }
                stringstream tmp;
                tmp << caption << textvalue;
                //if(multivalue)tmp << value;
                overflate = TTF_RenderText_Solid(menyfont, tmp.str().c_str(), farge);
                pausedelay=10;
                fliptime=1;
                
            }
};
meny hovedmeny[6];





template <typename Type>
bool ConvertString(const string& data, Type& value)
{
   // Convert string to specified datatype.
   stringstream stream(data);
   stream >> value;

   if( stream.fail() )
       return false;

   return true;
}

StringMap config;
//les av cfg-fil
void HandleConfiguration(StringMap& config)
{
      
   StringMap::const_iterator search;

   search = config.find("antallepler");
   if( !ConvertString(search->second, antallepler) && search == config.end() )
       cout << "Unable to find value for antallepler" << endl;
       
   search = config.find("standardepleverdi");
   if( !ConvertString(search->second, standardepleverdi) && search == config.end() )
       cout << "Unable to find value for standardepleverdi" << endl;

   search = config.find("fart");
   if( !ConvertString(search->second, fart) && search == config.end() )
       cout << "Unable to find value for fart" << endl;

   //knapper
   
   //tasteoppsett1
   search = config.find("tast1");
   if( !ConvertString(search->second, tast1) && search == config.end() )
       cout << "Unable to find value for tast1" << endl;
       
   //tasteoppsett2
   search = config.find("tast2");
   if( !ConvertString(search->second, tast2) && search == config.end() )
       cout << "Unable to find value for tast2" << endl;

   //joystickoppsett
   search = config.find("joy1");
   if( !ConvertString(search->second, joy1) && search == config.end() )
       cout << "Unable to find value for joy1" << endl;

   //orm 1    
   search = config.find("orm[0].x[0]");
   if( !ConvertString(search->second, orm[0].x[0]) && search == config.end() )
       cout << "Unable to find value for orm[0].x[0]" << endl;
       
   search = config.find("orm[0].y[0]");
   if( !ConvertString(search->second, orm[0].y[0]) && search == config.end() )
       cout << "Unable to find value for orm[0].y[0]" << endl;
       
   search = config.find("orm[0].lengde");
   if( !ConvertString(search->second, orm[0].lengde) && search == config.end() )
       cout << "Unable to find value for orm[0].lengde" << endl;
       
   search = config.find("orm[0].tempretning");
   if( !ConvertString(search->second, orm[0].tempretning) && search == config.end() )
       cout << "Unable to find value for orm[0].tempretning" << endl;
       
   search = config.find("orm[0].r");
   if( !ConvertString(search->second, orm[0].r) && search == config.end() )
       cout << "Unable to find value for orm[0].r" << endl;
       
   search = config.find("orm[0].g");
   if( !ConvertString(search->second, orm[0].g) && search == config.end() )
       cout << "Unable to find value for orm[0].g" << endl;
       
   search = config.find("orm[0].b");
   if( !ConvertString(search->second, orm[0].b) && search == config.end() )
       cout << "Unable to find value for orm[0].b" << endl;

       //neste orm
       
   search = config.find("orm[1].x[0]");
   if( !ConvertString(search->second, orm[1].x[0]) && search == config.end() )
       cout << "Unable to find value for orm[1].x[0]" << endl;
   
   search = config.find("orm[1].y[0]");
   if( !ConvertString(search->second, orm[1].y[0]) && search == config.end() )
       cout << "Unable to find value for orm[1].y[0]" << endl;
           
   search = config.find("orm[1].lengde");
   if( !ConvertString(search->second, orm[1].lengde) && search == config.end() )
       cout << "Unable to find value for orm[1].lengde" << endl;
       
   search = config.find("orm[1].tempretning");
   if( !ConvertString(search->second, orm[1].tempretning) && search == config.end() )
       cout << "Unable to find value for orm[1].tempretning" << endl;
       
   search = config.find("orm[1].r");
   if( !ConvertString(search->second, orm[1].r) && search == config.end() )
       cout << "Unable to find value for orm[1].r" << endl;
       
   search = config.find("orm[1].g");
   if( !ConvertString(search->second, orm[1].g) && search == config.end() )
       cout << "Unable to find value for orm[1].g" << endl;
       
   search = config.find("orm[1].b");
   if( !ConvertString(search->second, orm[1].b) && search == config.end() )
       cout << "Unable to find value for orm[1].b" << endl;
       
   //siste orm
   
       search = config.find("orm[2].x[0]");
   if( !ConvertString(search->second, orm[2].x[0]) && search == config.end() )
       cout << "Unable to find value for orm[2].x[0]" << endl;
       
   search = config.find("orm[2].y[0]");
   if( !ConvertString(search->second, orm[2].y[0]) && search == config.end() )
       cout << "Unable to find value for orm[2].y[0]" << endl;
       
   search = config.find("orm[2].lengde");
   if( !ConvertString(search->second, orm[2].lengde) && search == config.end() )
       cout << "Unable to find value for orm[2].lengde" << endl;
       
   search = config.find("orm[2].tempretning");
   if( !ConvertString(search->second, orm[2].tempretning) && search == config.end() )
       cout << "Unable to find value for orm[2].tempretning" << endl;
       
   search = config.find("orm[2].r");
   if( !ConvertString(search->second, orm[2].r) && search == config.end() )
       cout << "Unable to find value for orm[2].r" << endl;
       
   search = config.find("orm[2].g");
   if( !ConvertString(search->second, orm[2].g) && search == config.end() )
       cout << "Unable to find value for orm[2].g" << endl;
       
   search = config.find("orm[2].b");
   if( !ConvertString(search->second, orm[2].b) && search == config.end() )
       cout << "Unable to find value for orm[2].b" << endl;
       
   //ferdig med ormene
   
   
}

void DrawPixel(SDL_Surface *screen, int x, int y,
                                   Uint8 R, Uint8 G, Uint8 B)
{
 Uint32 color = SDL_MapRGB(screen->format, R, G, B);
 switch (screen->format->BytesPerPixel)
 {
   case 1: // Assuming 8-bpp
     {
       Uint8 *bufp;
       bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
       *bufp = color;
     }
     break;
   case 2: // Probably 15-bpp or 16-bpp
     {
       Uint16 *bufp;
       bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
       *bufp = color;
     }
     break;
   case 3: // Slow 24-bpp mode, usually not used
     {
       Uint8 *bufp;
       bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
       if(SDL_BYTEORDER == SDL_LIL_ENDIAN)
       {
         bufp[0] = color;
         bufp[1] = color >> 8;
         bufp[2] = color >> 16;
       } else {
         bufp[2] = color;
         bufp[1] = color >> 8;
         bufp[0] = color >> 16;
       }
     }
     break;
   case 4: // Probably 32-bpp
     {
       Uint32 *bufp;
       bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
       *bufp = color;
     }
     break;
 }
}


void Slock(SDL_Surface *screen)
{
 if ( SDL_MUSTLOCK(screen) )
 {
   if ( SDL_LockSurface(screen) < 0 )
   {
     return;
   }
 }
}


void Sulock(SDL_Surface *screen)
{
 if ( SDL_MUSTLOCK(screen) )
 {
   SDL_UnlockSurface(screen);
 }
}

void DrawIMG(SDL_Surface *img, int x, int y)
{
 SDL_Rect dest;
 dest.x = x;
 dest.y = y;
 SDL_BlitSurface(img, NULL, screen, &dest);
}

void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2)
{
 SDL_Rect dest;
 dest.x = x;
 dest.y = y;
 SDL_Rect dest2;
 dest2.x = x2;
 dest2.y = y2;
 dest2.w = w;
 dest2.h = h;
 SDL_BlitSurface(img, &dest2, screen, &dest);
}

void DrawBG()
{
 Slock(screen);
 DrawIMG(back, 0, 0);
 Sulock(screen);
}

int InitImages()
{
 back = SDL_LoadBMP("bg.bmp");
 return 0;
}



void DrawScene(SDL_Surface *screen)
{

 
 if(fliptime)
     DrawIMG(back, 0, 0); //oppdaterer hele skjermen hvis nødvendig
 
 //så man slipper å oppdatere hele skjermen
 for(int p=0; p<players; p++)
     DrawIMG(back, orm[p].x[orm[p].lengde]*4-4, orm[p].y[orm[p].lengde]*4-4,
         12, 12, orm[p].x[orm[p].lengde]*4-4, orm[p].y[orm[p].lengde]*4-4);
 //det ser langt og slitsomt ut, det det gjør er å oppdatere rundt enden av ormen
 //burde vel legge dette inn i objektet orm, absolutt!
 
 Slock(screen);
 //nå tegnes bendelormen(e)
 if(!pang || fliptime)
 {
 for(int p=0; p<players; p++)
 {
   for(int i=0; i<=orm[p].lengde; i++)
           {
           for(int h=0; h<=3; h++)
                   {
                          for(int v=0; v<=3; v++)
                          {
                          //if(v>0&&v<3&&h>0&&h<3)
                          DrawPixel(screen, (orm[p].x[i]*4+h), (orm[p].y[i]*4+v), orm[p].r, orm[p].g, orm[p].b);
                          //else DrawPixel(screen, (orm[p].x[i]*4+h), (orm[p].y[i]*4+v), orm[p].r+100, orm[p].g+100, orm[p].b+100);
                          }
                   }
           }
 }

 //så tegnes eplene
 if(players)
 {
     for(int a=0; a<antallepler; a++)
     {
         for(int j=0; j<5; j++)
         {
             for(int i=0; i<5; i++)
             {
                 if (!((i==0 || i==4) && (j==0 || j==4)))
                 {
                     DrawPixel(screen, (eple[a].x*4+i), eple[a].y*4+j, eple[a].r, eple[a].g, eple[a].b);
                 }
             }
         }
         DrawPixel(screen, (eple[a].x*4+2), eple[a].y*4-1, 0, 150, 0);
         DrawPixel(screen, (eple[a].x*4+2), eple[a].y*4-2, 0, 150, 0);
     }
 } 
 //slutt på epletegning
 }
 Sulock(screen);
 
 //ttf
 if(fliptime)
 {
     if (pang)
     {
         DrawIMG(text_surface, 25, 100);
         stringstream tmp;
         if(players>1)tmp << pang << "p crashed";
         else tmp << "You crashed";
         infotext=TTF_RenderText_Solid(infofont, tmp.str().c_str(),color);
         DrawIMG(infotext, 210, 300);    
     }
 
 
     //meny
     if (players==0)
     {
         DrawIMG(title, 85, 70);
         for(int i=0; i<6; i++)
         {
             DrawIMG(hovedmeny[i].overflate, hovedmeny[i].x, hovedmeny[i].y);
         }
     }
 
     //pauseteksten
     if (pause && players) DrawIMG(pausetext, 85, 90);
     
     //highscore
     if(players==1)
     {
         DrawIMG(highscoretext, 480, 5);
     }
     
     //score
     for(int p=0; p<players; p++)
         DrawIMG(orm[p].scoretext, orm[p].scorecordx, orm[p].scorecordy);
     
     fliptime=0;
 }
 //slutt på ttf-greier

 
 SDL_Flip(screen);
}

void ormflytt(int p)
{
    for(int i=orm[p].lengde; i>=1; i--)
    {
            orm[p].x[i]=orm[p].x[(i-1)];
            orm[p].y[i]=orm[p].y[(i-1)];
    }
}

//plasser sier om ormen skal bli lengre eller om det bare skal plasseres et eple
//p betyr spiller 0=spiller1 1=spiller2



// 1 eller mer returnet betyr kollidering
int kollisjonsdetektor(int p)
{
   int i=0;
   if (orm[p].x[0]<0 || orm[p].x[0]>=160 || orm[p].y[0]<1 || orm[p].y[0]>118)  { i=p+1; }
   for(int c=0; c<players; c++)
   {
           for(int g=1; g<orm[p].lengde; g++)
           {
                   if (orm[c].x[g]==orm[p].x[0] && orm[c].y[g]==orm[p].y[0]){ i=p+1; }                  
           }
   }
   return i;
   
}

int menyreturn()
{
   if(selected==0)
   {
       players=hovedmeny[1].value;
       if(hovedmeny[2].value==0)fart=60;
       else if(hovedmeny[2].value==1)fart=40;
       else if(hovedmeny[2].value==2)fart=25;
       else if(hovedmeny[2].value==3)fart=15;
       else if(hovedmeny[2].value==4)fart=7;
       else if(hovedmeny[2].value==5)fart=3;
       else if(hovedmeny[2].value==6)fart=0;
       else fart=0;
       stringstream tmp;
       tmp << "Highscore: " << highscore;
       highscoretext = TTF_RenderText_Solid(scorefont, tmp.str().c_str(), highscorefarge);
   }
   if(selected==5)done=1;
   pausedelay=10;
   fliptime=1;
}

int changeselected(int i)
{
   selected=selected+i;
   if(selected==-1)selected=5;
   if(selected==6)selected=0;
   for(int k=0; k<6; k++)
   {
       if(k!=selected) {hovedmeny[k].farge=umerketfarge;}
       if(k==selected) {hovedmeny[k].farge=merketfarge;}
       hovedmeny[k].oppdater_meny(0);
   }
   fliptime=1;
}

int selectedvalue(int i)
{
   hovedmeny[selected].oppdater_meny(i);
}

int main(int argc, char *argv[])
{
 srand(time(0));
 Uint8* keys;
   
   //config-greier
   const char* config_filename = "config.cfg";

   // Open configuration file.
   ifstream config_file( config_filename );

   if(!config_file) {
       cout << "Error opening " <<  config_filename << "." << endl;
       return -1;
   }

   // Read configuration from file.
   StringMap config;

   string id, value;
   while( !config_file.eof() ) {
       config_file >> id;
       config_file >> value;

       if(config_file.fail()) {
           cout << "Error while reading " << config_filename << "." << endl;
           cout << "Unable to parse id " << id << "." << endl;
           config_file.close();
           return -1;
       }

       config.insert( StringMap::value_type(id, value) );
   }

   config_file.close();

   // Handle configuration.
   HandleConfiguration(config);
   //slutt på config-greier
   
   //les av highscoren
   stringstream converttemp;
   string filetemp;
   int score;
   ifstream fin("highscore.txt");
   getline(fin,filetemp);
   converttemp << filetemp;
   converttemp >> highscore;
   fin.close();
   
 if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO|SDL_INIT_JOYSTICK|SDL_INIT_NOPARACHUTE) < 0 ) //test om noparachute er nødvendig!
 {
   printf("Unable to init SDL: %s\n", SDL_GetError());
   exit(1);
 }
 

 
 //ttf-greier
 TTF_Init();
 font=TTF_OpenFont("cezanne.ttf", 200);
 scorefont=TTF_OpenFont("cezanne.ttf", 20);
 infofont=TTF_OpenFont("cezanne.ttf", 50);
 menyfont=TTF_OpenFont("cezanne.ttf", 40);
 titlefont=TTF_OpenFont("cezanne.ttf", 60);
 text_surface=TTF_RenderText_Solid(font,"Loooser!" ,color);


 for(int p=0; p<3; p++)
 {
    SDL_Color tempfarge={orm[p].r, orm[p].g, orm[p].b};
    orm[p].farge= tempfarge;
    orm[p].oppdater_score(0);

 }
 orm[0].scorecordx=5;
 orm[0].scorecordy=5;
 orm[1].scorecordx=540;
 orm[1].scorecordy=5;
 orm[2].scorecordx=5;
 orm[2].scorecordy=452;

 pausetext=TTF_RenderText_Solid(font, "Pause" , color);
 title=TTF_RenderText_Solid(titlefont, "Bendelormer" , color);
 
 hovedmeny[0].x=120;
 hovedmeny[0].y=140;
 hovedmeny[1].x=hovedmeny[0].x;
 hovedmeny[1].y=hovedmeny[0].y+40*1;
 hovedmeny[2].x=hovedmeny[0].x;
 hovedmeny[2].y=hovedmeny[0].y+40*2;
 hovedmeny[3].x=hovedmeny[0].x;
 hovedmeny[3].y=hovedmeny[0].y+40*3;
 hovedmeny[4].x=hovedmeny[0].x;
 hovedmeny[4].y=hovedmeny[0].y+40*4;
 hovedmeny[5].x=hovedmeny[0].x;
 hovedmeny[5].y=hovedmeny[0].y+40*5;

 hovedmeny[0].caption = "Start Game";
 hovedmeny[1].caption = "Players: ";
 hovedmeny[1].textvalue = "1";
 hovedmeny[1].multivalue = 1;
 hovedmeny[2].caption = "Speed: ";
 hovedmeny[2].textvalue = "Normal";
 hovedmeny[2].multivalue = 1;
 hovedmeny[3].caption = "Achtung die Ecke mode: ";
 hovedmeny[3].textvalue = "off";
 hovedmeny[3].multivalue = 1;
 hovedmeny[4].caption = "Music: ";
 hovedmeny[4].textvalue = "on";
 hovedmeny[4].multivalue = 1;
 hovedmeny[5].caption = "Exit to dos";


 hovedmeny[1].value=1;
 hovedmeny[2].value=3;
 //dette gjør at menyen kommer fram
 changeselected(0);  


 //Joystick-greier fra internett 
 SDL_JoystickEventState( SDL_ENABLE );
 SDL_Joystick* mJoystick;
 mJoystick = SDL_JoystickOpen( 0 );

 if ( mJoystick == NULL )
    ; // error handling
 //slutt på joystick-greier
 
 
 //musikk-greier, ikke ferdig
 //Mix_Music *music; denne er nå global
 //int audio_rate = 22050;
 //Uint16 audio_format = AUDIO_S16; /* 16-bit stereo */
 //int audio_channels = 2;
 //int audio_buffers = 4096;
 //MIX_DEFAULT_FORMAT
 if(Mix_OpenAudio(22050, AUDIO_S16, 2, 4096)==-1)
 {
   printf("Mix_OpenAudio: %s\n", Mix_GetError());
   done=1;
   exit(2);
 }
 
 music=Mix_LoadMUS("musikk.mod");
 Mix_PlayMusic(music, -1);
 

 
 atexit(SDL_Quit);
 atexit(TTF_Quit);
 atexit(Mix_CloseAudio);

 
 

screen=SDL_SetVideoMode(640,480,0,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_NOFRAME|SDL_FULLSCREEN); //|SDL_FULLSCREEN, skjermen flimrer opprinnelig 32bpp
 if ( screen == NULL )
 {
   printf("Unable to set 640x480 video: %s\n", SDL_GetError());
   exit(1);
 }
 InitImages();
 DrawBG();
 
 //her starter tegningen
 for(int a=0; a<antallepler; a++)eple[a].spawn();


 while(done == 0)
 {

   SDL_Event event;
       
   while ( SDL_PollEvent(&event) )
   {
     if ( event.type == SDL_QUIT )  {  done = 1;  }
   }
   

   
   
   

   keys = SDL_GetKeyState(NULL);

   if(players && !pausedelay)
       {
       //tastatur1knapper
       if ( keys[SDLK_UP])    { orm[tast1].tempretning=0; }
       if ( keys[SDLK_DOWN])  { orm[tast1].tempretning=1; }
       if ( keys[SDLK_LEFT])  { orm[tast1].tempretning=2; }
       if ( keys[SDLK_RIGHT]) { orm[tast1].tempretning=3; }
       if ( keys[SDLK_RETURN]){ orm[tast1].turbo=1;       }
       //tastatur2-knapper
       if ( keys[SDLK_w]) { orm[tast2].tempretning=0; }
       if ( keys[SDLK_s]) { orm[tast2].tempretning=1; }
       if ( keys[SDLK_a]) { orm[tast2].tempretning=2; }
       if ( keys[SDLK_d]) { orm[tast2].tempretning=3; }
       if ( keys[SDLK_LSHIFT]){ orm[tast2].turbo=1;   }
       //eple[0].verdi +-
       if ( keys[SDLK_o] ) { eple[0].verdi+=1; }
       if ( keys[SDLK_l] ) { eple[0].verdi-=1; }
       //nyttspillknapp
       if ( keys[SDLK_n] || keys[SDLK_ESCAPE])
       {
           //skal flyttes til egen funksjon, men av en eller annen gurnn går det ikke
           HandleConfiguration(config);
           for(int p=0; p<players; p++)
           {
               for(int i=1; i<orm[p].lengde; i++)
               {
                   orm[p].x[i]=0;
                   orm[p].y[i]=0;
               }
           }
           players=0;
           pang=0;
           orm[0].poeng=0;
           orm[1].poeng=0;
           orm[2].poeng=0;
           orm[0].oppdater_score(0);
           orm[1].oppdater_score(0);
           orm[2].oppdater_score(0);
           orm[0].retning=3;
           orm[1].retning=3;
           orm[2].retning=3;
           for(int a=0; a<antallepler; a++)eple[a].spawn();
           pausedelay=10;
           pause=0;
           fliptime=1;
           };
       //tron-/lightcycle-modus
       if ( keys[SDLK_t]) { pausedelay=10; if(lightcyclemodus)lightcyclemodus=0; else lightcyclemodus=1; };
       //Mute-knapp
       if ( keys[SDLK_m]) { Mix_PauseMusic(); }
       //pause
       if ( keys[SDLK_p] && !pang && players) { pausedelay=10; if(pause) pause=0; else pause=1; fliptime=1; }
       //høyere og lavere fart
       if ( keys[SDLK_HOME] && fart>=1) { fart--; }
       if ( keys[SDLK_END]) { fart++; }
       //joystick-knapper
       SDL_JoystickUpdate();
       if(SDL_JoystickGetAxis( mJoystick, 1 )<0 )      { orm[joy1].tempretning=0; }
       if(SDL_JoystickGetAxis( mJoystick, 1 )>10000 )  { orm[joy1].tempretning=1; }
       if(SDL_JoystickGetAxis( mJoystick, 0 )<0 )      { orm[joy1].tempretning=2; }
       if(SDL_JoystickGetAxis( mJoystick, 0 )>10000 )  { orm[joy1].tempretning=3; }
       if(SDL_JoystickGetButton(mJoystick, 0)==1){ orm[joy1].turbo=1;   }
   }
   else if(!pausedelay)
   {
       //1/2/3 spillere
       if ( keys[SDLK_1] && players==0 ) { players=1; };
       if ( keys[SDLK_2] && players==0 ) { players=2; };
       if ( keys[SDLK_3] && players==0 ) { players=3; };
       //menyknappene
       if ( keys[SDLK_UP])    { changeselected(-1); }
       if ( keys[SDLK_DOWN])  { changeselected(1); }
       if ( keys[SDLK_LEFT])  { selectedvalue(-1); }
       if ( keys[SDLK_RIGHT]) { selectedvalue(1); }
       if ( keys[SDLK_RETURN]){ menyreturn(); }
       if ( keys[SDLK_ESCAPE]){ done=1; }
   }
   
   if (pausedelay) pausedelay--;
   

   //her er alt som skjer så lenge pause ikke er på eller spillet ikke har startet enda
   if (!pause && !pang && players)
   {
       for(int p=0; p<players; p++)
       {
           if((orm[p].retning==0 && orm[p].tempretning!=1) ||
           (orm[p].retning==1 && orm[p].tempretning!=0) ||
           (orm[p].retning==2 && orm[p].tempretning!=3) ||
           (orm[p].retning==3 && orm[p].tempretning!=2))
           { 
              orm[p].retning=orm[p].tempretning; 
           }
           
           //pang=kollisjonsdetektor(p);
           if(kollisjonsdetektor(p))
           {
               pang=p+1;
               pangtidspunkt=cycles;
               fliptime=1;
           }
           
           //Er eplet spist?
           for(int a=0; a<antallepler; a++)
           {
               for(int j=0; j<3; j++)
               {
                    for(int i=0; i<3; i++)
                    {
                          //      eple[0].x+2), eple[0].y-1
                          if ((orm[p].x[0]==eple[a].x) && (orm[p].y[0]==eple[a].y))
                          //&& !((i==0 || i==4) && (j==0 || j==4)))
                          { 
                              for(int s=orm[p].lengde; s<orm[p].lengde+eple[a].verdi; s++)
                              {
                                      orm[p].x[s]=0;
                                      orm[p].y[s]=0;
                              }
                              orm[p].lengde+=eple[a].verdi;
                              orm[p].oppdater_score(eple[a].verdi*10);
                              eple[a].spawn();
                          }
                    }
               }
           } 
           
           if(orm[p].retning==0 && !pang){ormflytt(p); orm[p].y[0]-=1+orm[p].turbo;}
           if(orm[p].retning==1 && !pang){ormflytt(p); orm[p].y[0]+=1+orm[p].turbo;}
           if(orm[p].retning==2 && !pang){ormflytt(p); orm[p].x[0]-=1+orm[p].turbo;}
           if(orm[p].retning==3 && !pang){ormflytt(p); orm[p].x[0]+=1+orm[p].turbo;}
           orm[p].turbo=0;
           
           if(lightcyclemodus){ orm[p].x[orm[p].lengde+1]=0; orm[p].y[orm[p].lengde+1]=0; orm[p].lengde++;}
           
       }
       
       //det som kun skjer under 1p-modus
       if(players==1)
       {
           if(orm[0].poeng>highscore)
           {
               highscore=orm[0].poeng;
               stringstream tmp;
               tmp << "Highscore: " << highscore;
               highscoretext = TTF_RenderText_Solid(scorefont, tmp.str().c_str(), highscorefarge);
               ofstream fout("highscore.txt");
               fout << highscore;
               fout.close();
           }
           if(pangtidspunkt==cycles)
           {
               ofstream fout("highscore.txt");
               fout << highscore;
               fout.close();
           }
       }
       
       //dette vil alltid skje, så lenge spillet har startet
       for(int a=0; a<antallepler; a++)
       {
           if(cycles==eple[a].fodselscycle+eple[a].levetid)eple[a].spawn();
       }
   }

   if (done == 0)
   {
            DrawScene(screen);
   }
   SDL_Delay(fart);  // bruk denne for å regulere farten jo høyere jo saktere
   cycles++;
 }
 SDL_JoystickClose(mJoystick);
 TTF_CloseFont(font);
 //her sluttern
 return 0;
}

bendelormer.zip

Lenke til kommentar

Problemet er at noe av tegningen bare skjer på det ene av bufferne, slik at de forsvinner annenhver frame. Har desverre ikke tid til å sette meg inn mer i koden akkurat nå, men det er neppe store endringer som skal til for å få ting på rett kjør. Skal se mer på det senere hvis du/dere ikke finner noen løsning.

Lenke til kommentar
  • 3 måneder senere...

Har jobbet en del med prosjektet nå, og jeg fikset problemet jeg hadde her, uten at husker hvordan, det er mulig at jeg ikke gjorde noe spesielt for å få det til å funke heller. Poenget mitt er i hvertfall at bakgrunnen ikke flimrer lenger. Jeg jobbet videre med prosjektet, og det begynner å se ganske fint ut. Jeg har lagt ut en liten prøveversjon her. Foreløpig bare til windows sad.gif

 

Men jeg har et lite problem, og det er at bilder som har vært et sted og så blitt fjernet "henger igjen" og flimrer veldig, er dette fordi de bare er fjernet fra en av bufrene?

 

Forstår ikke alt som har med dette å gjøre, men inni mitt hode forestiller jeg meg at det er to forskjellige skjermer, en som vises og en som ikke vises. Den som ikke vises er den jeg tegner på, og så bytter jeg skjerm med SDL_Flip(screen); , slik at den jeg har tegnet på kommer frem. Så tegner jeg på den andre og bytter igjen osv.

Stemmer dette?

Er dette da det jeg i så fall må gjøre: lage en funksjon som tegner opp bakgrunnen igjen i to runder i loopen min etter hverandre?

 

Vil gjerne ha andre tilbakemeldinger også.

Kan slenge ut kildekoden også, men det ender bare med folk ikke gidder å lese igjennom hele tråden, så jeg vil helst unngå det.

Kan jo heller laste opp selve kildefilene senere, så kan de som er interessert i dem se på dem.

Endret av nahoy
Lenke til kommentar

kjapt tips ang. distribuering av slike ting; pass på at du pakker ned alt i en egen katalog i .zip/.tar.gz-fila, på den måten havner alt som blir pakket opp i en egen katalog

 

testet denne under wine (Win32-APIet portet til Linux), men det ser ut til at `SDL_ttf.dll' mangler .. kanskje det er like greit å linke statisk?

Lenke til kommentar

nei - SDL er et eksternt bibliotek

 

under linux så vil dette si at man i pakken som installerer programmet har definert avhengigheter som gjør at de rette SDL-bibliotekene blir lastet ned og installert automatisk

 

under win32 har jeg inntrykk av at man ofte tar "fuck it"-løsningen og hiver alle DLL'ene inn i samme katalog som selve programmet, eller linker statisk (man ønsker ikke å ta sjansen på at en annen installer overskriver DLL'ene med manglende symboler (andre build-options) eller lign. om man legger dem i f.eks. windows/system ellernoeslikt)

Endret av lnostdal
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...