Nytt i forumet
Senaste privatannonserna
Prylar säljes, köpes, bytes och skänkes
| 2012-04-26, 20:28 | #1 |
stoffe1100Medlem Registrerad: sep 2011 |
c++ SDL runtime errors
Hej jag får skumma runtime errors med mitt första försök till Pong i SDL. Har googlat runt lite på anledningar men hittar inte mycket. Så det får bli ytterligare en tråd.
Just nu är alla Runtime errors borta men "Paddlarna" visas inte på skärmen. Tänkte fråga om någon vet något. Vet att jag programmerat på Svengelska men ni får leva med det hehe.... Här är main.cpp #include <iostream>
#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL_Image.h>
#include "paddle.h"
#define FPS 30
using namespace std;
SDL_Surface * screen;
SDL_Event event;
Uint32 start;
bool keys[256];
bool fullscreen = false;
bool running = true;
bool init();
int main(int argc,char** argv)
{
if((!init())){SDL_Quit(); return 0;}
paddle paddle1(1);
paddle paddle2(2);
while(running)
{
start = SDL_GetTicks();
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
running = false;
break;
case SDL_KEYUP:
keys[event.key.keysym.sym] = false;
break;
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_f){fullscreen = (!fullscreen);}
if(event.key.keysym.sym == SDLK_ESCAPE){running = false; break;}
keys[event.key.keysym.sym] = true;
break;
}
}
if(keys[SDLK_w]){cout << "W IS DOWN" << endl; paddle1.Up();}
else if(keys[SDLK_s]){cout << "S IS DOWN" << endl; paddle1.Down();}
if(keys[SDLK_UP]){cout << "ARROWUP IS DOWN" << endl;paddle2.Up();}
else if(keys[SDLK_DOWN]){cout << "ARROWDOWN IS DOWN" << endl; paddle2.Down();}
if(fullscreen){screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);}else{screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF);}
SDL_FillRect(screen,NULL,NULL);
paddle1.Blit();
paddle2.Blit();
SDL_Flip(screen);
if(1000/FPS > SDL_GetTicks() - start){SDL_Delay(1000/FPS - (SDL_GetTicks() - start));}
}
SDL_Quit();
return 0;
}
bool init(){
if(SDL_Init(SDL_INIT_EVERYTHING) == -1){
std::cout << "Could not initialize sdl" << std::endl;
return false;
}
std::cout << "SDL initilized" << std::endl;
screen = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
if(screen == NULL){
std::cout << "Could not setup screen" << std::endl;
return false;
}
std::cout << "Screen is setup" << std::endl;
if(TTF_Init() == -1){
std::cout << "Could not initialize ttf" << std::endl;
return false;
}
std::cout << "TTF initilized" << std::endl;
SDL_WM_SetCaption("Pong",NULL);
return true;
}
#pragma once
#include <iostream>
#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL_Image.h>
#include "global_functions.h"
class paddle
{
public:
paddle(short nr);
~paddle(void);
void Up();
void Down();
void Blit();
private:
int YVel;
SDL_Surface * image;
SDL_Rect box;
};
#include "paddle.h"
paddle::paddle(short nr)
{
global_functions f;
image = f.Load_Image("paddle.jpg");
image->refcount++;
YVel = 5;
box.w = image->w;
box.h = image->h;
box.y = SDL_GetVideoSurface()->h/2 - box.h/2;
switch(nr)
{
case 1:
box.x = 0;
break;
case 2:
box.x = SDL_GetVideoSurface()->w - box.w;
break;
}
}
void paddle::Up()
{
box.y-=YVel;
}
void paddle::Down()
{
box.y+=YVel;
}
void paddle::Blit()
{
SDL_BlitSurface(image,NULL,SDL_GetVideoSurface(),&box);
}
paddle::~paddle(void)
{
SDL_FreeSurface(image);
}
Senast redigerad av stoffe1100 2012-05-04 klockan 16:20.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa | |
|
|
| 2012-04-26, 23:55 | #2 |
miffoMedlem Plats: Stockholm Registrerad: aug 2002 |
Hm skulle satsa på att felet ligger vid
PaddelIMG = functions.Load_Image("paddle.jpg");
och då vissa den min bild iallafall. PaddelIMG = IMG_Load("bar2.bmp");
__________________
orka |
|
|
| 2012-04-27, 14:39 | #3 |
stoffe1100Medlem Registrerad: sep 2011 |
Citat:
SDL_Surface * global_functions::Load_Image(std::string filename){
image = IMG_Load(filename.c_str());
if(image != NULL){
Optimized_Image = SDL_DisplayFormat(image);
}
else{
std::cout << "Image could not be loaded" << std::endl;
}
return Optimized_Image;
}
![]() kan tillägga att jag kopierade denna från ett annat projekt och där funkade allt utmärkt! Senast redigerad av stoffe1100 2012-04-27 klockan 14:48.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa | |
|
|
| 2012-04-27, 17:02 | #4 |
miffoMedlem Plats: Stockholm Registrerad: aug 2002 |
Citat:
Och jag ser inget fel på den där koden. Testa att köra med en absolut sökväg till filen se om det funkar bättre då. vet att jag haft problem med relative sökvägar när jag startar program i VS.
__________________
orka |
|
|
| 2012-04-27, 21:05 | #5 |
stoffe1100Medlem Registrerad: sep 2011 |
Citat:
?
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa | |
|
|
| 2012-04-30, 18:13 | #7 |
stoffe1100Medlem Registrerad: sep 2011 |
Citat:
Den här gången har jag 2 skumma problem, För det första fryser programmet helt när jag startar det, för det andra så får jag runtime errors direkt om jag använder FreeSurface(IMG) i funktionen LoadBMP EDIT: Nu försvann problemet med FreeSurface(IMG), SDL förvirrar mig, (Troligtvis jag som klantar mig) Senast redigerad av stoffe1100 2012-04-30 klockan 18:22.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa | |
|
|
| 2012-04-30, 19:15 | #8 |
miffoMedlem Plats: Stockholm Registrerad: aug 2002 |
Citat:
SDL_Surface pekare1, pekare2;
pekare1 = IMG_Load("lala.bmp");
pekare2 = pekare1;
SDL_FreeSurface(pekare1);
och pekare2 kommer peka på skräp. SDL_Surface pekare1, pekare2;
pekare1 = IMG_Load("lala.bmp");
pekare2 = pekare1;
pekare2->refcount++;
SDL_FreeSurface(pekare1);
kan inte svära att det är ditt problem bara men läs paddle::paddle(SDL_Surface * IMG, int nr)
{
vel = 5;
image = IMG;
switch(nr)
{
case 1:
box.x = 0;
break;
case 2:
box.x = 800 - image->w;
break;
}
box.y = 600/2 - box.h/2;
box.w = image->w;
box.h = image->h;
SDL_FreeSurface(IMG);
}
__________________
orka |
|
|
| 2012-04-30, 19:48 | #9 |
stoffe1100Medlem Registrerad: sep 2011 |
Citat:
EDIT: Antar att jag bör bara läsa på mer om pekare och hur SDL_Surface sparas kanske? Senast redigerad av stoffe1100 2012-04-30 klockan 20:52.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa | |
|
|
| 2012-04-30, 23:08 | #10 |
miffoMedlem Plats: Stockholm Registrerad: aug 2002 |
Inget fel att lära sig på egenhand.
Anledningen SDL ser ur som det gör är för att det i huvudask är C och inte C++ så dom använder structar istället för klasser. Refcount används för att ser hur många som pekar på structen, så att den inte städar bort structen medans annat pekar på den. Dock så är det upp till programmeraren att lägga till på refcount, Detta sker inte automatisk. om du vill läsa på om SDL finns det en API beskrivning på http://www.libsdl.org/cgi/docwiki.cgi/SDL_API och för bara hur c++ fungerar är väll http://www.cplusplus.com/doc/tutorial/ en bra läsning.
__________________
orka |
|
|
| 2012-05-01, 09:08 | #11 |
stoffe1100Medlem Registrerad: sep 2011 |
Citat:
Vänta nu, Tror jag fattade det, Du har räddat ytterligare en av mina trådar. Du är min hjälte Bara en tillägsfråga för att kolla så att jag förstår allt. Om jag hade skrivit pekare1->refcount++ så hade väl det gjort exakt samma sak som pekare2->refcount++ eftersom de pekar på samma struktur För övrigt så låg och läste halva natten igår på mobilen på cplusplus.com om pekare ,hehe. Men måste missat den sidan om SDL api. Ska nog ta en paus med att programmera och börja läsa i några dagar. Ser bra ut, Tack så mycket
Senast redigerad av stoffe1100 2012-05-01 klockan 09:22.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa | |
|
|
| 2012-05-01, 16:15 | #12 |
miffoMedlem Plats: Stockholm Registrerad: aug 2002 |
Citat:
Har du däremot räknat upp refcount kommer freesurface bara räkna ner refcount. paddle::paddle(SDL_Surface * IMG, int nr)
{
vel = 5;
image = IMG;
switch(nr)
{
case 1:
box.x = 0;
break;
case 2:
box.x = 800 - image->w;
break;
}
box.y = 600/2 - box.h/2;
box.w = image->w;
box.h = image->h;
SDL_FreeSurface(IMG);
}
Sen på slutet tar du freesurface på den utan att räknat upp refcount därför får du fel. Eftersom refcount default är 1 så räknar freesurface ner den till 0, ser att den är 0 och börjar sedan frigöra allt minne som surfacen hanterar.
__________________
orka |
|
|
| 2012-05-01, 16:43 | #13 |
stoffe1100Medlem Registrerad: sep 2011 |
Citat:
Skulle man inte kunna sätta som en regel för sig själv när man programmerar i SDL att om man har följande rad: SDL_Surface * srf1 = SDL_Surface * srf2 (du fattar) Så ska den även ha en motsvarande srf1->refcount++?
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa | |
|
|
| 2012-05-04, 16:18 | #14 |
stoffe1100Medlem Registrerad: sep 2011 |
Citat:
Nu är problemet att det funkar inte att hålla ner knappar. förstår inte varför. Blir ett knapptryck och sen ingenting mer. Har ju faktiskt gjort en bool array för att kolla det, Uppdaterar koden i första inlägget nu så kanske du kan kolla lite på det.EDIT: Märkte även att när jag startar fullscreen börjar allt flimmra. Hur kan detta ske? Senast redigerad av stoffe1100 2012-05-04 klockan 17:30.
__________________
| i5 2500k | h100 | Evga 580 | Fractal Design arc | Asrock P67 Fatal1ty | Hx1050w | 24" BenQ | 16GB Vengeance Ram | Razer DeathAdder | Razer Carcharias | Razer Arctosa | |
|
|
Redaktionens senaste nyhetsrubriker
Prylar säljes, köpes, bytes och skänkes