| Разработка и ромхакинг > Ромхакинг и программирование |
| какие программы использовать для создания своих игр? |
| << < (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 ... Не затянуло... |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |