GAME_TOWER/main_И.c

667 lines
18 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <GL/glut.h>
#include <string.h>
#include <GL/gl.h>
#include <GLFW/glfw3.h>
#include <GL/freeglut.h>
#include <locale.h>
#include <pthread.h>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
int k;
int width, height;
#define WIDTH 17
#define HEIGHT 35
struct map_struct{
int itom;
int wall;
} mape[HEIGHT][WIDTH];
struct player_str{
int x;
int y;
} player;
#include "Lavirint_generator.h"
int fd;
struct input_event ev;
float cub[][2] = {
{0,0},
{1,0},
{1,1},
{0,1}
};
float player_matrix[][2] = {
{0.2,0.2},
{0.8,0.2},
{0.8,0.8},
{0.2,0.8}
};
void glTexParam(){
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);// GL_CLAMP
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);// GL_REPEAT
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);// GL_NEAREST
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);// GL_LINEAR
}
unsigned int texsture, texsture_text, texsture_oil, texsture_locator;
void texsture_add(){
int x = 2, y = 2;// y x
struct {unsigned char r,g,b,a;} data[y][x];
memset(data, 0,sizeof(data));
data[1][0].r = 0;
data[1][0].b = 0;
data[1][0].g = 0;
data[0][1].r = 0;
data[0][1].b = 0;
data[0][1].g = 0;
data[0][0].r = 255;
data[0][0].b = 255;
data[0][0].g = 255;
data[1][1].r = 255;
data[1][1].b = 255;
data[1][1].g = 255;
//data = (data *) malloc(sizeof(data));
/*
int b;
for (int i1=0;i1 != 2;i1++){
for (int iaa=i1;iaa < 4;iaa+=2){
for (int ia=i1;ia < 4;ia+=2){
if (i1%2) b = 255;
else b = 0;
data[iaa][ia].r = b;
data[iaa][ia].b = b;
data[iaa][ia].g = b;
}
}
}
*/
glGenTextures(1, &texsture);
glBindTexture(GL_TEXTURE_2D, texsture);
glTexParam();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, x, y,
0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glBindTexture(GL_TEXTURE_2D,0);
//delete &data;
}
GLuint index_SZT[] = {0,1,2, 0,2,3 ,4,5,6, 4,6,7};
float texCoord_2[] = {0,1, 1,1, 1,0, 0,0};
float texCoord_3[] = {0,16, 16,16, 16,0, 0,0};
float rectTex[] = {0,1, 1,1, 1,0, 0,0};
void texsture_text_add(){
//printf("cnt: %i\n", cnt);
//printf("x: %i y: %i\n", x, y);
int x, y, cnt;// y x //TEST_kord.png
{
unsigned char *data = stbi_load("Verdana.png", &x, &y, &cnt, 0);
glGenTextures(1, &texsture_text);
glBindTexture(GL_TEXTURE_2D, texsture_text);
glTexParam();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y,
0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glBindTexture(GL_TEXTURE_2D,0);
}
{
unsigned char *data = stbi_load("oil.png", &x, &y, &cnt, 0);
glGenTextures(1, &texsture_oil);
glBindTexture(GL_TEXTURE_2D, texsture_oil);
glTexParam();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y,
0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glBindTexture(GL_TEXTURE_2D,0);
}
{
unsigned char *data = stbi_load("locator.png", &x, &y, &cnt, 0);
glGenTextures(1, &texsture_locator);
glBindTexture(GL_TEXTURE_2D, texsture_locator);
glTexParam();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y,
0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glBindTexture(GL_TEXTURE_2D,0);
}
}
void eee(){
glLoadIdentity();
//glOrtho(0,1, 0,25/11, -1,1);
glOrtho(-1.0f, 1.0f * width / height, -1.0f, 1.0f * height / width, -1.0f, 1.0f);
//glOrtho(-1.0f * width / height, 1.0f * width / height, -1.0f, 1.0f, -1.0f, 1.0f);
//glOrtho(-1.0f * width / height, -1.0f, 1.0f * width / height, 1.0f, -1.0f, 1.0f);
//glOrtho(-k,k, -1,1, -1,1);
//glTranslatef(float(segment->y)/8-1,float(segment->x)/8-1,0);
//glOrtho(0,1, 0,1, -1,1);
glOrtho(0,HEIGHT, 0,HEIGHT, -1,1);
glTranslatef(2,3,0);
}
void render_figure(int x, int y){
eee();
glTranslatef(x,y,0);
glVertexPointer(2, GL_FLOAT, 0 , &cub);
glEnableClientState(GL_VERTEX_ARRAY);
//glBindTexture(GL_TEXTURE_2D, texsture);
//glTexCoordPointer(2, GL_FLOAT, 0, texCoord_2);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
//glDrawElements(GL_TRIANGLES, 4, GL_UNSIGNED_INT, &index_SZT);
//glBindTexture(GL_TEXTURE_2D,0);
}
void render_player(int x, int y){
eee();
glColor3f(1.0f,0.0f,0.0f);
glTranslatef(x,y,0);
glVertexPointer(2, GL_FLOAT, 0 , &player_matrix);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glColor3f(0.0f,0.0f,0.0f);
}
GLuint index_L[] = {1,2,3, 3,0,1};
void render_light(int x, int y){
eee();
glColor3f(1.0f,1.0f,1.0f);
glTranslatef(x,y,0);
glVertexPointer(2, GL_FLOAT, 0 , &cub);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glColor3f(0.0f,0.0f,0.0f);
}
void render_light_2(int x, int y){
eee();
glColor3f(1.0f,1.0f,1.0f);
glEnable(GL_TEXTURE_2D);
glTranslatef(x,y,1);
glVertexPointer(2, GL_FLOAT, 0 , &cub);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, &index_L);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glBindTexture(GL_TEXTURE_2D,0);
glBindTexture(GL_TEXTURE_2D, texsture);
glTexCoordPointer(2, GL_FLOAT, 0, texCoord_3);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glBindTexture(GL_TEXTURE_2D,0);
glColor3f(0.0f,0.0f,0.0f);
}
void render_oil(int x, int y){
eee();
glEnable(GL_TEXTURE_2D);
glTranslatef(x,y,0);
glColor3f(1.0f,1.0f,1.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0 , &player_matrix);
glBindTexture(GL_TEXTURE_2D, texsture_oil);
glTexCoordPointer(2, GL_FLOAT, 0, texCoord_2);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glBindTexture(GL_TEXTURE_2D,0);
glColor3f(0.0f,0.0f,0.0f);
/*
glColor3f(1.0f,1.0f,1.0f);
glTranslatef(x,y,0);
glVertexPointer(2, GL_FLOAT, 0 , &cub);
glEnableClientState(GL_VERTEX_ARRAY);
glBindTexture(GL_TEXTURE_2D, texsture_oil);
glTexCoordPointer(2, GL_FLOAT, 0, texCoord_2);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glBindTexture(GL_TEXTURE_2D,0);
glColor3f(0.0f,0.0f,0.0f);
*/
}
void render_flash(int x, int y){
eee();
glEnable(GL_TEXTURE_2D);
glTranslatef(x,y,0);
glColor3f(1.0f,1.0f,1.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0 , &cub);
glBindTexture(GL_TEXTURE_2D, texsture_locator);
glTexCoordPointer(2, GL_FLOAT, 0, texCoord_2);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glBindTexture(GL_TEXTURE_2D,0);
glColor3f(0.0f,0.0f,0.0f);
}
void render_ui(){
glLoadIdentity();
//glOrtho(0,1, 0,25/11, -1,1);
glOrtho(-1.0f, 1.0f * width / height, -1.0f, 1.0f * height / width, -1.0f, 1.0f);
//glOrtho(-1.0f * width / height, 1.0f * width / height, -1.0f, 1.0f, -1.0f, 1.0f);
//glOrtho(-1.0f * width / height, -1.0f, 1.0f * width / height, 1.0f, -1.0f, 1.0f);
//glOrtho(-k,k, -1,1, -1,1);
//glTranslatef(float(segment->y)/8-1,float(segment->x)/8-1,0);
//glOrtho(0,1, 0,1, -1,1);
glOrtho(0,HEIGHT, 0,HEIGHT, -1,1);
glTranslatef(2,0,0);
glEnable(GL_TEXTURE_2D);
//glTranslatef(1,1,0);
glColor3f(1.0f,1.0f,1.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0 , &cub);
glBindTexture(GL_TEXTURE_2D, texsture_text);
glTexCoordPointer(2, GL_FLOAT, 0, rectTex);
unsigned char *text = "";
unsigned char qqq = 'ы';
while(*text){
printf("AAA: %i\n", qqq);
static float charSize = 1/16.0;
char c = *text;
int x = c & 0b1111, y = c >> 4;
struct{
float left,rite,top,bottom;
} rct;
rct.left = x * charSize;
rct.rite = rct.left + charSize;
rct.top = y * charSize;
rct.bottom = rct.top + charSize;
rectTex[0] = rectTex[6] = rct.left;
rectTex[2] = rectTex[4] = rct.rite;
rectTex[1] = rectTex[3] = rct.bottom;
rectTex[5] = rectTex[7] = rct.top;
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
text++;
glTranslatef(1,0,0);
}
glBindTexture(GL_TEXTURE_2D,0);
glColor3f(0.0f,0.0f,0.0f);
}
int x = 3, y = 10;
float BAC_COLOR = 0;
unsigned char triger = 1;
int debag = 0;
void render(){
// if (a >= 1 && triger) triger = 0;
// else if (a < 0 && !triger) triger = 1;
// if (triger) a = a + 0.001;
// else a = a - 0.01;
glClearColor(BAC_COLOR,BAC_COLOR,BAC_COLOR,0.0f);
if (debag == 1) glClearColor(0.0f,0.8f,0.0f,0.0f);
else if (debag == 2) glClearColor(0.1f,0.1f,0.1f,0.0f);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1);
//glClearColor(0.1f,0.1f,0.1f,0.0f);
//glOrtho(-k,k, -1,1, -1,1);
glFlush();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//glutPostRedisplay();
//glfwSwapBuffers(window);
glPushMatrix();
//printf("SAS - %f\n", a);
//glColor3f(a,a,a);
render_light(player.x,player.y);
for (int g=1; g == -1 || g == 1;g-=2){
for (int ia=0; ia != 5 && ia != -5;ia+=g){
if (!mape[player.x][player.y+ia].wall){
render_light(player.x,player.y+ia);
}
else if (ia != 1 && ia != -1){
if(!mape[player.x+1][player.y+ia-g].wall){
render_light_2(player.x+1,player.y+ia-g);
if(!mape[player.x+2][player.y+ia-g].wall && (ia < 3 && ia > -3))render_light_2(player.x+2,player.y+ia-g);
}
if(!mape[player.x-1][player.y+ia-g].wall){
render_light_2(player.x-1,player.y+ia-g);
if(!mape[player.x-2][player.y+ia-g].wall && (ia < 3 && ia > -3))render_light_2(player.x-2,player.y+ia-g);
}
break;
}
else break;
}
for (int ia=0; ia != 5 && ia != -5;ia+=g){
if (!mape[player.x+ia][player.y].wall){
render_light(player.x+ia,player.y);
}
else if (ia != 1 && ia != -1) {
if(!mape[player.x+ia-g][player.y+1].wall){
render_light_2(player.x+ia-g,player.y+1);
if(!mape[player.x+ia-g][player.y+2].wall && (ia < 3 && ia > -3))render_light_2(player.x+ia-g,player.y+2);
}
if(!mape[player.x+ia-g][player.y-1].wall){
render_light_2(player.x+ia-g,player.y-1);
if(!mape[player.x+ia-g][player.y-2].wall && (ia < 3 && ia > -3))render_light_2(player.x+ia-g,player.y-2);
}
break;
}
else break;
}
}
/*
for (int i=1; i != 3; i++){
render_light(player.x-i,player.y);
render_light(player.x+i,player.y);
render_light(player.x,player.y-i);
render_light(player.x,player.y+i);
render_light(player.x-i,player.y-i);
render_light(player.x+i,player.y+i);
render_light(player.x+i,player.y-i);
render_light(player.x-i,player.y+i);
}
*/
render_ui();
for (int x = 0;x != HEIGHT;x++){
for (int y = 0;y != WIDTH;y++){
if (mape[x][y].wall) render_figure(x,y);
if (mape[x][y].itom == 1 && !mape[player.x][player.y].wall) render_oil(x,y);
if (mape[x][y].itom == 2 && !mape[player.x][player.y].wall) render_flash(x,y);
}
}
render_player(player.x,player.y);
/*
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++){
printf(mape[i][j].wall ? "█" : " ");
if (mape[i][j].wall) render_figure(i,j);
}
printf("\n");
}
printf("\n\n\n");
*/
/*
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f); glVertex2f(0.0f,1.0f);
glColor3f(0.0f,1.0f,0.0f); glVertex2f(0.87f,-0.5f);
glColor3f(0.0f,0.0f,1.0f); glVertex2f(-0.87f,-0.5f);
glEnd();
*/
glLoadIdentity();
//glOrtho(-k,k, -1,1, -1,1);
glColor3f(1,1,1);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
//glutSwapBuffers();
glFlush();
usleep(1000000/144);
//read(fd, &ev, sizeof(struct input_event));
}
void* myThreadFun(void* vargp){
unsigned char a = 1, b = 1;
while (1){
if(ev.type == 1){
//printf("key %i state %i\n", ev.code, ev.value);
if (ev.code == 106){
if (ev.value == 1){
if (a) x++;
a = 0;
}
else if(ev.value == 0 && !a){
a = 1;
}
}
else if (ev.code == 105){
if (ev.value == 1){
if (b) x--;
b = 0;
}
else if(ev.value == 0 && !b){
b = 1;
}
}
}
//usleep(1000000);
}
return NULL;
}
void handleInput(int button, int state,
int x, int y) {
printf("SAS: %i\n", button);
printf("SAS: %i\n", state);
printf("SAS: %i\n", x);
printf("SAS: %i\n", y);
//printf("SAS: %i\n", state);
}
void* fsp(void* vargp){
for (float i=1; i>0; i-=0.01){
printf("SAS\n");
BAC_COLOR=i;
usleep(10000);
}
}
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
if (action == GLFW_PRESS) {
printf("Key pressed: %d\n", key);
switch (key){
case 263 : printf("GLUT_KEY_LEFT %d\n",key) ;
if (!mape[player.x - 1][player.y].wall) player.x--;
break;
case 262 : printf("GLUT_KEY_RIGHT %d\n",key);
if (!mape[player.x + 1][player.y].wall) player.x++;
break;
case 265 : printf("GLUT_KEY_UP %d\n",key) ;
if (!mape[player.x][player.y + 1].wall) player.y++;
break;
case 264 : printf("GLUT_KEY_DOWN %d\n",key) ;
if (!mape[player.x][player.y - 1].wall) player.y--;
break;
case 32 : printf("GLUT_KEY %d\n",key) ;
pthread_t thread_id_2;
pthread_create(&thread_id_2, NULL, fsp, NULL);
break;
case 81 : printf("GLUT_KEY %d\n",key) ;
if (debag == 0) debag = 1;
else if (debag == 1) debag = 2;
else debag = 0;
break;
}
}
}
/*
void ChangeWindow(GLFWwindow* window, int width, int height){
printf("width: %i width: %i\n", width, height);
glViewport(0,0, width, height);
glLoadIdentity();
k = width / (float)height;
glOrtho(-k,k, -1,1, -1,1);
}
*/
void ChangeWindow(GLFWwindow* window, int _width33, int _height33) {
width = _width33;
height = _height33;
// Устанавливаем область просмотра в соответствии с размерами окна
glViewport(0, 0, width, height);
// Обновляем матрицу проекции
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//glOrtho(-1.0f * width / height, 1.0f * width / height, -1.0f, 1.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
//k = width / (float)height;
}
int main(int argc, char** argv) {
setlocale(LC_ALL, "Russian");
glutInit(&argc, argv);
srand(time(NULL));
initMaze(mape);
//pthread_t thread_id_2;
//pthread_create(&thread_id_2, NULL, myThreadFun_2, NULL);
carveMaze(mape, 1, 1);
printMaze(mape);
//mape[5][5].player = 1;
player.x = 5;
player.y = 5;
pthread_t thread_id;
pthread_create(&thread_id, NULL, myThreadFun, NULL);
// Инициализация GLFW
if (!glfwInit()) {
return -1;
}
// Создание окна
GLFWwindow* window = glfwCreateWindow(1800, 1200, "Hello world!", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
ChangeWindow(window, 1800, 1200);
glfwMakeContextCurrent(window);
// Регистрация функции обработки клавиш
glfwSetKeyCallback(window, key_callback);
glfwSetFramebufferSizeCallback(window, ChangeWindow);
// Основной цикл
texsture_add();
texsture_text_add();
while (!glfwWindowShouldClose(window)) {
render(); // Вызов функции отрисовки
glfwSwapBuffers(window); // Переключение буферов
glfwPollEvents(); // Обработка событий
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
/*
int main(int argc, char** argv){
srand(time(NULL));
initMaze(mape);
//pthread_t thread_id_2;
//pthread_create(&thread_id_2, NULL, myThreadFun_2, NULL);
carveMaze(mape, 1, 1);
printMaze(mape);
//mape[5][5].player = 1;
player.x = 5;
player.y = 5;
fd = open(argv[1], O_RDONLY);
pthread_t thread_id;
pthread_create(&thread_id, NULL, myThreadFun, NULL);
//pthread_t thread_id_2;
//pthread_create(&thread_id_2, NULL, myThreadFun_2, NULL);
// //pthread_create(&tid, NULL, myThreadFun, NULL);
//pthread_join(thread_id, NULL);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(1200, 1200);
glutInitWindowPosition(100, 100);
glutCreateWindow("Hello world!");
texsture_add();
glutDisplayFunc(render);
glutSpecialFunc(key_target);
glutTabletButtonFunc(handleInput);
//glutKeyboardFunc(key_callback);
//glutMouseFunc(TEST);
//glutPassiveMotionFunc(onMouseMove);
//glutReshapeFunc(ChangeWindow);
glutMainLoop();
return 0;
}
*/
/*
int main(int argc, char **argv)
{
int fd;
if(argc < 2) {
printf("usage: %s <device>\n", argv[0]);
return 1;
}
fd = open(argv[1], O_RDONLY);
struct input_event ev;
while (1)
{
read(fd, &ev, sizeof(struct input_event));
if(ev.type == 1)
printf("key %i state %i\n", ev.code, ev.value);
}
}
*/