[c++][SDL] Språket som inte ville vara som alla andra.

Permalänk
Medlem

[c++][SDL] Språket som inte ville vara som alla andra.

Hej sitter här och försöker jobba på ett litet spel men har stött på litet problem...

Error i g++:

$ make g++ -W -Wall -o0 -g `sdl-config --cflags --libs` -c src/SDLWrapper.cpp -o obj/SDLWrapper.o src/SDLWrapper.cpp:18:14: error: prototype for ‘SDL_Surface* SDLWrapper::convertImage(SDL_Surface)’ does not match any in class ‘SDLWrapper’ src/SDLWrapper.h:19:17: error: candidate is: SDL_Surface SDLWrapper::convertImage(SDL_Surface) src/SDLWrapper.cpp: In constructor ‘SDLWrapper::SDLWrapper()’: src/SDLWrapper.cpp:44:28: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x src/SDLWrapper.cpp:44:28: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘SDL_Color*’ in assignment src/SDLWrapper.cpp:46:64: error: conversion from ‘SDL_Color*’ to non-scalar type ‘SDL_Color’ requested src/SDLWrapper.cpp:51:38: error: no matching function for call to ‘SDLWrapper::convertImage(SDL_Surface*&)’ src/SDLWrapper.h:19:17: note: candidate is: SDL_Surface SDLWrapper::convertImage(SDL_Surface) src/SDLWrapper.cpp:54:39: error: no matching function for call to ‘SDLWrapper::convertImage(SDL_Surface*&)’ src/SDLWrapper.h:19:17: note: candidate is: SDL_Surface SDLWrapper::convertImage(SDL_Surface) src/SDLWrapper.cpp:57:41: error: no matching function for call to ‘SDLWrapper::convertImage(SDL_Surface*&)’ src/SDLWrapper.h:19:17: note: candidate is: SDL_Surface SDLWrapper::convertImage(SDL_Surface) src/SDLWrapper.cpp:60:41: error: no matching function for call to ‘SDLWrapper::convertImage(SDL_Surface*&)’ src/SDLWrapper.h:19:17: note: candidate is: SDL_Surface SDLWrapper::convertImage(SDL_Surface) make: *** [obj/SDLWrapper.o] Fel 1

SDLWrapper.h:

/* This file just contains a calass that is the a "mainLoop" of the game. Nothing special... */ #ifndef H_SDLWRAPPER #define H_SDLWRAPPER #include <SDL.h> #include <SDL_image.h> #include <SDL_ttf.h> class SDLWrapper{ public: SDLWrapper(); ~SDLWrapper(); //converts image to correct bitdepth SDL_Surface convertImage(SDL_Surface inSurf); //The mainLoop where the game will run.. void mainLoop(); private: SDL_Surface* screen; SDL_Surface* textScore; SDL_Surface* playerImage; SDL_Surface* invaderImage; SDL_Surface* explotionImage; SDL_Surface* projetileImage; TTF_Font* font; SDL_Color* colorWhite; }; #endif

SDLWrapper.cpp:

#include <istream> #include <vector> #include <string> #include <cstdlib> #include <SDL.h> #include <SDL_image.h> #include <SDL_ttf.h> #include "SDLWrapper.h" #include "gameLogic.h" #include "gameObjects.h" #include "gameObjectProjectile.h" #include "gameObjectPlayer.h" #include "gameObjectInvader.h" SDL_Surface* SDLWrapper::convertImage(SDL_Surface inSurf){ //Converts Images to correct bit depth. // do not forget to free the old surface if needen.. SDL_Surface* newSurf; if(inSurf != NULL){ newSurf = SDL_DisplayFormat(inSurf); }else{ printf("Some shit when down when trying to convert image...\n"); printf("Is the image loaded?\n"); exit(EXIT_FAILURE); } return newSurf; } SDLWrapper::SDLWrapper(){ //Constructor for class... //Itit some stuff... SDL_Init(SDL_INIT_EVERYTHING); TTF_Init(); font = TTF_OpenFont("media/fonts/ubuntu-font-family/UbuntuMono-B.ttf", 24); screen = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF); colorWhite = {255,255,255}; textScore = TTF_RenderText_Solid(font, "Score: 0", colorWhite); SDL_Surface* tmpimage; //somewhare te store the images temorarely.. tmpimage = IMG_Load("media/images/player.png"); playerImage = convertImage(tmpimage); tmpimage = IMG_Load("media/images/invader.png"); invaderImage = convertImage(tmpimage); tmpimage = IMG_Load("media/images/explotion.png"); explotionImage = convertImage(tmpimage); tmpimage = IMG_Load("media/images/projetile.png"); projetileImage = convertImage(tmpimage); SDL_FreeSurface(tmpimage); //freeing the temp image.. }

Har försökt med alla möjliga varianter med * och & och inget värkar fungera..
detta är den lösningen som har gett mig minst fel..

Makefile om det kan vara till hjälp:

CXX=g++ BINARY=bin/invaders CXXFLAGS=-W -Wall -o0 -g SDLFLAGS=`sdl-config --cflags --libs` default: obj/main.o obj/SDLWrapper.o obj/gameLogic.o obj/gameObjects.a $(CXX) $(CXXFLAGS) $(SDLFLAGS) $^ -o $(BINARY) touch default ############# CREATING OBJECT FILES #### obj/main.o: $(CXX) $(CXXFLAGS) $(SDLFLAGS) -c src/main.cpp -o obj/main.o obj/SDLWrapper.o: $(CXX) $(CXXFLAGS) $(SDLFLAGS) -c src/SDLWrapper.cpp -o obj/SDLWrapper.o obj/gameLogic.o: $(CXX) $(CXXFLAGS) $(SDLFLAGS) -c src/gameLogic.cpp -o obj/gameLogic.o ## need to create an archive... stupid shit.. obj/gameObjects.a: obj/gameObjects.o obj/gameObjectProjectile.o \ obj/gameObjectPlayer.o obj/gameObjectInvader.o ar rs obj/gameObjects.a $^ ## Files to create archive. obj/gameObjects.o: src/gameObjects.cpp $(CXX) $(CXXFLAGS) $(SDLFLAGS) -c $^ -o $@ obj/gameObjectProjectile.o: src/gameObjectProjectile.cpp $(CXX) $(CXXFLAGS) $(SDLFLAGS) -c $^ -o $@ obj/gameObjectPlayer.o: src/gameObjectPlayer.cpp $(CXX) $(CXXFLAGS) $(SDLFLAGS) -c $^ -o $@ obj/gameObjectInvader.o: src/gameObjectInvader.cpp $(CXX) $(CXXFLAGS) $(SDLFLAGS) -c $^ -o $@ ############# TEST STUFF AND CLEANING #### test: echo $(CXX) $(CXXFLAGS) $(SDLFLAGS) -o $(BINARY) $(OBJECTFILES) .PHONY: clean clean: rm obj/*.o rm default rm $(BINARY)

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix

Permalänk

I h-filen, lägg till en *

class SDLWrapper{ public: SDLWrapper(); ~SDLWrapper(); //converts image to correct bitdepth SDL_Surface* convertImage(SDL_Surface inSurf); //The mainLoop where the game will run.. void mainLoop(); private: SDL_Surface* screen;

Permalänk

Ändra raden

colorWhite = {255,255,255};

till

colorWhite.r = 255; colorWhite.g = 255; colorWhite.b = 255;

Permalänk
Medlem

Jag ser en skillnad i:
SDL_Surface convertImage(SDL_Surface inSurf);
och:
SDL_Surface* SDLWrapper::convertImage(SDL_Surface inSurf){

Ett tips är att läsa noggrant vad som sägs, allt är väldigt tydligt.

Edit; Någon annan han före

Visa signatur

Cat funeral! Cat funeral!
>>> 112383 <<<

Permalänk
Medlem

$ make g++ -W -Wall -o0 -g `sdl-config --cflags --libs` -c src/SDLWrapper.cpp -o obj/SDLWrapper.o src/SDLWrapper.cpp: In member function ‘SDL_Surface* SDLWrapper::convertImage(SDL_Surface)’: src/SDLWrapper.cpp:23:16: error: no match for ‘operator!=’ in ‘inSurf != 0l’ src/SDLWrapper.cpp:24:39: error: cannot convert ‘SDL_Surface’ to ‘SDL_Surface*’ for argument ‘1’ to ‘SDL_Surface* SDL_DisplayFormat(SDL_Surface*)’ src/SDLWrapper.cpp:31:10: error: cannot convert ‘SDL_Surface’ to ‘SDL_Surface*’ in return src/SDLWrapper.cpp: In constructor ‘SDLWrapper::SDLWrapper()’: src/SDLWrapper.cpp:52:48: error: no match for ‘operator=’ in ‘tmpimage = IMG_Load(((const char*)"media/images/player.png"))’ /usr/include/SDL/SDL_video.h:96:28: note: candidate is: SDL_Surface& SDL_Surface::operator=(const SDL_Surface&) src/SDLWrapper.cpp:55:49: error: no match for ‘operator=’ in ‘tmpimage = IMG_Load(((const char*)"media/images/invader.png"))’ /usr/include/SDL/SDL_video.h:96:28: note: candidate is: SDL_Surface& SDL_Surface::operator=(const SDL_Surface&) src/SDLWrapper.cpp:58:51: error: no match for ‘operator=’ in ‘tmpimage = IMG_Load(((const char*)"media/images/explotion.png"))’ /usr/include/SDL/SDL_video.h:96:28: note: candidate is: SDL_Surface& SDL_Surface::operator=(const SDL_Surface&) src/SDLWrapper.cpp:61:51: error: no match for ‘operator=’ in ‘tmpimage = IMG_Load(((const char*)"media/images/projetile.png"))’ /usr/include/SDL/SDL_video.h:96:28: note: candidate is: SDL_Surface& SDL_Surface::operator=(const SDL_Surface&) src/SDLWrapper.cpp: In member function ‘SDL_Surface* SDLWrapper::convertImage(SDL_Surface)’: src/SDLWrapper.cpp:32:1: warning: control reaches end of non-void function make: *** [obj/SDLWrapper.o] Fel 1

mer problem... eller?

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix

Permalänk
Medlem

inSurf lär väll vara pekare (eller ev referens) också, onödig variabelkopiering annars...
Edit: pekare enligt koden ovan...

Permalänk
Medlem

EDIT:

hadde skrivirt fel...

$ make g++ -W -Wall -o0 -g `sdl-config --cflags --libs` -c src/SDLWrapper.cpp -o obj/SDLWrapper.o src/SDLWrapper.cpp: In member function ‘SDL_Surface* SDLWrapper::convertImage(SDL_Surface&)’: src/SDLWrapper.cpp:23:16: error: no match for ‘operator!=’ in ‘inSurf != 0l’ src/SDLWrapper.cpp:24:39: error: cannot convert ‘SDL_Surface’ to ‘SDL_Surface*’ for argument ‘1’ to ‘SDL_Surface* SDL_DisplayFormat(SDL_Surface*)’ src/SDLWrapper.cpp: In constructor ‘SDLWrapper::SDLWrapper()’: src/SDLWrapper.cpp:50:16: error: ‘tmpimage’ declared as reference but not initialized src/SDLWrapper.cpp:52:48: error: no match for ‘operator=’ in ‘tmpimage = IMG_Load(((const char*)"media/images/player.png"))’ /usr/include/SDL/SDL_video.h:96:28: note: candidate is: SDL_Surface& SDL_Surface::operator=(const SDL_Surface&) src/SDLWrapper.cpp:55:49: error: no match for ‘operator=’ in ‘tmpimage = IMG_Load(((const char*)"media/images/invader.png"))’ /usr/include/SDL/SDL_video.h:96:28: note: candidate is: SDL_Surface& SDL_Surface::operator=(const SDL_Surface&) src/SDLWrapper.cpp:58:51: error: no match for ‘operator=’ in ‘tmpimage = IMG_Load(((const char*)"media/images/explotion.png"))’ /usr/include/SDL/SDL_video.h:96:28: note: candidate is: SDL_Surface& SDL_Surface::operator=(const SDL_Surface&) src/SDLWrapper.cpp:61:51: error: no match for ‘operator=’ in ‘tmpimage = IMG_Load(((const char*)"media/images/projetile.png"))’ /usr/include/SDL/SDL_video.h:96:28: note: candidate is: SDL_Surface& SDL_Surface::operator=(const SDL_Surface&) src/SDLWrapper.cpp:64:27: error: cannot convert ‘SDL_Surface’ to ‘SDL_Surface*’ for argument ‘1’ to ‘void SDL_FreeSurface(SDL_Surface*)’ make: *** [obj/SDLWrapper.o] Fel 1

SDLWrapper.cpp:

SDLWrapper::SDLWrapper(){ //Constructor for class... //Itit some stuff... SDL_Init(SDL_INIT_EVERYTHING); TTF_Init(); font = TTF_OpenFont("media/fonts/ubuntu-font-family/UbuntuMono-B.ttf", 24); screen = SDL_SetVideoMode(640, 480, 8, SDL_HWSURFACE | SDL_DOUBLEBUF); colorWhite.r =255; colorWhite.b =255; colorWhite.g =255; textScore = TTF_RenderText_Solid(font, "Score: 0", colorWhite); SDL_Surface& tmpimage; //somewhare te store the images temorarely.. tmpimage = IMG_Load("media/images/player.png"); playerImage = convertImage(tmpimage); tmpimage = IMG_Load("media/images/invader.png"); invaderImage = convertImage(tmpimage); tmpimage = IMG_Load("media/images/explotion.png"); explotionImage = convertImage(tmpimage); tmpimage = IMG_Load("media/images/projetile.png"); projetileImage = convertImage(tmpimage); SDL_FreeSurface(tmpimage); //freeing the temp image.. }

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix

Permalänk
Medlem

Det bör nog vara:

SDL_Surface* SDLWrapper::convertImage(SDL_Surface *inSurf)

Om man skriver != så betyder det "inte lika med", dvs kanelbulle != kaka. Den finns inte för just det som används, om du har rätt typ på variabeln kanske det fungerar.
Får man fråga vad eller varför du ger dig in på detta?

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Det bör nog vara:

SDL_Surface* SDLWrapper::convertImage(SDL_Surface *inSurf)

Om man skriver != så betyder det "inte lika med", dvs kanelbulle != kaka. Den finns inte för just det som används, om du har rätt typ på variabeln kanske det fungerar.
Får man fråga vad eller varför du ger dig in på detta?

är en uppgift.... skall skriva ett spel...

att vänta tills nästa föreläsning kan jag inte göra... redan så ont om tid...

en annan fräga är varför man lär ut C++ (som första språk) när det gång på gång visat sig vara extremt dåligt att lära ut med.
Python, haskel och -ådana språk är bättre att lära ut... enligt statistiken.

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix

Permalänk
Medlem

Denna rad:

SDL_Surface& tmpimage;

Bör vara:

SDL_Surface *tmpimage;

Permalänk
Medlem

EDIT:
glömde spara...
(för van vid vim...)

$ make g++ -W -Wall -o0 -g `sdl-config --cflags --libs` -c src/SDLWrapper.cpp -o obj/SDLWrapper.o g++ -W -Wall -o0 -g `sdl-config --cflags --libs` -c src/gameLogic.cpp -o obj/gameLogic.o g++ -W -Wall -o0 -g `sdl-config --cflags --libs` -c src/gameObjects.cpp -o obj/gameObjects.o g++ -W -Wall -o0 -g `sdl-config --cflags --libs` -c src/gameObjectProjectile.cpp -o obj/gameObjectProjectile.o g++ -W -Wall -o0 -g `sdl-config --cflags --libs` -c src/gameObjectPlayer.cpp -o obj/gameObjectPlayer.o g++ -W -Wall -o0 -g `sdl-config --cflags --libs` -c src/gameObjectInvader.cpp -o obj/gameObjectInvader.o ar rs obj/gameObjects.a obj/gameObjects.o obj/gameObjectProjectile.o obj/gameObjectPlayer.o obj/gameObjectInvader.o g++ -W -Wall -o0 -g `sdl-config --cflags --libs` obj/main.o obj/SDLWrapper.o obj/gameLogic.o obj/gameObjects.a -o bin/invaders obj/main.o: In function `main': /home/gego/svn/invaders-sdl/src/main.cpp:22: undefined reference to `SDLWrapper::mainLoop()' /home/gego/svn/invaders-sdl/src/main.cpp:20: undefined reference to `SDLWrapper::~SDLWrapper()' /home/gego/svn/invaders-sdl/src/main.cpp:20: undefined reference to `SDLWrapper::~SDLWrapper()' obj/SDLWrapper.o: In function `SDLWrapper': /home/gego/svn/invaders-sdl/src/SDLWrapper.cpp:38: undefined reference to `TTF_Init' /home/gego/svn/invaders-sdl/src/SDLWrapper.cpp:40: undefined reference to `TTF_OpenFont' /home/gego/svn/invaders-sdl/src/SDLWrapper.cpp:48: undefined reference to `TTF_RenderText_Solid' /home/gego/svn/invaders-sdl/src/SDLWrapper.cpp:52: undefined reference to `IMG_Load' /home/gego/svn/invaders-sdl/src/SDLWrapper.cpp:55: undefined reference to `IMG_Load' /home/gego/svn/invaders-sdl/src/SDLWrapper.cpp:58: undefined reference to `IMG_Load' /home/gego/svn/invaders-sdl/src/SDLWrapper.cpp:61: undefined reference to `IMG_Load' collect2: ld returned 1 exit status make: *** [default] Fel 1

så det värkar fungera nu?

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix

Permalänk
Medlem

Edit, glöm detta nedan, var innan du uppdaterade
Har du:

SDL_Surface* convertImage(SDL_Surface *inSurf);

i h-filen?
Samt:

SDL_Surface* SDLWrapper::convertImage(SDL_Surface *inSurf)

i cpp-filen?

Permalänk
Medlem

Det verkar som du inte skrivit nån mainloop (mainLoop()) eller destruktor (~SDLWrapper()), stämmer det?

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Det verkar som du inte skrivit nån mainloop (mainLoop()) eller destruktor (~SDLWrapper()), stämmer det?

Stämmer mycket väl.
Skall börja nu...

Koden till mainLoop är den lättaste bara en gigantisk while-loop

hela hälgen förstörd? neee... blit ändå mycket sittande framför datorn...

Desutom glömde jag -lSDL_image -lSDL_ttf som g++ flagga..

Visa signatur

@gegoxaren på identi.ca
min personliga Blag ^_^
#python #cSharp #php #sqlite #freetard #loonix

Permalänk
Medlem
Skrivet av Gego:

hela hälgen förstörd? neee... blit ändå mycket sittande framför datorn...

Sitter själv med ett c++ (SDL) projekt och rapport sedan kl9:00 som är närmare två år nu, ska in på fredag. Men men, så ser helgerna ut ganska ofta