Gabs86
11/09/2008, 22:33
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include "SDL/SDL_ttf.h"
// Macro definitions
int alto=480;
int largo=800;
enum direccion{izquierda, derecha, ninguna};
// Structure definitions
struct barraPong{
SDL_Rect area;
int vel;
int aceleracion;
int puntuacion;
} jugador, enemigo;
struct pelota{
SDL_Rect area;
//Vector de direccion
float vectX;
float vectY;
}pelota={50,70,12,12,1,1};
// Function definitions
int colision(SDL_Rect *r1, SDL_Rect *r2){
if(((r1->x+r1->w)>r2->x)&&((r1->y+r1->h)>r2->y)&&((r2->x+r2->w)>r1->x)&&((r2->y+r2->h)>r1->y)){
return 1;
}else{
return 0;
}
}
void moverBarra(barraPong *barra, direccion dir){
int desplazamiento=10;
float rozamiento=0.1;
if(dir==izquierda&&barra->area.x-desplazamiento>0){
if(colision(&pelota.area, &barra->area)){
pelota.vectY= (-pelota.vectY);
pelota.vectX-=(rozamiento*desplazamiento);
if(pelota.vectY<0&&pelota.area.y>430){
pelota.area.y=430;
}else if(pelota.vectY>0&&pelota.area.y<40){
pelota.area.y=40;
}
}
barra->area.x-=desplazamiento;
}else if(dir==derecha&&barra->area.x+barra->area.w+desplazamiento<largo){
if(colision(&pelota.area, &barra->area)){
pelota.vectY= (-pelota.vectY);
pelota.vectX+=(rozamiento*desplazamiento);
if(pelota.vectY<0&&pelota.area.y>430){
pelota.area.y=430;
}else if(pelota.vectY>0&&pelota.area.y<40){
pelota.area.y=40;
}
}
barra->area.x+=desplazamiento;
}else if(colision(&pelota.area, &barra->area)) {
pelota.vectY= (-pelota.vectY);
}
}
void moverEnemigo(barraPong *barra){
int factor=30;
if(pelota.area.y<350&&pelota.vectY<0){
if((pelota.area.x+pelota.area.w)>(enemigo.area.x+enemigo.area.w-factor)){
moverBarra(&enemigo, derecha);
}
if(pelota.area.x<enemigo.area.x+factor){
moverBarra(&enemigo, izquierda);
}
}
}
void iniRect(SDL_Rect &rect,int x, int y, int w, int h){
rect.x=x;
rect.y=y;
rect.w=w;
rect.h=h;
}
void nuevoJuego(){
SDL_Delay(2000);
iniRect(pelota.area,50,70,12,12);
pelota.vectX=1;
pelota.vectY=1;
}
void moverPelota(){
int mult=2;
if(pelota.area.y>alto-10){
enemigo.puntuacion+=1;
nuevoJuego();
}
if(pelota.area.y<10){
jugador.puntuacion+=1;
nuevoJuego();
}
if(pelota.area.x+pelota.area.w+(mult*pelota.vectX)>largo||pelota.area.x+(mult*pelota.vectX)<0){
pelota.vectX=(-pelota.vectX);
}
pelota.area.x=((int)pelota.area.x+(mult*pelota.vec tX));
pelota.area.y=((int)pelota.area.y+(mult*pelota.vec tY));
}
// Main program
int main(int argc, char *argv[])
{
// Declare variables
int done=0;
// Initialise game data
SDL_Surface *screen, *ttext;
Uint8 *keys=SDL_GetKeyState(NULL);
SDL_Rect dest={0,0,largo,alto};
SDL_Event event;
// Parse command-line arguments
// Initialise SDL
if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO<0)){
printf("No se pude iniciar SDL: %s\n", SDL_GetError());
exit(1);
}
screen = SDL_SetVideoMode(largo,alto,24,SDL_HWSURFACE|SDL_D OUBLEBUF);
if(screen==NULL){
printf("No se ha podido iniciar el modo gráfico");
exit(1);
}
if(TTF_Init()<0){
printf("No se ha podido iniciar SDL_ttf: %s\n",SDL_GetError());
exit(1);
}
iniRect(jugador.area,50,445,120,15);
iniRect(enemigo.area,50,25,120,15);
direccion dir;
while(done==0){
// (Re)draw the screen
SDL_FillRect(screen, &dest,SDL_MapRGB(screen->format,0,0,0));
SDL_FillRect(screen, &jugador.area, SDL_MapRGB(screen->format, 255, 255, 255));
SDL_FillRect(screen, &enemigo.area, SDL_MapRGB(screen->format, 255, 255, 255));
SDL_FillRect(screen, &pelota.area, SDL_MapRGB(screen->format, 255,255,255));
TTF_Font *fuente;
fuente=TTF_OpenFont("ariblk.ttf",20);
SDL_Color bgcolor,fgcolor;
fgcolor.r=255;
fgcolor.g=255;
fgcolor.b=255;
SDL_Rect desttext={0,0,largo,alto};
Aquí es donde peta
ttext=TTF_RenderText_Shaded(fuente,"hola",fgcolor,bgcolor);
SDL_BlitSurface(ttext,NULL,screen,&desttext);
SDL_Flip(screen);
if(SDL_PollEvent(&event)){
// Handle events (keyboard input, mainly)
if(event.type==SDL_KEYDOWN){
if(keys[SDLK_ESCAPE]==1){
done=1;
}
if(keys[SDLK_LEFT]==1){
dir=izquierda;
}else if(keys[SDLK_RIGHT]==1){
dir=derecha;
}
}else if(event.type==SDL_KEYUP){
dir=ninguna;
}
// Give the CPU a break
}
moverBarra(&jugador,dir);
moverEnemigo(&enemigo);
moverPelota();
SDL_Delay(10);
}
return 0;
}
Hola! ya tengo mi Pong casi terminado, pero ahora estoy intentando usar la librería SDL_ttf para escribir las puntuaciones por pantalla, pero al usar esas librerías me peta, me da un fallo de segmentación. ¿que es lo que pasa?
#include <stdlib.h>
#include <SDL/SDL.h>
#include "SDL/SDL_ttf.h"
// Macro definitions
int alto=480;
int largo=800;
enum direccion{izquierda, derecha, ninguna};
// Structure definitions
struct barraPong{
SDL_Rect area;
int vel;
int aceleracion;
int puntuacion;
} jugador, enemigo;
struct pelota{
SDL_Rect area;
//Vector de direccion
float vectX;
float vectY;
}pelota={50,70,12,12,1,1};
// Function definitions
int colision(SDL_Rect *r1, SDL_Rect *r2){
if(((r1->x+r1->w)>r2->x)&&((r1->y+r1->h)>r2->y)&&((r2->x+r2->w)>r1->x)&&((r2->y+r2->h)>r1->y)){
return 1;
}else{
return 0;
}
}
void moverBarra(barraPong *barra, direccion dir){
int desplazamiento=10;
float rozamiento=0.1;
if(dir==izquierda&&barra->area.x-desplazamiento>0){
if(colision(&pelota.area, &barra->area)){
pelota.vectY= (-pelota.vectY);
pelota.vectX-=(rozamiento*desplazamiento);
if(pelota.vectY<0&&pelota.area.y>430){
pelota.area.y=430;
}else if(pelota.vectY>0&&pelota.area.y<40){
pelota.area.y=40;
}
}
barra->area.x-=desplazamiento;
}else if(dir==derecha&&barra->area.x+barra->area.w+desplazamiento<largo){
if(colision(&pelota.area, &barra->area)){
pelota.vectY= (-pelota.vectY);
pelota.vectX+=(rozamiento*desplazamiento);
if(pelota.vectY<0&&pelota.area.y>430){
pelota.area.y=430;
}else if(pelota.vectY>0&&pelota.area.y<40){
pelota.area.y=40;
}
}
barra->area.x+=desplazamiento;
}else if(colision(&pelota.area, &barra->area)) {
pelota.vectY= (-pelota.vectY);
}
}
void moverEnemigo(barraPong *barra){
int factor=30;
if(pelota.area.y<350&&pelota.vectY<0){
if((pelota.area.x+pelota.area.w)>(enemigo.area.x+enemigo.area.w-factor)){
moverBarra(&enemigo, derecha);
}
if(pelota.area.x<enemigo.area.x+factor){
moverBarra(&enemigo, izquierda);
}
}
}
void iniRect(SDL_Rect &rect,int x, int y, int w, int h){
rect.x=x;
rect.y=y;
rect.w=w;
rect.h=h;
}
void nuevoJuego(){
SDL_Delay(2000);
iniRect(pelota.area,50,70,12,12);
pelota.vectX=1;
pelota.vectY=1;
}
void moverPelota(){
int mult=2;
if(pelota.area.y>alto-10){
enemigo.puntuacion+=1;
nuevoJuego();
}
if(pelota.area.y<10){
jugador.puntuacion+=1;
nuevoJuego();
}
if(pelota.area.x+pelota.area.w+(mult*pelota.vectX)>largo||pelota.area.x+(mult*pelota.vectX)<0){
pelota.vectX=(-pelota.vectX);
}
pelota.area.x=((int)pelota.area.x+(mult*pelota.vec tX));
pelota.area.y=((int)pelota.area.y+(mult*pelota.vec tY));
}
// Main program
int main(int argc, char *argv[])
{
// Declare variables
int done=0;
// Initialise game data
SDL_Surface *screen, *ttext;
Uint8 *keys=SDL_GetKeyState(NULL);
SDL_Rect dest={0,0,largo,alto};
SDL_Event event;
// Parse command-line arguments
// Initialise SDL
if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO<0)){
printf("No se pude iniciar SDL: %s\n", SDL_GetError());
exit(1);
}
screen = SDL_SetVideoMode(largo,alto,24,SDL_HWSURFACE|SDL_D OUBLEBUF);
if(screen==NULL){
printf("No se ha podido iniciar el modo gráfico");
exit(1);
}
if(TTF_Init()<0){
printf("No se ha podido iniciar SDL_ttf: %s\n",SDL_GetError());
exit(1);
}
iniRect(jugador.area,50,445,120,15);
iniRect(enemigo.area,50,25,120,15);
direccion dir;
while(done==0){
// (Re)draw the screen
SDL_FillRect(screen, &dest,SDL_MapRGB(screen->format,0,0,0));
SDL_FillRect(screen, &jugador.area, SDL_MapRGB(screen->format, 255, 255, 255));
SDL_FillRect(screen, &enemigo.area, SDL_MapRGB(screen->format, 255, 255, 255));
SDL_FillRect(screen, &pelota.area, SDL_MapRGB(screen->format, 255,255,255));
TTF_Font *fuente;
fuente=TTF_OpenFont("ariblk.ttf",20);
SDL_Color bgcolor,fgcolor;
fgcolor.r=255;
fgcolor.g=255;
fgcolor.b=255;
SDL_Rect desttext={0,0,largo,alto};
Aquí es donde peta
ttext=TTF_RenderText_Shaded(fuente,"hola",fgcolor,bgcolor);
SDL_BlitSurface(ttext,NULL,screen,&desttext);
SDL_Flip(screen);
if(SDL_PollEvent(&event)){
// Handle events (keyboard input, mainly)
if(event.type==SDL_KEYDOWN){
if(keys[SDLK_ESCAPE]==1){
done=1;
}
if(keys[SDLK_LEFT]==1){
dir=izquierda;
}else if(keys[SDLK_RIGHT]==1){
dir=derecha;
}
}else if(event.type==SDL_KEYUP){
dir=ninguna;
}
// Give the CPU a break
}
moverBarra(&jugador,dir);
moverEnemigo(&enemigo);
moverPelota();
SDL_Delay(10);
}
return 0;
}
Hola! ya tengo mi Pong casi terminado, pero ahora estoy intentando usar la librería SDL_ttf para escribir las puntuaciones por pantalla, pero al usar esas librerías me peta, me da un fallo de segmentación. ¿que es lo que pasa?