SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Не загружаются текстуры после перехода с меню в игру.
Помечено: меню к игре, пропали текстуры sfml
В этой теме 13 ответов, 4 участника, последнее обновление danilkabak 7 года/лет, 6 мес. назад.
-
АвторСообщения
-
Вообщем сделал я меню, все хорошо.
Но вот после меню игра становится без текстур (смотрите фото до и после)Вложения:
You must be logged in to view attached files.Код хотим видеть )
main.cpp:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281#include <SFML/Graphics.hpp>#include <SFML/OpenGL.hpp>#include <GL/glu.h>#pragma comment(lib,"glu32.lib")#include <iostream>#include "StartMenu.h"#include "helpFile.hpp"using namespace sf;float angleX, angleY; // Углы поворота камеры от 360 по гориз. и от -90 до 90 по вертикалиclass Player{public:float x, y, z; //координаты игрокаfloat dx, dy, dz; //смещениеfloat w, h, d; // ширина, высота, длинаbool onGround;float speed;Player(float x0, float y0, float z0){x = x0; y = y0; z = z0;dx = 0; dy = 0; dz = 0;w = 5; h = 20; d = 5; speed = 5; // половина высоты, ширины и длины (удобнее работать)onGround = false;}// проверка на столкновение при смещенииvoid update(float time){if (!onGround) dy -= 1.5*time;onGround = 0;// смещаемься по x - проверяем на столкновениеx += dx*time;collision(dx, 0, 0);// смещаемься по y - проверяем на столкновениеy += dy*time;collision(0, dy, 0);// смещаемься по z - проверяем на столкновениеz += dz*time;collision(0, 0, dz);dx = dz = 0;}//функция столкновения с каждым предметомvoid collision(float Dx, float Dy, float Dz){//цыкл по нужным клеточкам x,y,zfor (int X = (x - w) / size; X<(x + w) / size; X++)for (int Y = (y - h) / size; Y<(y + h) / size; Y++)for (int Z = (z - d) / size; Z<(z + d) / size; Z++)//если столкнулись, разрешаем столкновение (отдельно по x,y,z)if (check(X, Y, Z)) {if (Dx>0) x = X*size - w;if (Dx<0) x = X*size + size + w;if (Dy>0) y = Y*size - h;if (Dy<0) { y = Y*size + size + h; onGround = true; dy = 0; }if (Dz>0) z = Z*size - d;if (Dz<0) z = Z*size + size + d;}}// движение и прижокvoid keyboard(){if (Keyboard::isKeyPressed(Keyboard::Space)) if (onGround) { onGround = false; dy = 12; };if (Keyboard::isKeyPressed(Keyboard::W)){//смещаемься в данном направлении со скоросью speeddx = -sin(angleX / 180 * PI) * speed;dz = -cos(angleX / 180 * PI) * speed;}if (Keyboard::isKeyPressed(Keyboard::S)){dx = sin(angleX / 180 * PI) * speed;dz = cos(angleX / 180 * PI) * speed;}if (Keyboard::isKeyPressed(Keyboard::D)){dx = sin((angleX + 90) / 180 * PI) * speed;dz = cos((angleX + 90) / 180 * PI) * speed;}if (Keyboard::isKeyPressed(Keyboard::A)){dx = sin((angleX - 90) / 180 * PI) * speed;dz = cos((angleX - 90) / 180 * PI) * speed;}}};bool startGame() {RenderWindow window(VideoMode(1366, 768), "Minecraft C++", sf::Style::Default, sf::ContextSettings(24));menu(window);//вызов менюShowCursor(FALSE); //отключаем курсов в окне//волшебные слова для иннициализации OpenGlglEnable(GL_DEPTH_TEST);glDepthMask(GL_TRUE);glClearDepth(1.f);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90.f, 1.f, 1.f, 2000.f);glEnable(GL_TEXTURE_2D);////карта высот////Image im; im.loadFromFile("resources/heightmap1.png");//величина карты в зависимости от цветаfor (int x = 0; x<10; x++) // от 0 до 256for (int z = 0; z<10; z++){int c = im.getPixel(x, z).r / 15;for (int y = 0; y<c; y++)if (y>c - 3) mass[x][y][z] = 1;}///////текстуры///////Texture t; t.loadFromFile("resources/cursor.png");Sprite s(t); s.setOrigin(8, 8); s.setPosition(683, 384);// Установление текстур по типу SkyBoxGLuint skybox[6];skybox[0] = LoadTexture("resources/skybox/front.png");skybox[1] = LoadTexture("resources/skybox/back.png");skybox[2] = LoadTexture("resources/skybox/left.png");skybox[3] = LoadTexture("resources/skybox/right.png");skybox[4] = LoadTexture("resources/skybox/bottom.png");skybox[5] = LoadTexture("resources/skybox/top.png");// Установление текстур для квадратовGLuint box[6];box[0] = LoadTexture("resources/grassBox/side.jpg");box[1] = LoadTexture("resources/grassBox/side.jpg");box[2] = LoadTexture("resources/grassBox/side.jpg");box[3] = LoadTexture("resources/grassBox/side.jpg");box[4] = LoadTexture("resources/grassBox/bottom.jpg");box[5] = LoadTexture("resources/grassBox/top.jpg");//////////////////////////Clock clock;bool mLeft = 0, mRight = 0; // переменные для нажатия кнопок мышиPlayer p(100, 200, 100); // координаты плеера//////основной цикл/////////while (window.isOpen()){// привязка по времениfloat time = clock.getElapsedTime().asMilliseconds();clock.restart();time = time / 50;if (time>3) time = 3;Event event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();if ((event.type == Event::KeyPressed) && (event.key.code == Keyboard::Escape))window.close();if (event.type == Event::MouseButtonPressed){ // Если клавиша на мыши нажата, то переменная получает 1 - т.е. Trueif (event.key.code == Mouse::Right) mRight = 1;if (event.key.code == Mouse::Left) mLeft = 1;}}glClear(GL_DEPTH_BUFFER_BIT); // очищаем экранp.keyboard();p.update(time);// нахождения отклонения мыши от центра экранаPOINT mousexy; // переменная для считыванияGetCursorPos(&mousexy); // считывание кординатint xt = window.getPosition().x + 683;int yt = window.getPosition().y + 384;angleX += (xt - mousexy.x) / 4; //4 — чувствительностьangleY += (yt - mousexy.y) / 4;//ограничения вращения камерыif (angleY<-89.0) { angleY = -89.0; }if (angleY>89.0) { angleY = 89.0; }SetCursorPos(xt, yt);////----------------------if (mRight || mLeft){ // Если переменные True, то фиксируем начальные позиции мышиfloat x = p.x;float y = p.y + p.h / 2;float z = p.z;int X, Y, Z, oldX, oldY, oldZ;int dist = 0; // Дистанция создания кубиковwhile (dist<120) // радиус действия{dist++;x += -sin(angleX / 180 * PI); X = x / size;y += tan(angleY / 180 * PI); Y = y / size;z += -cos(angleX / 180 * PI); Z = z / size;// проверка на столкновение. Если столкнулись и нажата клавиша, тоif (check(X, Y, Z))if (mLeft) { mass[X][Y][Z] = 0; break; }else { mass[oldX][oldY][oldZ] = 1; break; }oldX = X; oldY = Y; oldZ = Z;}}mLeft = mRight = 0;glMatrixMode(GL_MODELVIEW);glLoadIdentity();// задаем с какой точки будем смотреть и кудаgluLookAt(p.x, p.y + p.h / 2, p.z, p.x - sin(angleX / 180 * PI), p.y + p.h / 2 + (tan(angleY / 180 * PI)), p.z - cos(angleX / 180 * PI), 0, 1, 0);//////////рисуем боксы///////int R = 50; //радиус видимостиint X = p.x / size;int Y = p.y / size;int Z = p.z / size;for (int x = X - R; x<X + R; x++)for (int y = 0; y<25; y++)for (int z = Z - R; z<Z + R; z++){if (!check(x, y, z)) continue;// координаты отрисовкиglTranslatef(size*x + size / 2, size*y + size / 2, size*z + size / 2);createBox(box, size / 2);// после возвращаемся в исходную точкуglTranslatef(-size*x - size / 2, -size*y - size / 2, -size*z - size / 2);}//создание коробки с фоном - отображениеglTranslatef(p.x, p.y, p.z); //координаты для выявления центраcreateBox(skybox, 1000); //размер коробкиglTranslatef(-p.x, -p.y, -p.z);window.pushGLStates();window.draw(s); //рисуем курсорwindow.popGLStates();window.display();if (Keyboard::isKeyPressed(Keyboard::Tab)) { return true; }//если таб, то перезагружаем игруif (Keyboard::isKeyPressed(Keyboard::Escape)) { return false; }//если эскейп, то выходим из игры}return 0;}void gameRunning() {//ф-ция перезагружает игру , если это необходимоif (startGame()) { gameRunning(); }////если startGame() == true, то вызываем занова ф-цию isGameRunning, которая в свою очередь опять вызывает startGame()}int main(){gameRunning();//запускаем процесс игрыreturn 0;}StartMenu.h: (окно меню)
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#pragma once#include <SFML/Graphics.hpp>#include <SFML/OpenGL.hpp>#include <GL/glu.h>#pragma comment(lib,"glu32.lib")#include <iostream>using namespace sf;void menu(RenderWindow & window) {ShowCursor(TRUE);Texture menuTexture1, menuTexture2, menuTexture3, aboutTexture, menuBackground;menuTexture1.loadFromFile("resources/StartMenu/111.png");menuTexture2.loadFromFile("resources/StartMenu/222.png");menuTexture3.loadFromFile("resources/StartMenu/333.png");//aboutTexture.loadFromFile("resources/StartMenu/112.png");menuBackground.loadFromFile("resources/StartMenu/background.png");Sprite menu1(menuTexture1), menu2(menuTexture2), menu3(menuTexture3), about(aboutTexture), menuBg(menuBackground);bool isMenu = 1;int menuNum = 0;menu1.setPosition(420, 400);menu2.setPosition(420, 470);menu3.setPosition(420, 535);menuBg.setPosition(0, 0);//////////////////////////////МЕНЮ///////////////////while (isMenu){menu1.setColor(Color::White);menu2.setColor(Color::White);menu3.setColor(Color::White);menuNum = 0;window.clear(Color(129, 181, 221));if (IntRect(420, 400, 500, 70).contains(Mouse::getPosition(window))) { menu1.setColor(Color::Green); menuNum = 1; }if (IntRect(420, 470, 500, 70).contains(Mouse::getPosition(window))) { menu2.setColor(Color::Green); menuNum = 2; }if (IntRect(520, 535, 270, 70).contains(Mouse::getPosition(window))) { menu3.setColor(Color::Green); menuNum = 3; }if (Mouse::isButtonPressed(Mouse::Left)){if (menuNum == 1) isMenu = false;//если нажали первую кнопку, то выходим из менюif (menuNum == 2) { window.draw(about); window.display(); while (!Keyboard::isKeyPressed(Keyboard::Escape)); }if (menuNum == 3) { window.close(); isMenu = false; }}window.draw(menuBg);window.draw(menu1);window.draw(menu2);window.draw(menu3);window.display();}////////////////////////////////////////////////////}и helpFile.hpp (отрысовка кубиков)
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120#pragma once#ifndef HELPFILE_H#define HELPFILE_H#include <SFML/Graphics.hpp>#include <SFML/OpenGL.hpp>#include <GL/glu.h>#pragma comment(lib,"glu32.lib")#include <iostream>using namespace sf;#define GL_CLAMP_TO_EDGE 0x812F // чтобы понял, что такое GL_CLAMP_TO_EDGEconst float PI = 3.141592653;bool mass[1000][1000][1000]; // массив с генерации картыfloat size = 20.f;// принимаем путь к картинке по nameGLuint LoadTexture(String name){Image image;if (!image.loadFromFile(name))return EXIT_FAILURE;image.flipVertically(); // переварачивает (ибо у OpenGl 0.0 внизу, а у SFML - сверху)// загрузка текстуры в OpenGL// Сначала загружаем картинку в программуGLuint texture = 0;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);//затем передаем её OpenGl//записываем переменную image в texture, с которой уже работает OpenGLgluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);//убираем разрез/отсуп между текстурой/гранями skyboxglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);return texture;}//window.pushGLStates();//window.draw(background);//window.popGLStates();// рисование (принимает массив текстур и размер кубика)void createBox(GLuint skybox[], float size){glBindTexture(GL_TEXTURE_2D, skybox[0]); // включаем текстуруglBegin(GL_QUADS); // запускаем рисовани//frontglTexCoord2f(0, 0); glVertex3f(-size, -size, -size);glTexCoord2f(1, 0); glVertex3f(size, -size, -size);glTexCoord2f(1, 1); glVertex3f(size, size, -size);glTexCoord2f(0, 1); glVertex3f(-size, size, -size);glEnd();glBindTexture(GL_TEXTURE_2D, skybox[1]);glBegin(GL_QUADS);//backglTexCoord2f(0, 0); glVertex3f(size, -size, size);glTexCoord2f(1, 0); glVertex3f(-size, -size, size);glTexCoord2f(1, 1); glVertex3f(-size, size, size);glTexCoord2f(0, 1); glVertex3f(size, size, size);glEnd();glBindTexture(GL_TEXTURE_2D, skybox[2]);glBegin(GL_QUADS);//leftglTexCoord2f(0, 0); glVertex3f(-size, -size, size);glTexCoord2f(1, 0); glVertex3f(-size, -size, -size);glTexCoord2f(1, 1); glVertex3f(-size, size, -size);glTexCoord2f(0, 1); glVertex3f(-size, size, size);glEnd();glBindTexture(GL_TEXTURE_2D, skybox[3]);glBegin(GL_QUADS);//rightglTexCoord2f(0, 0); glVertex3f(size, -size, -size);glTexCoord2f(1, 0); glVertex3f(size, -size, size);glTexCoord2f(1, 1); glVertex3f(size, size, size);glTexCoord2f(0, 1); glVertex3f(size, size, -size);glEnd();glBindTexture(GL_TEXTURE_2D, skybox[4]);glBegin(GL_QUADS);//bottomglTexCoord2f(0, 0); glVertex3f(-size, -size, size);glTexCoord2f(1, 0); glVertex3f(size, -size, size);glTexCoord2f(1, 1); glVertex3f(size, -size, -size);glTexCoord2f(0, 1); glVertex3f(-size, -size, -size);glEnd();glBindTexture(GL_TEXTURE_2D, skybox[5]);glBegin(GL_QUADS);//topglTexCoord2f(0, 0); glVertex3f(-size, size, -size);glTexCoord2f(1, 0); glVertex3f(size, size, -size);glTexCoord2f(1, 1); glVertex3f(size, size, size);glTexCoord2f(0, 1); glVertex3f(-size, size, size);glEnd();}//вспомогательная функция, находимься ли мы в нутри массива координат или нет//чтобы избежать ошибок передвиженияbool check(int x, int y, int z){if ((x<0) || (x >= 1000) ||(y<0) || (y >= 1000) ||(z<0) || (z >= 1000)) return false;return mass[x][y][z];}#endif HELPFILE_H#pragma onceШел на Вашим урокам, за что огромное спасибо, но вот такая беда получилась)
Вложения:
You must be logged in to view attached files.Ребят, не бросайте)
Очень нужна Ваша помощь! Прошу!если ты закомментируешь строчку
C++1menu(window);//вызов менюто всё нормально будет?
это после первого вызова меню так же происходит? или после рестарта игры?
Да,если без вызова меню, то все хорошо.
Сразу после меню,рестарт не помогает, остается также .
это не причем, но всё же добавь цикл “пока открыто окно” в ф-цию меню. так же попробуй закомментировать весь цикл while(isMenu) , всё так же?
Извините конечно, но зачем просить код, если вы банально не можете вставить туда этот цикл *пока открыто окно* (которые вы советуете всем подряд)..
“Удали то, попробуй без того” – это танцы с бубнами ? Что за тупые советы!? Зачем предлагать помощь, если Вы не в силах её оказать. Это же Ваша тематика, Вы в ней, так сказать, Царь и Бог (раз столько уроков записали).И после всего этого всего не можете помочь с решением банальной проблемы. Честно, я разочарован. Спасибо!
Вы сейчас не в доте, поэтому воздержитесь от грубости.
Больше тупых советов давать Вам не буду.
Заглядывайте иногда, может быть другие участники форума Вам помогут решить эту проблему.в startmenu.h #ifndef поставь, pragma once убери. В вики в статье include guards пишут что pragma может вызывать проблемы
Спасибо большое за ответ, Марио. Но к сожалению не помогло.
Сделал так:#pragma once
#ifndef menuusing namespace sf;
…. (код)
#endifПопробуй создать отдельный экземпляр renderwindow для менюшки.
pragma once как раз удалить строчку надо. А потом
#ifndef STARTMENU_H
#define STARTMENU_H…..
#endif STARTMENU_H
p.s. погоди, если функцию menu поместить в main.cpp, тоже будет баг?
Значит так:
RenderWindow menuWindow(VideoMode(1366, 768), “Minecraft C++”, sf::Style::Default, sf::ContextSettings(24));
menu(menuWindow);//вызов меню
RenderWindow Window(VideoMode(1366, 768), “Minecraft C++”, sf::Style::Default, sf::ContextSettings(24));
Window.setActive(true);
…Подскажите, как именно должен выглядеть этот код?
вставил это:
C++12345RenderWindow window(VideoMode(1376, 768), "Minecraft C++", sf::Style::Default, sf::ContextSettings(24));window.setActive(true);RenderWindow menuWindow(VideoMode(1366, 768), “Minecraft C++”, sf::Style::Default, sf::ContextSettings(24));menu(menuWindow);//вызов менюно выдает ошибки. подскажите, нужно ли добавить тот код меню? И как правильно это сделать? Куда вставить тот код?
Вложения:
You must be logged in to view attached files. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.