Advanced member
Статус: Не в сети Регистрация: 16.11.2006 Откуда: Всегда!
А что сказать? Молодец - потому что 1) изучаешь что-то полезное 2) получил опыт и законченный продукт .
Следующая ступень - избавляешься от GDI в игрушках, это извращение, используй MDX или XNA.
В Rally пишешь - управление WSAD, в реале - только по горизонтали, обманывать нехорошо.
Понятное дело, что в эти игрушки никто играть не станет. Код там простой, конечно, но и в этом случае можно было еще поработать.
К примеру, ты пишешь:
private void ApplyObst(bool move)
{
int num3;
int num4;
Random random = new Random();
int num = random.Next(0, this.diff);
int num2 = random.Next(0, this.width - 4);
if (move)
{......}
else
{
В блоке else num и num2 не используются, поэтому если (move == false) истинно, вычисление random работает вхолостую, бесполезно нагружая GC.
В твоей программе это абсолютно некритично, но дело в принципе.
В общем, продолжай, да и заставки красивше делай, не модно нынче текст кирпичами выкладывать.
Advanced member
Статус: Не в сети Регистрация: 16.11.2006 Откуда: Всегда!
Popik
Могу порекомендовать:
Так как в DX SDK документация по MDX практически почти бесполезна, нужно прочитать классику:
Tom Miller (одиин из разработчиков MDX)
Managed DirectX® 9 Kick Start: Graphics and Game Programming
Книга выдержала несколько изданий, есть в сети P2P, и если брать оттуда,к ней желательно скачать и примеры.
У меня старое издание 2003 года, без опыта трудно будет сделать все примеры работающими (много времени прошло, некоторые конструкции АПИ изменились), в новых изданиях, наверно, подкорректировано. Если что не заработает - спрашивай.
Вот неплохие книги от г-на Charles Petzold
http://www.charlespetzold.com/books.html Причем .Net Book Zero - бесплатная, советую скачать и просмотреть. Она написана как пособие по переходу с С++ на С#, и на что нужно при этом обратить внимание, но на самом не требует знания С++, можно использовать как учебник.
Много есть книжек, вышедших до появления С# 2.0, но я бы порекомендовал все-таки вместо тех книг поработать с MSDN Help, пользы больше будет.
Очень полезно посещать сайт http://www.codeproject.com/ и разбирать новые примеры и приемы.
По поводу XNA - есть сайт http://creators.xna.com/, правда я на него теперь редко хожу, после того, как они съехали с MSDN (ИМХО, сделав ошибку).
На этих форумах нужно работать избирательно - я предпочитаю только просматривать сообщения знающих людей, например из MSFT, кто брошен на работу с массами - это в первую очередь Shawn Hargreaves. Но я чаще захожу на его блог http://blogs.msdn.com/shawnhar/ , или на блог разработчика PIX - http://blogs.msdn.com/manders/default.aspx . И встроенная документация по XNA намного лучше, чем по MDX, вполне годится для изучения. Да много чего еще есть в сети.
Но если хочешь идти в этом направлении - разбери все файлы dxm*.cs из DX SDK - это примерный аналог С++ dxutils, многое станет ясно про кэшированию ресурсов, эффектов и другие хитрости. Фактически, это прообраз XNA, только без Content PipeLine.
А по поводу дизассемблирования - что один человек собрал, другой завсегда разобрать сможет Если говорить про .NET, то все есть в .NET SDK, а Рефлектор - это из серии маст хэв. Чтобы доступ к коду был затруднен, нужно принимать ряд мер, просто откомпиленный код содержит много чего лишнего, поработай с Properties проекта. И после этого надо еще и обфускатором пройтиcь. Но, если прятать нечего, - так лучше и не заморачиваться, так как сломать можно все, вопрос времени только. А нормальному программисту быстрее с нуля писать, чем ковыряться в недокументированном хламе, к тому же все ключевые моменты описаны в исходниках - только поискать в сети надо.
Member
Статус: Не в сети Регистрация: 08.05.2006 Откуда: Москва
zauropod, спасибо за рекоменации по книгам. Сам сейчас читаю книги Charles Petzold'а, очень нравятся. А насчет xna, у меня вопрос, для его использования достаточно скачать xna redistr, или всю гейм студию? Что необходимо установить пользователю, для того чтоб запускать программы с xna? Что нужно, чтоб использовать mdx? Что рекомендуешь к использованию?
А насчет дизассемблирования, получается, что незащищенную программу под .net можно разобрать, как и программу на яве, вплоть до имен переменных? Добавлено спустя 6 минут, 8 секунд
Neckro писал(а):
пасибо пойграл ))) жду следующих ))
Как буду продвигаться в изучении, будут и следующие
Advanced member
Статус: Не в сети Регистрация: 16.11.2006 Откуда: Всегда!
Popik Нужна вся GSE. Здесь, конечно MS поступила некорректно, на мой взгляд - на самом деле инсталляция (~80 мб) - это несколько нужных DLL (2-3 мб), а остальное - темплейт-исходник игры, написанный бывшим работником MS тов. ZMan (или ZManiac, он сейчас модерирует форум XNA). Причем контент игры имеет явно несоразмерный к качеству объем текстур, все можно было и до 30 мб уложить.
Естественно, нужен предварительно инсталлированный MS С#2005 EE или C#9.0 ORCAS EE CTP. А вот для запуска игр, сделанных на XNA, если не установлена XNA GSE, нужна установка XNA redistributive (меньше 2мб). Для использования MDX нужно только установить .Net Framework.
По поводу XNA vs MDX - я бы рекомендовал XNA, так как MDX пока заброшен, по сути XNA - она и есть продолжение MDX. Но с XNA есть одна загвоздка - если DX redist на любую машину инсталлирует
DX и MDX библиотеки и можно было их распространять вместе с разработанным ПО, то лицензия XNA GSE не позволяет тебе распространять DLL от XNA без установки самой XNA. Это не имеет значения, если ты разрабатываешь игру или XNA-приложение, но я например, делал саму среду разработки 3Д приложений, которая уже должна компилировать исходный код, с использованием библиотек MDX или XNA, так вот при таком раскладе я не имею права использовать DLLки от XNA, хотя при этом сама XNA GSE мне не нужна.
По поводу защиты. В этом мире нет ничего 100% защищенного. С другой стороны, официально открыты исходные коды многих коммерческих игр и приложений. Кому это интересно - рассматривать сотни тысяч строк недокументированного текста? Очень не многим.
Обфускатор не шифрует код, а затрудняет его лексический разбор. А если его зашифровать - код при исполнении ведь все равно распаковывается, перехватываются апишные вызовы, ставятся свои хуки, и MS на своем сайте сама предоставляет такой инструментарий. Поэтому сильно не переживай - непрофессиональная защита обеспечивает защиту только от непрофессионалов, а если за твоим кодом будут охотиться профессионалы, то это значит, что ты уже получаешь большую зарплату, делаешь хорошего кода много и быстро, и проблема для тебя вообще не актуальна - пока конкуренты разберутся в твоем прошлом коде, ты уже придумаешь новый технологический прорыв!
Member
Статус: Не в сети Регистрация: 08.05.2006 Откуда: Москва
zauropod, а разрабатывать приложение под xna можно в Visual Studio 2005 Pro (лицензионная у меня, не хочется с нее слезать), или нужно в GSE?
А насчет защиты, ты не так понял мой вопрос, защищать мне пока еще нечего, интересует другое, насколько я знаю, декомпилировать программу на C/C++ можно только в ассемблерный код, однако получается что программу, написанную на C#, можно разобрать в исходники на C#?
Advanced member
Статус: Не в сети Регистрация: 16.11.2006 Откуда: Всегда!
Popik писал(а):
разрабатывать приложение под xna можно в Visual Studio 2005 Pro
....можно только в С# (8 или 9) EE , к Pro можно подключить ДЛЛки от XNA, но будет работать без Content Pipeline. Ребята с русскоязычного XNA форума сделали конвертер контента, так что эта проблема слегка нивелируется. EE ставятся и не конфликтуют с Про (только при удалении EE могут попртиться переменные окружения, читай Readme). Для работы XNA программы на компе с неустановленной XNA GSE там нужно постаить редистрибутив ( мег с хвостом). Но я сейчас не так внимательно слежу за XNA, так что моя информация может быть и с бородой.
Popik писал(а):
программу, написанную на C#, можно разобрать в исходники на C#?
В этом плане, Net сборка в большей степени уязвима. Но я уже писал, что для затруднения декомпиляции нужно применять обфускатор, который (хороший) изменяет метаданные, меняет имена переменных, методов, причем не только пользовательских, но и внутренних, что приводит хакера только на уровень IL, а не С#.
Я в течение часа выложу новую версию просмотрщика файлов 3DMark, там я применю самую простую степень защиты обфускатором - переименование пользовательских переменных, можешь просмотреть для интереса. И еще добавлю на картинку-заставку интересный эффект, через GDI
Member
Статус: Не в сети Регистрация: 08.05.2006 Откуда: Москва
Сейчас начал читать Managed DirectX® 9 Kick Start: Graphics and Game Programming. Пробую что то написать. Делаю как по книге (мне так кажется, по крайней мере)
Код:
public partial class Form1 : Form { private Device device = null; CustomVertex.PositionColored [] verts = new CustomVertex.PositionColored [3]; public Form1() { InitializeComponent(); InitializeGraphics();
CustomVertex.PositionColored[] verts = new CustomVertex.PositionColored[3]; verts[0].Position = (new Vector3(0.0f, 2.0f, 1.0f)); verts[0].Color = System.Drawing.Color.Aqua.ToArgb(); verts[1].Position = (new Vector3(-1.0f, -1.0f, 1.0f)); verts[1].Color = System.Drawing.Color.Black.ToArgb(); verts[2].Position = (new Vector3(1.0f, -1.0f, 1.0f)); verts[2].Color = System.Drawing.Color.Purple.ToArgb();
Однако ничего не отображется, хотя предыдущий пример из книги, с CustomVertex.TransformedColored работал, а в данном примере я настроил камеру, как сказано в книге. В чем ошибка?
И еще, не намекнешь в личку, где найти коды примеров к книге?
Advanced member
Статус: Не в сети Регистрация: 16.11.2006 Откуда: Всегда!
Popik
1. Не показывает, потому что у тебя два буфера verts, и рендеришь ты из пустого буфера. Типичная ошибка непреднамеренного объявления локальной переменной с именем глобальной, что не дает возможность инициированному буферу использоваться за рамками блока, где он был объявлен.
2. Для того, чтобы задействовать цвет вершин, нужно явно указать рендерстейт device.RenderState.Lighting = false;, иначе треугольник будет черным.
3. С таким делением this.Width / this.Height ты не получишь корректного aspect ratio, если буфер не квадратный. Поставь у делимого или у обоих кастинг на float.
4. Выноси все константы из процедур рендеринга - у тебя все матрицы константные. Учти, что все примеры в книге и в DX SDK НЕ ОПТИМИЗИРОВАНЫ (для упрощения) по вычислению матриц камеры. Тем более все неизменяющиеся выражения должны быть вынесены за пределы блока BeginScene()... EndScene(), у тебя ведь формат вершин не меняется.
5. Invalidate() должен вызываться после окончания отрисовки, после Present(), в конструкторе формы ему делать нечего.
6. Рисование по WM_PAINT (и тем более по таймеру) - не лучший вариант. Посмотри, как на блоге того же Миллера реализован грамотный цикл. Это было в 2004 году, если что непонятно будет, то подскажу.
Рисование по WM_PAINT (и тем более по таймеру) - не лучший вариант. Посмотри, как на блоге того же Миллера реализован грамотный цикл.
Вот именно, хотя все кому не лень авторы книг используют этот метод. Нужен грамотный цикл и ещё можно в проектах С++ вообще не обрабатывать никакие оконные сообщения! По крайней мере не делать для этого отдельный цикл.
_________________ Первый огонь был получен людьми из-за перегрева. Пессимист отличается от оптимиста датой наступления конца света.
Advanced member
Статус: Не в сети Регистрация: 16.11.2006 Откуда: Всегда!
Aside писал(а):
и ещё можно в проектах С++ вообще не обрабатывать никакие оконные сообщения!
Если ты это пишешь про Винду, то, во-первых, компилятор может их скрывать, предоставляя свой интерфейс и итоговый подвиндовый код всегда содержит механизм обработки сообщений - это краеугольный камень Винды. Во-вторых, реально полезная программа вряд ли обойдется без явной работы с обработкой сообщений.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения