Разработка и ромхакинг > Ромхакинг и программирование
какие программы использовать для создания своих игр?
<< < (9/11) > >>
TrickZter:
Аксонометрические проекции - это хорошо, но только для плоских игр. В 3D-играх, если собираетесь делать именно 3D, всё несколько сложнее. При удалении от наблюдателя объект должен уменьшаться в масштабе и сдвигаться ближе к центру, и чем дальше находится объект, тем сильнее.

Классический пример - рельсы: они параллельны, но для наблюдателя, смотрящего вдоль них, рельсы кажутся сходящимися:




Почитать про проецирование трёхмерного пространства на экран можно, например, тут:
http://fvn2009.narod.ru/Manuscripts/schedule/schedule2.htm

или тут:
http://www.alexeyspace.ru/articles/1/
r57shell:

--- Цитата: TrickZter от 26 Сентябрь 2011, 14:34:28 ---Аксонометрические проекции - это хорошо, но только для плоских игр.
--- Конец цитаты ---
я не акцентирую, что надо её использовать. Мой, вроде, вменяемый ответ, в котором написано как делают нормальные люди вот тут.
просто я модифицировал код Mr2, где продемонстрировал самый, с моей точки зрения, "тупой" метод. Чтобы не взорвать мозг человеку.
Однако оказалось так, что даже эта простая как 2х2 модель взорвала ему мозг, т.к.


--- Цитата: Mr2 от 26 Сентябрь 2011, 14:14:52 ---Я про то и говорю. Что ты не вращяешь, а меняешь угол обзора.

--- Конец цитаты ---
я не вращаю, и не меняю углы. я куб не трогаю. я меняю координатные оси.


--- Цитата: Mr2 от 26 Сентябрь 2011, 14:14:52 ---Я же хотел повернуть куб и отобразить не меняя угла обзора(при котором Z координата не видна).

--- Конец цитаты ---
дак поверни куб. Домнож его на матрицу поворота.


--- Цитата: Mr2 от 26 Сентябрь 2011, 14:14:52 ---Рисунок 1 исходное положение, 2 повёрнутый куб.

--- Конец цитаты ---
мне же достаточно заменить соответствующие строки вот этим:

--- Код: --- E[0].x=15;
 E[0].y=0;
 E[1].x=0;
 E[1].y=30;
 E[2].x=-15;
 E[2].y=0;
--- Конец кода ---
и я получу вид 2.

Mr2:

--- Цитата: TrickZter от 26 Сентябрь 2011, 14:34:28 ---Аксонометрические проекции - это хорошо, но только для плоских игр. В 3D-играх, если собираетесь делать именно 3D, всё несколько сложнее. При удалении от наблюдателя объект должен уменьшаться в масштабе и сдвигаться ближе к центру, и чем дальше находится объект, тем сильнее.

--- Конец цитаты ---
Спасибо за информацию, но это я знаю. :)
В смысле видел подобную инфу.Но как наверное вы уже поняли что сложновата она для рядового двоечника по математике. :)

--- Цитата: r57shell от 27 Сентябрь 2011, 22:06:07 ---Однако оказалось так, что даже эта простая как 2х2 модель взорвала ему мозг, т.к.
--- Конец цитаты ---
Не, просто  математику недавно учить начал.Поэтому туго доходит. :blush:


--- Цитата: r57shell от 27 Сентябрь 2011, 22:06:07 ---я не вращаю, и не меняю углы. я куб не трогаю. я меняю координатные оси.
--- Конец цитаты ---
Ну я про то и говорю. Просто куб отображается с учётом изменённых осей.

--- Цитата: r57shell от 27 Сентябрь 2011, 22:06:07 ---дак поверни куб. Домнож его на матрицу поворота.

--- Конец цитаты ---
Понял.
topos84:

--- Цитата: r57shell ---для совсем тупых: дятел - разновидность птицы.
аналогично изометрия - разновидность аксонометрической проекции.
--- Конец цитаты ---
Изометрия - отображение одного метрического пространства в другое, сохраняющее метрику.
Здесь же изометрия - всего лишь сокращенное название изометрической проекции, одной из разновидностей аксонометрической проекции. Очевидно, что эта проекция расстояния не сохраняет (диагонали куба например имеют разные длины на рисунке), а потому настоящей изометрией не является.

r57shell:
Mr2, почитай про линейные операторы, и задающие их - матрицы (то есть все линейные операторы не надо курить, достаточно только операторы заданные матрицей). А затем если понять, что все: перемещение, перенос, вращение, масштабирование - это линейные операции, то можно понять что их можно записать матрицами, а композиция операций = композиции матриц. У матриц есть хорошее свойство - ассоциативность, после чего всё становится удобно. Во время внесения операции "перенос" должен стать вектор четырёхкомпонентный, и следовательно матрицы 4х4. И всё что остаётся сделать повернуть "всё" пространство "в анфас" к камере, так чтобы z было от камеры = в глубь сцены. И пусть эти координаты точек = (x,y,z,w). и окончательные координаты проекции это (x/z,y/z) которые остаётся правильно растянуть на экран. (fov, aspect).
по подробнее про перспектву тут: http://msdn.microsoft.com/en-us/library/windows/desktop/bb147302(v=vs.85).aspx
Mr2:
Проанализировал работу кода. :)

--- Код: ---point E[3];//Векторы.
point O; // Начальная точка векторов.

//1 вершина совпадает с направлением вектора.
//0 вершина не совпадает с направлением вектора.
point verts[]={ //Вершины куба.
  {0, 0, 0},
  {0, 1, 0},
  {1, 1, 0},
  {1, 0, 0},
  {0, 0, 1},
  {0, 1, 1},
  {1, 1, 1},
  {1, 0, 1},
 };

int edges[]={//от какой вершины к какой идёт линия.(грани)
  0,1,
  1,2,
  2,3,
  3,0,
  4,5,
  5,6,
  6,7,
  7,0,
  0,4,
  1,5,
  2,6,
  3,7,
 };

 E[0].x=30;//Конечные точки векторов.(рисунок 1)
 E[0].y=0;
 E[1].x=0;
 E[1].y=30;
 E[2].x=20;
 E[2].y=10;

//вычисляем координаты вершин основываясь на направлении векторов.
v1.x= E[0].x * x1.x + E[1].x * x1.y + E[2].x * x1.z;
v1.y= E[0].y * x1.x + E[1].y * x1.y + E[2].y * x1.z;

--- Конец кода ---
Внимание вопрос:
Как мне записать новую точку над кубом относительно его центра?(рисунок 2)

--- Код: ---point verts[]={ //Вершины куба.
  {0, 0, 0},
  {0, 1, 0},
  {1, 1, 0},
  {1, 0, 0},
  {0, 0, 1},
  {0, 1, 1},
  {1, 1, 1},
  {1, 0, 1},
  {?, ?, ? },
};

--- Конец кода ---
r57shell:
0.5 0.5 1.5
не знаю в каком порядке
Mr2:
Начал изучать Win32 API, и вспомнил про это:

--- Цитата: r57shell от 28 Август 2010, 14:45:06 ---Простой пример WinAPI - почти весь основан на объектах. Таких как HRGN, HWND, HANDLE, и прочих, однако они все типа void *.
--- Конец цитаты ---

Как объект может быть типа void? Ведь объект и определяет свой тип.


--- Цитата: r57shell от 28 Август 2010, 14:45:06 ---А методы к ним это функции SetWindowRgn(hwnd,rgn) и прочее.
--- Конец цитаты ---

Методы так не вызываются.


--- Цитата: r57shell от 28 Август 2010, 14:45:06 ---Также на C пишется на принципах ооп. Если надо допустим делегирование, то просто добавляется свойство, с указателем на другой "объект" - который уже будет делегантом или как там я уже забыл.
--- Конец цитаты ---
В С++ не поддерживается делегирование на прямую. Как оно поддерживается в простом C?

И главный вопрос: Куда в Win api  писать "свой код" в win main функцию или в win proc?
r57shell:

--- Цитата: Mr2 от 30 Ноябрь 2011, 09:11:01 ---Как объект может быть типа void? Ведь объект и определяет свой тип.

--- Конец цитаты ---
без коментариев.


--- Цитата: Mr2 от 30 Ноябрь 2011, 09:11:01 ---Методы так не вызываются.

--- Конец цитаты ---

--- Код: ---class qwe
{
...
}
DoSomething(qwe *this, int param) - чем тебе это не метод.

--- Конец кода ---


--- Цитата: Mr2 от 30 Ноябрь 2011, 09:11:01 ---В С++ не поддерживается делегирование на прямую. Как оно поддерживается в простом C?

--- Конец цитаты ---
Если так считать, то делегирования и методов не существует.
Доказательство:
1) Ассемблер не поддерживает делегирование и методы.
2) любой C, C++ код транслируется в код на ассемблере.
из (1), (2) следует что делегирование не возможно, т.к. его не поддерживает ассемблер.

найдите багу в доказательстве :].


--- Цитата: Mr2 от 30 Ноябрь 2011, 09:11:01 ---И главный вопрос: Куда в Win api  писать "свой код" в win main функцию или в win proc?

--- Конец цитаты ---
в WinAPI не надо писать код.
Ты пишешь код который использует WinAPI.
Mr2:

--- Цитата: r57shell от 02 Декабрь 2011, 20:22:56 ---без коментариев.
--- Конец цитаты ---
Про void* непонятно вопервых зачем, и как.
если мы объявляем указатель на структуру:
strucTest * one;
то мы работаем с данной структурой, а если мы объявляем void * one то с чем мы работаем в этом случае.
Читал что можно использовать указатель void*, но только с приведением его к конкретному типу.
Но не понял не пользы, не удобства.



--- Код: ---class qwe
{
...
}
DoSomething(qwe *this, int param) - чем тебе это не метод.

--- Конец кода ---
Ты имеешь в виду что принцип работы функций со структурами аналогичен работе методов с классами?


--- Цитата: r57shell от 02 Декабрь 2011, 20:22:56 ---Если так считать, то делегирования и методов не существует.
Доказательство:
1) Ассемблер не поддерживает делегирование и методы.
2) любой C, C++ код транслируется в код на ассемблере.
из (1), (2) следует что делегирование не возможно, т.к. его не поддерживает ассемблер.

найдите багу в доказательстве :].
--- Конец цитаты ---
Я не просил доказательств, я просил пример. Как делегирование поддерживается в простом C?


--- Цитата: r57shell от 02 Декабрь 2011, 20:22:56 ---в WinAPI не надо писать код.
Ты пишешь код который использует WinAPI.

--- Конец цитаты ---
Ну а код то куда писать? В win main функцию или в win proc?
Допустим хочу использовать свой класс, где мне его инициализировать, как он должен взаимодействовать с окном?


--- Код: ---#ifndef QUESTEST_H
#define QUESTEST_H
class questest{  //класс вопросов и ответов.
  private:
   static int right;
   static int wrong;
   static int ansQuest; // отвеченный вопрос.
   static int quesLoad; // колличество загруженных вопросов.
   static int jumpAns; // номер верного ответа
   static int counterAns;
   int questNum; // номер вопроса по списку.
   int sumAns; //колличество вариантов ответов.
   int ranQues;
   int ranAnsw;
   char bufRus[256]; // массив для перекодировки символов записанных в программе.
   std::string ansMass[10];
   std::string chooseAns;
   std::string correctAns;
   std::string ruDosCoder(std::string&);
   std::string strLimit(std::string& ,int symbLimit=73);
   char* rus(const char* text);
  public:
   questest(){
      right = 0, wrong = 0, ansQuest = 0,quesLoad = 0, questNum = 0;
      sumAns = 0,jumpAns = 1071,counterAns = 0;
   }
   ~questest(){
   }  
      
   void setQuest(std::string quest[]);
   void randAsk();
   void ask();
   void trueAnswers(std::string quest[]);
   void choose();
   void check();
 };
#endif

--- Конец кода ---
CrazyMax:
WinMain - это точка входа в программу.
WinProc - это процедура обработки сообщений окна/класса (Винда посылает ей сообщения, перерисовать/WM_PAINT, изменения размеров и т.д.), их может быть несколько, для каждого окна.
r57shell:

--- Цитата: Mr2 от 03 Декабрь 2011, 09:27:12 ---Про void*

--- Конец цитаты ---
Проще некуда.
представим "твой" код

--- Код: ---class qwe
{
...
}
qwe *CreateSomething(int param) - создание объекта
DoSomething(qwe *this, int param) - "метод"

--- Конец кода ---
а теперь представим что этот код не твой, а чужой, зашитый в какой-нибудь библиотеке, итого

--- Код: ---void *CreateSomething(int param) - создание объекта
DoSomething(void *this, int param) - "метод"

--- Конец кода ---
т.к. создатели библиотеки не хотят чтобы ты трогал их класс, или ещё чего, однако чтобы ты мог передавать инфу о нём, в данном случае - указатель.
void * - означает указатель на что-то (тупо адрес в памяти)
void - бывает только тип возврата функции.
void ** - означает указатель на указатель на что-то. и т. д.
Известно, что какой бы не был тип на что указатель - его размер одинаков = адресу. для 32-х битных программ 32 бита, для 64-битных, сам догадаешься.

однако раз void * - адрес = число, то можно в void * хранить и число.
Вообще void * удобен там, где заранее не известен тип.
например есть стандартная функция сортировки.

--- Код: ---#include <cstdlib>
int cmp (const void *a, const void *b)
{
return *(const int *)a - *(const int*)b;
}

int main()
{
int a[]={10,2,5,1,20};
qsort(a, sizeof(a)/sizeof(a[0]), sizeof(a[0]), cmp);
return 0;
}

--- Конец кода ---


--- Цитата: Mr2 от 03 Декабрь 2011, 09:27:12 ---Ты имеешь в виду что принцип работы функций со структурами аналогичен работе методов с классами?

--- Конец цитаты ---
Всё зависит от того, что ты подразумеваешь когда чего-то пишешь. Если ты считаешь это "методом", то наверно это метод ).


--- Цитата: Mr2 от 03 Декабрь 2011, 09:27:12 ---Как делегирование поддерживается в простом C?

--- Конец цитаты ---
а делегирование поддерживается в C++?
если да, то что ты понимаешь под делегированием,
и что значит "поддерживается", т.к. в C++ я знаю только наследование, и разделяю наследование с делегированием.


--- Цитата: Mr2 от 03 Декабрь 2011, 09:27:12 ---Ну а код то куда писать? В win main функцию или в win proc?

--- Конец цитаты ---
Как и везде в C++, пиши куда хочешь, хоть в отдельный .cpp, хоть ещё как-нибудь, хоть шаблоном, хоть чем, хоть дефайнами.


--- Код: ---#include <windows.h>

.......................

void MySuperProgram(............)
{
 ...........
}

..........

int CALLBACK WinMain(.................)
{
  MySuperProgram(.............)
  return 0;
}

...............

int CALLBACK WinProc(.................)
{
 .........
 MySuperProgram(............)
 ..........
}

--- Конец кода ---
О_о я написал и Там и Там?!!!

что первое что второе - Callback. Как и функция сравнения сортировки в предыдущем примере.
Mr2:

--- Цитата: r57shell от 03 Декабрь 2011, 21:19:09 ---Проще некуда.
представим "твой" код

--- Код: ---class qwe
{
...
}
qwe *CreateSomething(int param) - создание объекта
DoSomething(qwe *this, int param) - "метод"

--- Конец кода ---
а теперь представим что этот код не твой, а чужой, зашитый в какой-нибудь библиотеке, итого

--- Код: ---void *CreateSomething(int param) - создание объекта
DoSomething(void *this, int param) - "метод"

--- Конец кода ---
т.к. создатели библиотеки не хотят чтобы ты трогал их класс, или ещё чего, однако чтобы ты мог передавать инфу о нём, в данном случае - указатель.
--- Конец цитаты ---
А, это они инкапсулируют члены структуры... то есть я не смогу обратиться к её членам:


--- Цитата: r57shell от 03 Декабрь 2011, 21:19:09 ---void * - означает указатель на что-то (тупо адрес в памяти)
void - бывает только тип возврата функции.
void ** - означает указатель на указатель на что-то. и т. д.
Известно, что какой бы не был тип на что указатель - его размер одинаков = адресу. для 32-х битных программ 32 бита, для 64-битных, сам догадаешься.

однако раз void * - адрес = число, то можно в void * хранить и число.

--- Конец цитаты ---
Про это читал, не знал лишь зачем нужно заморачиваться с неопределённым типом(void*), если есть вполне конкретные, с которыми работать проще и удобнее.


--- Цитата: r57shell от 03 Декабрь 2011, 21:19:09 ---Вообще void * удобен там, где заранее не известен тип.
например есть стандартная функция сортировки.

--- Код: ---#include <cstdlib>
int cmp (const void *a, const void *b)
{
return *(const int *)a - *(const int*)b;
}

int main()
{
int a[]={10,2,5,1,20};
qsort(a, sizeof(a)/sizeof(a[0]), sizeof(a[0]), cmp);
return 0;
}

--- Конец кода ---

--- Конец цитаты ---
То есть как альтернатива перегрузке, или шаблону?


--- Цитата: r57shell от 03 Декабрь 2011, 21:19:09 ---Всё зависит от того, что ты подразумеваешь когда чего-то пишешь. Если ты считаешь это "методом", то наверно это метод ).

--- Конец цитаты ---
Дело не во мне, мне интерестна концепция Win32 api, какую парадигму MS использовали. Процедурную, ООП или что то среднее... :)


--- Цитата: r57shell от 03 Декабрь 2011, 21:19:09 ---а делегирование поддерживается в C++?
если да, то что ты понимаешь под делегированием,
и что значит "поддерживается", т.к. в C++ я знаю только наследование, и разделяю наследование с делегированием.
Как и везде в C++, пиши куда хочешь, хоть в отдельный .cpp, хоть ещё как-нибудь, хоть шаблоном, хоть чем, хоть дефайнами.
--- Конец цитаты ---
Я знаю как замутить делигирование через классы, но мне интересно как это реализовано в простом C.

--- Цитата: r57shell ---Также на C пишется на принципах ооп. Если надо допустим делегирование, то просто добавляется свойство, с указателем на другой "объект" - который уже будет делегантом или как там я уже забыл.
--- Конец цитаты ---

--- Цитата: r57shell от 03 Декабрь 2011, 21:19:09 ---
--- Код: ---#include <windows.h>

.......................

void MySuperProgram(............)
{
 ...........
}

..........

int CALLBACK WinMain(.................)
{
  MySuperProgram(.............)
  return 0;
}

...............

int CALLBACK WinProc(.................)
{
 .........
 MySuperProgram(............)
 ..........
}

--- Конец кода ---
О_о я написал и Там и Там?!!!

что первое что второе - Callback. Как и функция сравнения сортировки в предыдущем примере.

--- Конец цитаты ---
Попробуем. :)
r57shell:

--- Цитата: Mr2 от 03 Декабрь 2011, 22:21:06 ---То есть как альтернатива перегрузке, или шаблону?

--- Конец цитаты ---
а в чистом C нету шаблонов. А перегрузка в данном подходе (сортировки) не поможет: надо будет каждую сортировку дублировать, т.к. тип массива разный, иначе сортировка не будет знать какой тип подставлять в cmp. то есть один и тот же код сортировки, надо будет тупо дублировать, а мы от этого избавляемся если сделать void *.


--- Цитата: Mr2 от 03 Декабрь 2011, 22:21:06 ---Я знаю как замутить делигирование через классы, но мне интересно как это реализовано в простом C.

--- Конец цитаты ---
Ничего не реализовано - реализуй сам..
Mr2:

--- Цитата: r57shell от 03 Декабрь 2011, 23:36:15 ---а в чистом C нету шаблонов. А перегрузка в данном подходе (сортировки) не поможет: надо будет каждую сортировку дублировать, т.к. тип массива разный, иначе сортировка не будет знать какой тип подставлять в cmp. то есть один и тот же код сортировки, надо будет тупо дублировать, а мы от этого избавляемся если сделать void *.
--- Конец цитаты ---
Понял. Спасибо. Читал в основном книжки по C++, и там такой способ не упомянали. :-\


--- Цитата: r57shell от 03 Декабрь 2011, 23:36:15 ---Ничего не реализовано - реализуй сам..

--- Конец цитаты ---
Да не нужно оно мне, я просто хотел посмотреть как делегирование выглядит в простом C. :wacko:
r57shell:

--- Цитата: Mr2 от 03 Декабрь 2011, 23:45:39 ---Читал в основном книжки по C++, и там такой способ не упомянали. :-\

--- Конец цитаты ---
А я вообще не читал книжек по С++, т.к. это бессмысленно.
Достаточно взять мануал, узнать весь синтаксис и конструкции языка, а потом уже станет понятно что и как можно делать.

а вообще, возьми Жирный опенсорс на чистом С на ооп, и посмотри, что там да как.
Mr2:
Продолжаем эксперементы с 3D.
Повернул в ручную! :D
r57shell:
1) почему "ты свой аватар шатал"?.
2) изометрия - уныло. перспективу давай.
Mr2:

--- Цитата: r57shell от 02 Декабрь 2012, 14:59:34 ---1) почему "ты свой аватар шатал"?.
--- Конец цитаты ---
Это переодевания из MK4. :lol:

--- Цитата: r57shell от 02 Декабрь 2012, 14:59:34 ---2) изометрия - уныло.

--- Конец цитаты ---
Да, да, я в начале не понял в какую сторону я его повернул.
А потом до меня дошло что такое паралельная проэкция.
Всётаки лучше один раз пощупать, чем сто раз увидеть. :lol:

--- Цитата: r57shell от 02 Декабрь 2012, 14:59:34 ---перспективу давай.
--- Конец цитаты ---
Будем работать.... :wacko:
Гламурная киса:
Для создания своих игр лично я использую code::blocks, paint.net (иногда фотожоп), 3ds max ну и библиотеки (или двигателя) для графона, типа SDL, Irrlicht, DGLE2, HGE.

Гей-мейкеры и прочие конструкторы ненавижу.
Добавлено позже:
как-то приходилось баловаться с AS 2.0 (3.0) и с JAVA SE ... Не затянуло...
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии