14 комментариев

  
Niko_de_Andjelo
0
Весьма своеобразный выбор звукового сопровождения. Однако я рад, что, по крайней мере, один что-то делает для ШОКИ
KaskeT
0
Забавно, походу, все разработчики страдают хренью желанием сделать лабиринт в духе Wolf3D

Недописанная игра
NTFS
+3
Ну, у тебя настоящий лабиринт, а у меня — пещеры =)

А есть исходники? Хочу посмотреть на твою реализацию этой идеи
Niko_de_Andjelo
0
А есть исходники?

Поведение реализуется скриптованием внешним
Файл main.js
function Init() {
   game.addUnit('key.png',2,9,'y',35,100) ;
   game.addUnit('key.png',8,1,'y',100,100) ;
   game.addUnit('door.png',8,6,'x',100,100) ;
   game.addUnit('apple.png',4,4,'y',30,30) ;
   game.addUnit('portal.png',5,4,'y',50,100) ;
   game.showMessage('Задача: Выйти из лабиринта') ;
}
 
function MovedTo(x, y) {
   if ((x==2)&&(y==9)&&(game.isUnitAt(2,9))) {
     game.removeUnitAt(2,9) ;
     game.addInventory('key','Ключ') ;
     game.showMessage('Вы съели ключ!') ;
   }

   if ((x==5)&&(y==4)) {     
     game.jumpTo(6,4,'x-') ;
   }

   if ((x==8)&&(y==6)&&(game.isUnitAt(8,6))&&
       game.isInventoryExist('key')) {
      game.removeUnitAt(8,6) ;
      game.showMessage('Вы открыли решетку ключом.') ;
   }
}
   
function CanMoveTo(x, y) {
   if ((x==8)&&(y==6)&&(game.isUnitAt(8,6))) {
     if (!game.isInventoryExist('key')) {
       game.showMessage('Для открытия решетки, вам нужен ключ.') ;
       return false ;
     }
   }
   return true ;
}


Стены в текстовом файле
Спойлер
0;3-10;block.png
1-6;3;block.png
6;0-3;block.png
6-9;0;block.png
9-12;1;block.png
9;0-3;block.png
8;2-3;block.png
3;8-10;block.png
2;5-8;block.png
2-6;8;block.png
6;5-8;block.png
4-7;5;wood.png
7;5-6;wood.png
6-7;6;wood.png
9-12;5;wood.png
12;1-5;wood.png
9;5-6;wood.png
0-3;10;wood.png
10;3;wood.png
4;6;wood.png


А сам код крайне примитивен, за меня всё делает ядро OpenGL, даже без отсечения невидимых плоскостей — чисто на gluLookAt
Это халтура, но работает, для моих целей годится.

Впрочем, если охота рыться — вот
109.234.38.121/uploads/20200503_220949_4cd29f70a2b2b300/QtOpenGL.zip
магия рисования в модуле oglwidget.cpp
NTFS Изменён автором
+1
за меня всё делает ядро OpenGL

т.е. это не настоящее псевдо-3д, не ray casting? просто хотел узнать ещё, как ты решил проблему рыбьего глаза, искажений высоты по краям экрана
Niko_de_Andjelo Изменён автором
0
Я не знаю, как именно видеокарта это обрабатывает.
Мне достаточно, что я в месте стены вызываю
glBegin(GL_POLYGON);
  glColor3f( 0.75f, 0.75f, 0.75f );
  glTexCoord2f(1.0f, 1.0f); glVertex3f( shift, shifty-szH, shiftz +szW );
  glTexCoord2f(1.0f, 0.0f); glVertex3f( shift, shifty+szH, shiftz +szW );
  glTexCoord2f(0.0f, 0.0f); glVertex3f( shift, shifty+szH, shiftz -szW );
  glTexCoord2f(0.0f, 1.0f); glVertex3f( shift, shifty-szH, shiftz -szW );
  glEnd();


и это работает. Для полной победы, нужно добавить отсечение самому, использование компилируемых списков и шейдеров. Ну или выкинуть всё и поставить Unity :-)
NTFS
+1
Я программировать не умею, расшифруй:
это код opengl?
этот кусок кода рисует стенку целиком?
Niko_de_Andjelo
0
Этот кусок кода рисует полигон по четырем точкам в пространстве, затеняя его на 25% и накладывая текстуру — каждый угол текстуры на угол полигона.
Получается стена кирпича.
NTFS
0
KaskeT
0
Первую статью этого цикла читал.
Niko_de_Andjelo
0
За музон 10 баллов авансом.
RSD500
0
В поддержание темы, вот как выглядит мой лабиринт сейчас.
Спойлер

Изобилие текстур будет равномерно по коридорам лежать, это просто тестовый уголок.
Так будет карта 128x128.
NTFS Изменён автором
+1
А каким алгоритмом ты пол/потолок выводишь с приемлемым fps?
Niko_de_Andjelo
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Скрыто Показать