1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| #include <iostream>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <string>
#define _USE_MATH_DEFINES
#include <math.h>
#define LARGEUR_FENETRE 700
#define HAUTEUR_FENETRE 480
#define Nlignes 8
#define Ncolonnes 8
using namespace std;
void ecrire(string texte, string nom_police, SDL_Color couleur, int pos_x, int pos_y, int taille);
int main(int argc, char *argv[]) {
bool continuer = true;
SDL_Surface *fenetre = NULL;
SDL_Event evenement;
SDL_Color couleur_txt = {0, 0, 0};
SDL_Init(SDL_INIT_VIDEO); // Initialisaion de SDL en mode vidéo.
TTF_Init();
fenetre = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_OPENGL); // Création de la fenêtre pour OpenGL.
SDL_WM_SetCaption("Jeu Othello-Reversi", NULL); // Titre de la fenêtre.
glClearColor(0.85, 1, 0.9, 0); // Couleur de fond
glEnable(GL_BLEND); // Permet d'utiliser l'opacité
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Pour l'opacité
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0, LARGEUR_FENETRE, HAUTEUR_FENETRE, 0);
do {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glColor4ub(16, 116, 21, 255);
glVertex2d(40, 40); // Cadre de la grille
glVertex2d(40, 440);
glVertex2d(440, 440);
glVertex2d(440, 40);
glEnd();
glBegin(GL_LINES);
glColor4ub(9, 62, 12, 255);
for (int i = 40; i <= 440; i++) { // Lignes horizontales de la grille
glVertex2d(40, i);
glVertex2d(440, i);
i += 49;
}
for (int i = 40; i <= 440; i++) { // Lignes verticales de la grille
glVertex2d(i, 40);
glVertex2d(i, 440);
i += 49;
}
glEnd();
ecrire("Hello", "verdana.ttf", couleur_txt, 400, 100, 50);
ecrire("Hello !", "verdana.ttf", couleur_txt, 400, 180, 50);
SDL_PollEvent(&evenement); // Gestion des événements
switch (evenement.type) {
case SDL_QUIT:
continuer = false;
break;
}
SDL_GL_SwapBuffers();
} while(continuer);
TTF_Quit();
SDL_FreeSurface(fenetre);
SDL_Quit();
return EXIT_SUCCESS;
}
void ecrire(string texte, string nom_police, SDL_Color couleur, int pos_x, int pos_y, int taille) {
SDL_Rect position;
TTF_Font *police;
police = TTF_OpenFont(nom_police.c_str(), taille);
position.x = pos_x;
position.y = pos_y;
SDL_Surface *message = TTF_RenderText_Blended(police, texte.c_str(), couleur);
GLuint texture = 0;
int largeur_texture, hauteur_texture;
float ratio_largeur, ratio_hauteur;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// Il faut que les dimensions de la texture soient de taille 2^n (32, 64, 128,...).
largeur_texture = (int)(pow(2, ceil(log((float)message->w) / log(2.0))) + 0.5);
hauteur_texture = (int)(pow(2, ceil(log((float)message->h) / log(2.0))) + 0.5);
// On va prolonger les images pour avoir des puissances de 2. Mais ce prolongement sera coloré et n'aura rien à voir avec le texte à afficher. Nous ne devrons donc pas l'insérer dans la texture. On retient donc un ratio pour repérer la séparation entre la fin du texte et le prolongement de la texture.
ratio_largeur = (float)message->w / (float)largeur_texture;
ratio_hauteur = (float)message->h / (float)hauteur_texture;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, largeur_texture, hauteur_texture, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); // Texture aux dimensions 2^n.
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, message->w, message->h, GL_RGBA, GL_UNSIGNED_BYTE, message->pixels); // Insertion du texte dans la texture. Celui-ci ne prend pas forcément toute la place (largeur_texture et hauteur_texture sont >= à message->w et message->h).
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2d(position.x, position.y);
glTexCoord2f(ratio_largeur, 0); glVertex2d(position.x+message->w, position.y);
glTexCoord2f(ratio_largeur, ratio_hauteur); glVertex2d(position.x+message->w, position.y+message->h);
glTexCoord2f(0, ratio_hauteur); glVertex2d(position.x, position.y+message->h);
glEnd();
glDeleteTextures(1, &texture);
SDL_FreeSurface(message);
TTF_CloseFont(police);
} |
Partager