nahoy Skrevet 8. mars 2006 Del Skrevet 8. mars 2006 (endret) 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 8. mars 2006 av nahoy Lenke til kommentar
Klette Skrevet 8. mars 2006 Del Skrevet 8. mars 2006 Mener at dette kan skje hvis fps'en spinner ut av kontroll... lag deg en sak som regulærerer fps'en.. (kan teste lett ved å kanskje legge på en sleep(10); eller no etter hver frame.. ) Lenke til kommentar
prebenl Skrevet 9. mars 2006 Del Skrevet 9. mars 2006 Skal programmet oppdateres kontinuerlig? I såfall burde sleep, og double-buffering være på plass. Lenke til kommentar
mikaelandre Skrevet 9. mars 2006 Del Skrevet 9. mars 2006 jeg hadde ca samme problem med glut, men da var det driveren til skjermkortet som var problemet. Lenke til kommentar
nahoy Skrevet 9. mars 2006 Forfatter Del Skrevet 9. mars 2006 (endret) 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 9. mars 2006 av nahoy Lenke til kommentar
teflonpanne Skrevet 9. mars 2006 Del Skrevet 9. mars 2006 jeg nekter å tro at et saklig api krever sleep i rendringsloopen for å være stabil, tror du har gjort noe annet feil som kanskje vises hvis du paster koden Lenke til kommentar
hishadow Skrevet 9. mars 2006 Del Skrevet 9. mars 2006 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
nahoy Skrevet 9. mars 2006 Forfatter Del Skrevet 9. mars 2006 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
Giddion Skrevet 10. mars 2006 Del Skrevet 10. mars 2006 Jeg har ingen erfaring med SDL men jeg har litt erfaring med dobbel buffering. er det mulig at du bare tegner på den ene bufferen. Lenke til kommentar
prebenl Skrevet 10. mars 2006 Del Skrevet 10. mars 2006 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
mortizz Skrevet 10. mars 2006 Del Skrevet 10. mars 2006 SDL_GL_SwapBuffers(); prøv den nederst i loopen din. Lenke til kommentar
nahoy Skrevet 20. juni 2006 Forfatter Del Skrevet 20. juni 2006 (endret) 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 20. juni 2006 av nahoy Lenke til kommentar
nahoy Skrevet 20. juni 2006 Forfatter Del Skrevet 20. juni 2006 (endret) EDIT: Glemte fila EDIT: Etter mange iherdige forsøk på å laste opp filen ordentlig, har jeg omsider gitt opp. Jeg legger heller ut en link til serveren min Bendelormer-beta13.zip Fila er på 3.5 MB Håper det funker nå, for nå er jeg ganske lei. Endret 20. juni 2006 av nahoy Lenke til kommentar
Dead_Rabbit Skrevet 20. juni 2006 Del Skrevet 20. juni 2006 Du må hele tiden oppdatere bakgrunn for at bildet ikke skal henge igjen, ja. Dette kan gjøres veldig effektivt med f.eks. SDL_FillRect. Og det med double-buffering høres - om jeg har forstått det riktig - ganske riktig, heh. Lenke til kommentar
lnostdal Skrevet 21. juni 2006 Del Skrevet 21. juni 2006 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
Dead_Rabbit Skrevet 21. juni 2006 Del Skrevet 21. juni 2006 Nja, er ikke SDL_ttf relativt vanlig å ha installert? Lenke til kommentar
lnostdal Skrevet 21. juni 2006 Del Skrevet 21. juni 2006 (endret) 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 21. juni 2006 av lnostdal Lenke til kommentar
nahoy Skrevet 22. juni 2006 Forfatter Del Skrevet 22. juni 2006 Har fiksa flimmeret etter gulleplene nå og spillet virker bra første gangen man kjører det. Når man så starter spillet igjen henger litt av ormen igjen fra sist runde, aner ikke hvorfor dette skjer, og det er ufattelig irriterende. Noen som har noen idéer på hva som kan være galt? Bendelormer beta 1.4 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå