View Full Version : [C] SDL, ho iniziato :D
Ciao a tutti, ho iniziato con SDL!!!
Il problema é che quando compilo il mio primo e semplicissimo programma mi da tutti questi errori:
[Linker error] undefined reference to `SDL_Quit'
[Linker error] undefined reference to `SDL_Init'
[Linker error] undefined reference to `SDL_Quit'
ecc...
Sbaglio qualcosa? La libreria l'ho scaricata e come compilatore uso Dev-C++ 4.9.9.2
non é un opzione di compilatore che dvo cambiare???
Perché su allegro se non mettevo un "opzione di compilatore" non funzionava
Sì...devi aggiungere libSDL.a e/o libSDLmain.a alle librerie che vengono linkate al tuo programma...
Sì...devi aggiungere libSDL.a e/o libSDLmain.a alle librerie che vengono linkate al tuo programma...
Mi esce
\Dev-Cpp\ianaz10\ianaz 1.0.cpp C:\Dev-Cpp\ianaz10\C libSDL.a: No such file or directory.
\Dev-Cpp\ianaz10\ianaz 1.0.cpp C:\Dev-Cpp\ianaz10\C libSDLmain.a: No such file or directory.
GordonFreeman
07-10-2005, 16:55
Ciao a tutti, ho iniziato con SDL!!!
Il problema é che quando compilo il mio primo e semplicissimo programma mi da tutti questi errori:
Sbaglio qualcosa? La libreria l'ho scaricata e come compilatore uso Dev-C++ 4.9.9.2
SDL,cioè Software Development Library...e per che cosa?
SDL,cioè Software Development Library...e per che cosa?
Simple Directmedia Layer
ianaz: compilatore e ambiente di sviluppo ?
ianaz: compilatore e ambiente di sviluppo ?
Dev-Cpp 4.9.9.2
Anche io ci sto provando con le sdl, lavoro con il dev c++ 4.9.9.1, devo lavorare con codice c e non c++ causa specifiche di progetto e volevo sapere senza stare ad aprire un altro 3d se posso lavorare tranquillamente in c con sdl.
Per ora mi insulta quando includo SDL.h dicendomi "In file included from main.c".
-Ivan-: sì, funziona anche con il C...
Mi esce
Progetto, Opzione del progetto, Parametri:
In Compilatore ci deve essere:
-I"<INCLUDE>\SDL" -Dmain=SDL_main
In linker ci deve essere:
-lmingw32 -lSDLmain -lSDL -liberty
-Ivan-: sì, funziona anche con il C...
Progetto, Opzione del progetto, Parametri:
In Compilatore ci deve essere:
-I"<INCLUDE>\SDL" -Dmain=SDL_main
In linker ci deve essere:
-lmingw32 -lSDLmain -lSDL -liberty
Mi da l'errore più assurdo del mondo, cannot open output file permission denied. :eek:
Qua tutti i tutorial parlano di c++ non è che in c funziona diversamente?
-Ivan-: sì, funziona anche con il C...
Progetto, Opzione del progetto, Parametri:
In Compilatore ci deve essere:
-I"<INCLUDE>\SDL" -Dmain=SDL_main
In linker ci deve essere:
-lmingw32 -lSDLmain -lSDL -liberty
Scusa la niubbaggine...ma cos'é sto linker???
Un altra cosa:
come fai a sapere per ogni libreria le opzioni di compilazione?
Ho ricreato il progetto che quello vecchio mi si era un po' incasinato, ora senza codice nel main quando includo la libreria sdl mi da linker error, undefinied reference to 'WinMain@16'.
Sapete cosa vuol dire?
Ho ricreato il progetto che quello vecchio mi si era un po' incasinato, ora senza codice nel main quando includo la libreria sdl mi da linker error, undefinied reference to 'WinMain@16'.
Sapete cosa vuol dire? non hai messo la WinMain :D
questo è il prototipo:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nShowCmd);
la devi mettere al posto della classica main del C.
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nShowCmd)
{
getch();
return 0;
}
Quindi il programma dovrebbe apparire così?
Mi da 2 parse error adesso :ops:
Ho provato a incollare alcuni degli esempi su http://www.libsdl.org/intro.it/usinginit.html e non funzionano, ognuno mi da una marea di errori, non riesco a capire.
hai scordato di includere windows.h
hai scordato di includere windows.h
non lo dire troppo in giro ma ti voglio bene :D
come fai a sapere per ogni libreria le opzioni di compilazione?
Per il linker -lnomedellalibreria da linkare all'eseguibile...
Il linker è quel programma che, per farla breve, mette insieme i vari file oggetto risultanti della compilazione e le librerie al fine di ottenere un eseguibile...
Scusate se approfitto di voi ma le sdl non hanno già una funzione per disegnare una linea?
Quello che devo fare io è molto semplice, devo disegnare un percorso sullo schermo fatto esclusivamente di rette con qualche scritta sopra.
Mi sembra strano dover implementare 200 righe di codice come negli esempi che sto usando solo per fare una funzione che disegni delle rette.
Ricordo che quando usavo il tc c'erano funzioni molto semplici.
DanieleC88
09-10-2005, 09:44
Non credo ci sia, SDL non è orientata alla grafica semplice, ma all'utilizzo su più piattaforme e con più linguaggi.
Mi sai dire se il c ha librerie per fare grafica molto scarna tipo rette e quadrati?
DanieleC88
09-10-2005, 12:53
Forse per quello che a te serve è più indicata Allegro. Io però con giochi scritti in Allegro ho avuto problemi su Linux (vanno lenti).
Solitamente in un gioco 2D si opera con sprite...cioè immagini codificate nel codice tramite un vettore o caricate esternamente... E' sono pochi i casi in cui in un gioco 2D si vada a disegnare una sola linea (ad esempio mi viene in mente un proiettile, ma in tal caso sono pochi pixel e si disegnano direttamente pixel per pixel)...anche se comunque è realizzabile tramite la possibilità di accendere un pixel alla volta... Comunque per fare una linea è semplicissimo, basta applicare la funzione di una retta a partire da una coordinate di un'asse fino alla seconda coordinata)...
Ad esempio se si vuole diegnare una retta da (0,50) a (100, 400) basta calcolarsi la retta che passa per i due punti...
La funzione per determinare la retta che passa per due punti è (fai il calcolo con i double):
m = (y2 - y1) / (x2 - x1)
y = m*x + (y1 - m*x1)
Scorrendo con un for tutti i valori di X da x1 a x2 puoi ottenere tutti le coordinate dei punti da disegnare...
Una domanda (ora sono fermo su allegro, però credo che sia lo stesso principio):
Se inserisco un immagine e poi la faccio muovere mi lascia tutta la scia, in pratica se faccio una pallina bianca e la faccio muovere nello schermo posso colorare lo schermo di bianco.
Come devo fare???
DanieleC88
10-10-2005, 16:43
Una domanda (ora sono fermo su allegro, però credo che sia lo stesso principio):
Se inserisco un immagine e poi la faccio muovere mi lascia tutta la scia, in pratica se faccio una pallina bianca e la faccio muovere nello schermo posso colorare lo schermo di bianco.
Come devo fare???
Devi prima cancellare lo schermo (o solo l'area interessata dalla pallina).
Io uso Dev-C++ e ho messo le librerie SDL, ho fatto tutto come dite voi... ma quando vado a compilare mi appare questa scritta:
C:\****\progetto111\Makefile.win [Build Error] [GAME_ONE.exe] Error 1
Cosa dovrei fare?
P.S. i vari **** li ho messi per abbreviare...
DanieleC88
10-04-2008, 14:13
C:\****\progetto111\Makefile.win [Build Error] [GAME_ONE.exe] Error 1
Invece del Dev-C++ prova wxDev-C++ (http://wxdsgn.sourceforge.net/) o Code::Blocks (http://www.codeblocks.org/).
Comunque, sicuro ti dia soltanto quell'errore? Controlla bene tutti i messaggi, in quel modo non si capisce molto a cosa sia dovuto. Forse un problema nel linking, ma senza altri messaggi è difficile dirlo. :)
m.distrutti
10-04-2008, 15:01
uhm ma a questo punto perche non usare java per un 2D multi-piattaforma?:D
DanieleC88
10-04-2008, 15:10
uhm ma a questo punto perche non usare java per un 2D multi-piattaforma?:D
E infatti... http://www.hwupgrade.it/forum/forumdisplay.php?f=112 :D
Inizialmente mi diceva questo:
[Linker error] undefined reference to `__cpu_features_init'
ld returned 1 exit status
C:\****\Makefile.win [Build Error] [GAME_ONE.exe] Error 1
Guarda questo è il codice:
file #1: GAME.h
void Inizializza_engine(int risoluzione_x, int risoluzione_y, int colori, int modalita);
void posiziona (SDL_Surface *immagine, int pos_x, int pos_y);
void posiziona(SDL_Surface *immagine, int pos_x, int pos_y, int frames[5], int n_fotogrammi);
void trasparenza(SDL_Surface *immagine, int rosso, int verde, int blu);
void aggiorna();
void cancella();
void finalizza();
void libera_memoria(SDL_Surface *immagine);
file#2: GAME2.h
#include <iostream>
#include <stdlib.h>
#include <sdl\SDL.h>
#include "GAME.h"
SDL_Surface *screen;
void Inizializza_engine(int risoluzione_x, int risoluzione_y, int colori, int modalita){
if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)<0){
printf("Errore nell'inizializzazione dell'engine: %*s\n", SDL_GetError());
exit(1);
}
if(modalita==0)
screen=SDL_SetVideoMode(risoluzione_x, risoluzione_y, colori, SDL_HWSURFACE | SDL_DOUBLEBUF);
if(modalita==1)
screen=SDL_SetVideoMode(risoluzione_x, risoluzione_y, colori, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
}
void posiziona(SDL_Surface *immagine, int pos_x, int pos_y)
{
SDL_Rect destinazione;
destinazione.x=pos_x;
destinazione.y=pos_y;
SDL_BlitSurface(immagine, NULL, screen, &destinazione);
}
void posiziona(SDL_Surface *immagine, int pos_x, int pos_y, int frames[5], int n_fotogrammi){
if(n_fotogrammi>frames[4])n_fotogrammi=0;
SDL_Rect destinazione;
destinazione.x=pos_x;
destinazione.y=pos_y;
SDL_Rect fotogramma;
fotogramma.x= frames[0] + frames[2]*n_fotogrammi;
fotogramma.y= frames[1];
fotogramma.w= frames[2];
fotogramma.h= frames[3];
SDL_BlitSurface(immagine, &fotogramma, screen, &destinazione);
}
void trasparenza(SDL_Surface *immagine, int rosso, int verde, int blu){
Uint32 colore_trasparente = SDL_MapRGB(immagine->format, rosso, verde, blu);
SDL_SetColorKey(immagine, SDL_SRCCOLORKEY|SDL_RLEACCEL, colore_trasparente);
}
void aggiorna(){
SDL_Flip(screen);
}
void cancella(){
SDL_FillRect(screen, 0, 0);
}
void finalizza(){
SDL_Quit();
}
file #3: main.cpp
#include <iostream>
#include <stdlib.h>
#include <sdl\SDL.h>
#include <windows.h>
#include "GAME2.h"
using namespace std;
int risoluzione_x=640;
int risoluzione_y=480;
int bit_colori=32;
int modalita=0; // 0= modalità finestra // 1= modalità schermo intero
SDL_Surface *sfondo;
int main(int argc, char *argv[]){
Inizializza_engine(risoluzione_x, risoluzione_y, bit_colori, modalita);
sfondo=SDL_LoadBMP("sfondo.bmp");
while (GetAsyncKeyState(VK_ESCAPE)==0){
cancella();
posiziona(sfondo, 0, 0);
aggiorna();
}
finalizza();
return 0;
}
DanieleC88
10-04-2008, 18:59
Oddio non mettere del codice dentro un header! È terribile! :D
Fai un file .c separato, è la cosa migliore, nell'header infilaci solo i prototipi e le dichiarazioni.
Comunque sì, è un errore di linking, prova a reinstallare Dev-C++ o a sostituirlo con uno degli IDE che ti ho consigliato. Potrebbe essere solo colpa di un MinGW troppo vecchio. ;)
Ho installato Code::Blocks 8.02, le librerie SDL non ci sono giusto? Come le metto?:mc:
DanieleC88
11-04-2008, 12:13
No, non sono parte dell'IDE e quindi non sono integrate con l'installazione... Code::Blocks ti fornisce il template già pronto per il progetto, ma hai bisogno di avere le librerie installate manualmente. Su Linux era questione di secondi, per Windows mi sa che ci vogliono 5 minuti. :D
Qui dovrebbe essere già descritto tutto in dettaglio: http://wiki.codeblocks.org/index.php/Using_SDL_with_Code::Blocks
ciao ;)
Dannato Windows!! :muro: <--nel muro c'è una finestra...
:) :) :(
Ok mi sparo da solo...:banned:
DanieleC88
11-04-2008, 14:58
LOL! :D
Risolto dunque? :)
Magari!!! Vado a compilare e va tutto bene...
faccio partire l'eseguibile e mi appare un errore::read:
Impossibile trovare il punto di ingresso SDL_strlcat della procedura nella libreria di collegamento dinamico SDL.dll.
:confused: :confused: :confused: :confused: :confused: :confused: :confused:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.