/**XtreamRacing - Main file - Leo |
\---------------------------------/
/An XtreamLua.com Project\
###################################
*/
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <libge/libge.h>
#include <ctype.h>
#include <math.h>
//u32 geImagePixel(int x, int y, ge_Image* img) pour la couleur d'un pixel. Et pour comparer tu fais if(geIma..xel(..) == RGBA(rouge, vert, bleu, alpha)
#define setXY pspDebugScreenSetXY
#define printf pspDebugScreenPrintf
#define square(x) ((x) * (x))//Macro pour le carre
#define VITESSE_MAX -6 //Vitesse Maximum d'un vaisseau
#define VITESSE_MAX_ARR 4 //Vitesse Maximum d'un vaisseau en marche arriere
#define S_PAD 60 //Intervalle autour de 0 ou le pad n'est pas prit en compte (Pour gerer la defaillance du materiel, qui ne se remmet jamais a 0;0 tout seul)
PSP_MODULE_INFO("LibGE Sample", PSP_MODULE_USER, 0, 1);
PSP_HEAP_SIZE_KB(2048);
//-------------------Prototypes des fonctions-------------------
typedef struct //Structure Point, on en a besoin dans les fonctions, donc on le defnit avant la boucle
{
float x, y;
float vitesse;
} Point;
float GetDegrees(double radian);
void MoveTo( Point *Depart, Point Direction);
void PrintSplash();
//-------------------Fonction Main-------------------
int main(int args, char** argc)
{
pspDebugScreenInit();//Initialise le pspDebug
geInit();//Initialise la LibGE
SceCtrlData pad;
PrintSplash();//On affiche le splash
printf("Please wait : Loading data");
int i,j;
char Path[20];
ge_Image *ImgFond[2][3];
for (i = 0; i < 2; ++i)
{
for (j = 0; j < 3; ++j)
{
sprintf(Path,"./fond%d%d.png",i,j);
ImgFond[i][j] = geLoadImage(Path);
geSwizzle (ImgFond[i][j]);
}
}
ge_Image *ImgVaisseau = geLoadImage("./vaisseau.png");
geSwizzle(ImgVaisseau);
typedef struct
{
Point position;
float angle;
} Vaisseau;
Vaisseau Joueur1;
Point Direction;
Point Fond;
Joueur1.position.x = 240, Joueur1.position.y = 136; Joueur1.position.vitesse = 0;
Fond.x = -343, Fond.y = -337;
Direction.x = 60, Direction.y = 60;
Fond.vitesse = 0;
Joueur1.angle = 90;
u32 ColorTest = geGetDrawBuffer()[(int)Joueur1.position.x+(int)Joueur1.position.y*512];//Premiere initialisation
while(1)
{
sceCtrlReadBufferPositive(&pad, 1);
geClearScreen();
/*Debut de controle de touches*/
//NB: Les quatres conditions suivantes retournent des vitesses invers?es, car elles servent a l'affichage du fond
if((pad.Buttons & PSP_CTRL_CROSS) && (Fond.vitesse > VITESSE_MAX))//Accelerer
{
Fond.vitesse -= 0.5;
}
else if (Fond.vitesse < 0)//Ralentissement si on relache la touche (On va vers l'arret)
{
Fond.vitesse += 0.5;
}
if((pad.Buttons & PSP_CTRL_SQUARE) && (Fond.vitesse < VITESSE_MAX_ARR))//Marche arriere
{
Fond.vitesse += 0.5;
}
else if (Fond.vitesse > 0)//Ralentissement si on relache la touche (On va vers l'arret)
{
Fond.vitesse -= 0.5;
}
/*Debut du blocage en cas de collision*/
if (ColorTest == RGBA(255,95,95,0))
{
Fond.vitesse = 40;
MoveTo(&Fond, Direction);
Fond.vitesse = 0;
}
/*fin du blocage en cas de collision*/
if ((pad.Lx - 128 > S_PAD) || (pad.Ly - 128 > S_PAD) || (pad.Lx - 128 < -S_PAD)||(pad.Ly - 128 < -S_PAD))//Sensibilit? du pad
{
Direction.x = pad.Lx - 128;//Si le pad bouge suffisament, Direction prend sa valeur -128
Direction.y = pad.Ly - 128;//(On a ainsi Direction comprit dans [-127;-S_PAD]U[S_PAD;128])
}
/*Fin de controle de touches*/
//Rajout du scrolling de Fond
MoveTo( &Fond, Direction);
Joueur1.angle = GetDegrees(acos((Direction.x * 1)/127));//Servira lorsque la fonction rotated sera fonctionnelle
{//On isole cette partie pour que w et z ne soient utilisables qu'a l'interieur (prends moins de place en memoire ^^)
int h,w;//Pour l'affichage, i et j sont declar?s plus haut
for (i = 0, h = 0; i < 2; ++i,h = h + 512)//Eh oui, on peut mettre plusieurs variables a incrementer dans un for (en les separant par des virgule)
{
for (j = 0, w = 0; j < 3; ++j, w = w + 512)
{
geBlitImage( (int)Fond.x + w, (int)Fond.y + h, ImgFond[i][j], 0, 0, ImgFond[i][j]->width, ImgFond[i][j]->height, 1);//Haut/gauche
}
}
}
ColorTest = geGetDrawBuffer()[(int)Joueur1.position.x+(int)Joueur1.position.y*512];
geBlitImage( (int)Joueur1.position.x-10 , (int)Joueur1.position.y-10 , ImgVaisseau, 0, 0, ImgVaisseau->width, ImgVaisseau->height, true);
setXY(1,1);
printf("%d/fps", geFps());
geSwapBuffers();//On swap les buffers
}
}
//-------------------Declaration des fonctions-------------------
float GetDegrees(double radian)
{
return 180 * radian / M_PI;//Relation entre les radians et les degr?s
}
void MoveTo( Point *Depart, Point Direction)
{
if ((Direction.x >= 0)&&(Direction.y >= 0)) // |?
{
//On doit incrementer les x et les y
if (Direction.x >= Direction.y)
{
Depart->x += Depart->vitesse;
Depart->y += (Direction.y /Direction.x)*Depart->vitesse;
}
else
{
Depart->x += (Direction.x/Direction.y)*Depart->vitesse;
Depart->y += Depart->vitesse;
}
}
else if ((Direction.x < 0)&&(Direction.y < 0))// _|
{
//On doit decrementer les x et les y
if (Direction.x <= Direction.y)
{
Depart->x -= Depart->vitesse;
Depart->y -= (Direction.y / Direction.x)*Depart->vitesse;//La fraction de deux nombres negatifs est positive, donc on soustrait
}
else
{
Depart->x -= (Direction.x / Direction.y)*Depart->vitesse;//La fraction de deux nombres negatifs est positive, donc on soustrait
Depart->y -= Depart->vitesse;
}
}
else if ((Direction.x >= 0)&&(Direction.y < 0))// |_
{
//On doit incrementer les x, et decrementer les y
if (Direction.x >= abs(Direction.y))//On utilise la valeur absolue pour ne pas tenir compte du signe de y
{
Depart->x += Depart->vitesse;//la vitesse est positive, donc on additionne
Depart->y += (Direction.y /Direction.x)*Depart->vitesse;//La fraction est negative, donc on additione
}
else
{
Depart->x -= (Direction.x/Direction.y)*Depart->vitesse;//La fraction est negative, donc on soustrait
Depart->y -= Depart->vitesse;//la vitesse est positive, donc on soustrait
}
}
else if ((Direction.x < 0)&&(Direction.y >= 0))// ?|
{
//On doit decrementer les x, et incrementer les y
if (abs(Direction.x) >= Direction.y)//On utilise la valeur absolue pour ne pas tenir compte du signe de x
{
Depart->x -= Depart->vitesse;
Depart->y -= (Direction.y /Direction.x)*Depart->vitesse;//La fraction est negative, donc on soustrait
}
else
{
Depart->x += (Direction.x/Direction.y)*Depart->vitesse;//La fraction est negative, donc on additionne
Depart->y += Depart->vitesse;
}
}
}
void PrintSplash()
{
printf("Loading...\n");
int i;
ge_Font* Police = geLoadFont("./space_age.ttf");
printf("Done!\n Printing...");
for (i = 272; i >= 170; i--)
{
geClearScreen();
geFontSize(Police, 40);
geFontPrintScreen(30, 68, Police, "xtremLua.com", RGB(255,255,255));
geFontSize(Police, 20);
geFontPrintScreen(120, i, Police, "La communauté" , RGB(255,255,255));
geFontPrintScreen(170, i + 20, Police, "amicale", RGB(255,255,255));
geFontPrintScreen(96, i + 40, Police, "de developpement!", RGB(255,255,255));
geSwapBuffers();//On swap les buffers
}
printf("Avant");
sceKernelDelayThread(4000);//Pause avant de lancer le jeu
printf("Apres");
geFreeFont( Police);
printf("Done!\n");
}