Некоторые интересные возможности графики в Visual Basic Express
Итак, что вам понадобится - это установить Visual Basic Express 2010 .NET. Его можно установить, скачав с сайта Майкрософт бесплатно. Также доступна бесплатная русская версия. Если вы более продвинутый и опытный программист - можете установить весь Visual Studio 2010 Express - в любом случае это программа бесплатная, хотя и от самого Майкрософт.
Итак, вы установили Visual Studio 2010 Express .NET. Несколько слов из истории. Прежде всего о языках программирования и о Бейсике. Как известно языки программирования появились приблизительно в одно время с компьютерами - где-то в 50-х годах 20-го века. Одними из первых языков был ассемблер или просто машинный код. Программа выглядела как набор единичек и ноликов, объединенных в две большие группы - это комманды для процессора и других устройств - позднее - для видеокарты, звуковых устройств, для вывода на экран и так далее. Вобщем, поскольку, первые компьютеры были совсем простыми - у них было мало памяти - все это исчислялось в килобайтах или может быть в мегабайтах - то можно было делать программы на ассемблере или на таких языках как Си. Конечно, языки программирования прошли развитие, и теперь можно создавать сложные программы, приложения, игры - о чем можно было только мечтать лет 50 назад. Причем все это становится теперь бесплатным, поскольку все эти разработки стали описаны, документированны. Например, программы для создания шахмат были ранее закрыты, однако теперь любой человек может создать такую игру, и мало того - даже заработать на этом деньги. Конечно, не идет речь об воровстве авторских прав и разработок, а скорее об испольховании опыта предшественников. Аналогично, есть разные книги по программированию игр, которые описывают - что внутри таких известных игр как Doom. То есть вы можете сами создать свою игру, теперь - более-менее современного, даже зарубежного уровня.
Итак, но что делать, если вам недоступны дорогие программы для разработки игр? Ведь часть "игровых движков", на которых создаются тысячи игр - не такие уж и бесплатные. Конечно, движки для создания простых игр - начиная от DOS, и заканчивая играми с простой графикой типа CGA, EGA (то есть с небольшим колическтво цветов, как например на некоторых современных мобильных телефонах) - легко доступны. Сами программы занимают немного памяти - вы можете их себе скачать, установить и создавать простенькие игры. Но недостаток таких создавалок игр в том, что они часто могут ограничить круг игр, которые можно с их помощью создавать. Конечно, есть универсальные создавалки игр, движки - на них как будто можно создать игры почти любого жанра, но все равно это будет игра. Что делать, если у вас более серьезные цели - например, вам нужна образовательная игра? В любом случае, вам приходится иметь дело с теми средствами разработки, которые вам предлагают, или же вы должны создать свой язык программирования, свой движок, или может быть даже свою платформу для своего оборудования (например какой-то свой iPad или iPhone), но все это обычно кажется нереальным для обычного человека работающего водиночку. Если вы просто занимаетесь разработкой игр - как хобби, то скорее всего вам придется все таки пользоваться бесплатными или условно-беслпатными программами. Они не всегда предлагают возможности 3-мерного можелирования, но создать 2-мерную игрушку - это вполне реально. Но если вы наблюдательный человек - вы можете заметить, что все создавалки игр очень похожи друг на друга - у всех них есть подобные черты, которые, конечно же обуславливаются тем, что разрабатываются игры. Итак, поскольку в любой игре есть какие-то уровни, то в игровых движках обычно будет предусмотрена возможность создавать и редактировать уровни. Кроме того, конечно же, в игре должно быть управление вашими персонажами, или игроками. Упарвлять возможно или как обычно - с клавиатуры или мышкой, или же передать возможность управления самому компьютеру, написав для этого код - игровой искуственный интеллект (то есть это - имитация настоящего интеллекта человека). Понятно, что это - задача не из легких. Существует множество книг и учебников по искуственному интеллекту, в том числе и применительно к играм. Но все они сводятся к тому, что просто нужно описать, как двигаются или поводят себя те или существа в вашей игре. Ведь мы говорим об интеллекта, а он может быть только у существа, а в играх мы как раз это и моделируем. Итак, для разработки игр может быть нужно также знание психологии, философии - чтобы понимать с чем вы имеете дело, чтобы оценить реально сроки, оценить ваши силы. Ведь бывает так, что сроки предполагаются одни, но разработчик в них не укладывается. Даже если посмотреть на такой пример - один шахматист разрабатывал свою программу игры в шахматы, но он так и не смог ее сделать после многих лет разработок. Итак, переходим к возможностям языков программирования.
Одна из самых распространенных сегодня платформ - это Microsoft Windows, поэтому можно с некоторй уверенностью сказать, что если вы будете разрабатывать под эту платформу - у вас есть шансы на некий успех, по крайней мере вас могут заметить. Другая сторона этого - да, на фоне очень большого количества программ и игр для Windows, - ваша идея может оказаться незамеченной, поскольку она плохо реализована или имеет любые другие недостатки. Например, вы создаете текстовую игру, или игру в 2d, без анимации, используете обычные растровые изображения для ваших персонажей - вместо векторных. Объясню - векторная графика значит, что ваши персонажи описываются формулами - это значит что вы можете изменять масштаб, - увеличить, уменьшить изображение на экране - но не потерять качество. Если вы увеличите изображение, созданное в векторном виде, то вы не увидите пикселов-квадратиков. Конечно, важны также текстуры - без них ваши объкты будут просто "скелетами" без кожи. Поэтому нужны вам и редакторы для разработки текстур, и для моделирования разных объектов. Благо - множество обхектов доступно бесплатно - вы можете найти в интернете беспланые модели людей, разных существ, тем более - неживых объектов. Но все это интересно только если в игре присутствует динамика. Должны происходить какие-то изменения. Даже если вы делаете простую игру в шахматы или сапер или что-то такое - вам все-равно нужно задавать формулами те или иные события в игре. Итак, мы пришли к выводу, что в игре могут быть два вида формул - один - это для описания данных, другой - для описания комманд. Это аналогично тому, как все это представленно в компьютере, в ассемблере - есть комманда для выполнения, и есть данные, необходимые для этой комманды. Применительно к играм, можно сказать, что данными у вас будут все возможные объекты и/или субъекты на экране - как живые так и неживые, как те, которыми вы можете управлять сами, так и те, которыми будет управлять компьютер ("ИИ"), используя ваш код. Благо, если часть всего этого сделают за вас другие - например в игровом движке вам не нужно самому изобретать колеса - как же запрограммировать движение. Кроме всего прочего, необходимо учитывать, что в программе будет очень много условий - зависимо от тех или иных событий, действий в игре - Искуственный интеллект должен соответствующим образом реагировать. И все это нужно прописать явным видом, ведь понятно, что даже Windows глючит, что уж говорить о том, чтобы создать Искуственный интеллект, пусть даже и игровой.
Но опустимся на Землю. Заканчиваем с историей и теорией и переходим к практике. Итак вы поставили себе Microsft Visual Basic Express. Это хорошо, потому что вы можете создать программы для Windows - ведь именно это система одна из самых популярных. Теперь перейдем непосредственно к графике. За графику в Visual Basic отвечает класс "Graphics". Нам не важно как это называется класс или что-то еще - вобщем это некоторая абстракция, введенная просто для того, чтобы легче было работать с графикой. В бейсике можно создавать много таких экземпляров классов графики. Мы для простоты будем использовать одну переменную. Чтобы задать ее для всей программы, просто можете создать новый проэкт, и перейдя в код (обычно это файл From1.vb) после первой же строчки (это объявление "класса" вашего окна или приложения - здесь название вашей программы|игры, например - Public Class My2dAnimatedColorGame) можно написать - Dim gr As Graphics. Dim означает что в памяти выделяется место для отдельной переменной, gr - это название вашей переменной. Вы можете вместо этой строки написать например Dim My2dAnimatedColorGameGraphicsVariable As Graphics - от этого суть не изменится. Вконце-концов, когда вы скомпилируете программу и создадите exe-файл (рекомендуется использовать построение - опубликовать - программа сама создаст установочную программу - вы ее можете выложить в интернете, причем не переживать о копирайтах - ведь сам Visual Studio (Basic) Express - бесплатный) - все эти имена переменных будут преобразованы в какой-то зашифрованный код, и вы не будете иметь с ними дело. Единственное, что эти названия могут сохраниться при простой компиляции без шифрования - именно так любители reverse engineering, то есть "обратной разработки" могут вытащить из вашей программы все что вы создали, даже названия ваших переменных и прочего. Но мы сейчас не об этом (хотя думать об интеллектуальной собственности все равно вам придется если вы выкладываете игру в общий доступ или продаете ее).
Итак, когда у вас есть переменная gr, вы можете применить ее разными способами для создания графики. Самое простое - это просто взять и нарисовать используя эту переменную - какую-то простую графику. Например, линию, круг, прямоугольник и так далее. Вы можете посмотреть список всех доступных возможностей этого класса просто написав в коде название переменной и поставив после этого точку - автоматически выпадет список возможных комманд. Да, есть одна деталь, я пропустил - в обявлении "Dim gr As Graphics" вы пишете As Graphics - это значит, что вы создаете переменную именно класса Графика (Graphics), а не другого. Все это еще сложнее в языках, таких как си, хотя некоторые умельцы даже пишут графику на ассемблере - в виндовз и достигают неплохиз результатов - по крайней мере по скорости работы и по элегантности кода. Но если же вы создаете какую-то серьезную 3-мерную игру, вам ассемблер может быть слишком сложен. Конечно, практически нет разницы в каком языке делать игру или графическую програму - главное чтобы вы расценивали свои знания, силы, возможности и так далее. Мне проще это делать в Visual Basic, поскольку это сразу дает поддержку (в отличие от малодокументированных ассемблеров - эти языки программирования могут быть почти не поддерживаемы, особенно если они разрабатываются энтузиастами или любителями, кстати против которых и выступал Билл Гейтс, хотя это тоже спорно).
Итак, давайте сделаем простую графику в Visual Basic. Можно не добавлять никаких кнопочек и прочих элементов - вконце-концов, если вы когда-то перейдете на DirectX, OpenGL - то вы скорее всего будете работать в полноэкранном режиме, и вам не нужны будут все "прелести" визуальной оболочки разработки. Также вы можете перейти на Си, однако будьте готовы к разным усложнениям синтаксиса по сравнению с бейсиком.
Итак, мы используем обычные средства Visual Basic Express. В эту систему включены обычные средства работы с графикой - это двухмерная графика, простые векторные объекты. Кроме того, вы можете отображать на Graphics - также и изображения.
Давайте сделаем простые упражнения. Например, нарисуем картинку в месте щелчка мышкой на нашей форме. Выберите главную форму в визуальном редакторе, и в окне свойств выберите события. Здесь вы видите список разных событий, которые происходят в связи с вашей формой. Нас бует особенно интересовать движение мышки - за это отвечают несколько событий - щелчок, двойной щелчок, надатие кнопки, отпускание кнопки, а также MouseMove - движение мышкой. Вы можете легко создать, например, строку состояния, и по перемещению мышки выдавать там текст - где находится ваш курсор - такие-то x, y. К сожалению, вам придется работать с 2-мерной графикой в Visual Studio. Если хотите трехмерной графики - вам придется ее делать или вручную используя средства Graphics - но это достаточно безумная идея. Поэтому вам придется выучить хоть что-то из DirectX от того же Майкрософт. Или же OpenGL - что почти одно и то же, хотя конечно это зависит от вашего выбора. Или как вариант вы можете использовать какой-то игровой движок, и если вы его подключите к Visual Studio - скорее всего к Visual C, - то вы можете получить более менее современную среду разработки 3-мерной графики.
Итак, давайте попробуем нарисовать какой-то объект на нашей форме. Для этго мы создадим еще одну переменную - MouseDown. Зададим ей структуру Point - Dim MouseDown As Point. Point - это довольно хорошая структура - в ней хранится в частности такая информация как x и y. Чтобы было понятно, это - просто точка на нашем "холсте", в которой будет производиться рисование. Конечно, если вы зададите ее в Graphics. Например, чтобы нарисовать линию от точки1 до точки2 вам нужно использовать комманду - gr.DrawLine(цвет, точка1, точка2). Но перед этим вам нужно создать объект графика. Это делается просто - по комманде gr = Form1.CreateGraphics (вместо From1 - название формы если вы ее перейменуете). Итак, вам нужны два события, в Form1 выбираем MouseDown, щелкаем два раза, и для вас создастся новое событие - Form1_MouseDown. В нем вы можете написать MouseDown.X = e.X, а также MouseDown.Y = e.Y. Так, каждый раз когда над формой вы будете нажимать кнопку - ее значение будет созраняться в переменной MouseDown. А теперь, создайте еще одно событие - Form1_MouseUp. Напишем здесь - Dim MouseUp As Point, MouseUp.X = e.X, MouseUp.Y = e.Y, gr = Form1.CreateGraphics, а после этого - собственно то, что мы хотим нарисовать - gr.DrawLine(Pens.Black, MouseDown, MouseUp).
Итк у вас должен получиться простой результат - вы нажимаете кнопкой мышки на форме - точка сохраняется в память. Когда вы кнопку отпускаете - записывается также и эта координата, плюс создается графический объект - графика - он инициализируется в связи с переменной Graphics. Глобальные переменны, одна - для графики, другая - для координаты нажатия кнопки мы объвили. Так, вы получаете простой редактор - если вы измените цвет - вы можете рисовать любым из основных цветов - их несколько десятков. Конечно, это не полноченная цветная графика. Поэтому все же лучше использовать что-то типа ДиректХ, но это другой уровень.
Еще одно, давайте теперь нарисуем картинку из файла. Добавим диалог выбора файла - в конструкторе выберем OpenFileDialog, и создадим такой объект. Теперь по отпускании кнопки мыши добавим такую строку - OpenFileDialog.ShowDialog(). Задайте в свойтсвах типы фалов - *.* или какие-то графические форматы. Когда появится диалог выбора файла - вы можете выбрать картинку. Теперь добавьте еще одно событие - OpenFileDialog_FileOk. После удачного выбора файла запустится этот код. Вы можете добавить строку Dim Kartinka As Image = Image.FromFile(OpenFileDialog.FileName.ToString). В переменную "картинка" будет загружена картинка из файла. Теперь мы ее просто отобразим в месте щелчка - gr = Form1.CreateGraphics, gr.DrawImage(Kartinka, MouseDown).
Итак, написав всего десяток строк вы можете понять, что программировать в Visual Basic графику - совсем не сложно, и даже увлекательно. Но если вы хотите больших возможностей, конечно же вам нужно использовать более серьезные средства (DirectX, OpenGL). Если хотите - вы можете также поэкспериментировать с таймером - вы можете загрузить вторую картинку, созранить ее в какую-то переменную, а в таймере выставить изменение картинки через интервалы времени. Этот прием используется во многих игровых движках, особено если речь идет о растровой графике. Вы просто загружаете несколько видов одного и того же объекта - спарва, слева, спереди, сзади, по диагоналям - и зависимо от направления движения человечка - вы будете показывать то или иное изображение. Для этого сойздайте объект Timer. Мы сделаем просто - на экране будет отображаться та или иная картинка, через интервал в 1 секунду. Такое себе слайд-шоу. Интервал уже задан - 100 миллисекунд, поставим 1000 - ведь в секунде - 1000 миллисекунд. Теперь создадим событие Timer1_Tick. Единственное, давайте еще добавим в событие MouseUp - еще одну картинку. Для этого добавим еще один диалог - OpenFileDialog2, и по MouseUp будем теперь показывать диалог2 - OpenFile2Dialog.ShowDialog(). В OpenFileDialog_FileOk аналогично первому файлу напишем - Dim Kartinka2 As Image = Image.FromFile(OpenFile2Dialog.FileName.ToString). Итак, это вторая картинка. Теперь очень важный момент. В Visual Basic есть такая интересная возможность - использование библиотеки ищображений. Это своеобразные редактор ресурсов. Единственное неудобство - изображения должны быть одного размера или они преобразуются в одинаковые автоматически. Но для анимации так и нужно, по крайней мере если у вас простая растровая анимация. Итак выберем в списке элементов управления элемент ImageList и добавим его в программу. В ImageList1 в Images нажмем три точки и добавим два файла - теперь нам не нужно каждый раз открывать файлы заново, указывать их каждый раз. Но это удобно, если у вас эти файлы уже созданны, и кроме того - если вы не хотите изменять их во время игры. Если вы добавите зотя бы две картинки в библиотеку картинок - вы можете их показывать одну вместо другой по таймеру. Итак, напишем для этого код. Зайдем в Timer1_Tick. Напишем здесь аналогично - gr = Form1.CreateGraphics. Теперь нужно задать условие - какая картинка будет показываться по какому событию. Можно просто сделать переменную Dim GoForward as Boolean = True - как глобальную. По каждому кликанию таймера вы можете ее изменять на противоположную - GoForward = Not GoForward. Теперь, ставьте условие - If GoForward = True Then gr.DrawImage(ImageList1.Images(0), MouseDown.X, MouseDown.Y), а вторую картинку мы показываем в другом случае - If GoForward = False Then gr.DrawImage(ImageList1.Images(1), MouseDown.X, MouseDown.Y). Как видите, разница только в том, что в скобках пишутся разные индексы то есть номера изображений. К сожалению (или к счастью?), нумерация производится с нуля, поэтому пишем ноль и 1, а не 1 и 2 соответственно. Если же у вас более сложное изображение, вид не только в двух сторон - нужно указать все другие изображения. Если же вы хотите это делать не столько по таймеру, сколько зависимо от события - например, вы двигаетесь прямо или в другую сторону - то нужно создавать проверки для этих условий. Но это уже для более сложных программ и игр.
Итак, в этом простом уроке вы можете научиться, как создавать простейшую графику в Visual Basic Express. Вы можете отслеживать движение курсора, нажатие кнопок (для разных кнопок - правой, левой, средней, колесика - есть соответствующие комманды), и в зависимости от этого рисовать графические обхекты в том или ином месте экрана. Простой такймер помогает отображать простейшую анимацию - изменение одного изображения на другой. Ричем для этого вам не нужно никакой дополнительный редактор игр - вы можете это запрограммировать сами. Вобщем, из этого урока становятся понятны возможности и ограничения Visual Basic для создания игр и графики - вы можете создавать простую растровую или даже векторную графику, возможно даже псевдо-3-мерную (если напишете для этого код), но все это будет отображаться через двухмерный класс Graphics. Но если вы ограничиваетесь простыми играми - например логическими, то этого для вас может быть достаточно. Даже чтобы написать игру шахматы или шакши - этого также достаточно - вы можете даже анимировать ваши шахматные фигуры. Видели 3-мерные шахматы? Приблизетельно так же вы можете понять, как работает игровой искуственный интеллект. Вы задаете движение ваших героев по той или иной траектории, по тем или иным координатам. За это отвечают событие MouseUp. Если вы добавите проверку того, что у вас под курсором - вы сможете выбирать объекты, перемещать их, но для этого нужно записывать координаты объектов в разные переменные.
Статья написана с точки зрения программиста, поэтому не судите строго.
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Некоторые интересные возможности графики в Visual Basic Express», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Вариант 2: Public Class Form1 Dim gr As Graphics Dim GoForward As Boolean = True Dim MousePoint As Point Private Sub Form1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove MousePoint.X = e.X MousePoint.Y = e.Y End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick GoForward = Not GoForward gr = Me.CreateGraphics gr.Clear(Me.BackColor) Dim imageNum As Integer = GoForward + 1 gr.DrawImage(ImageList1.Images(imageNum), MousePoint) End Sub End Class Задаем в свойствах таймера - enabled, то есть при запуске программы тамер будет включен. Картинка будет показываться в углу - в координате 0,0, если курсор не навести на форму. Нам это подходит. Добавляем событие MouseMove (например вместо MouseClick, или дополнительно к нему), и по перемещению курсора картинка будет показываться под курсором. Можно поставить таймер чаще, например 500, тогда картинка будет меняться чаще. Если вы знакомы с кино, то вам будет понятно, что в кино картинка меняется часто, 24 кадра в секнду (или даже чаще). Поэтому вы можете прорисовать плавные изменения от одного состояния объекта к другому, и поставить таймер еще более частым. Тогда анимация будет более реалистичной, но вам тогда надо добавить кол-во кадров. Кроме того, надо более качественно прорисовывать картинки и принимать во внимание отличия одной картинки и другой. Тогда будет достигнут более реалистический эффект.
Public Class Form1 Dim gr As Graphics Dim GoForward As Boolean = True Dim MousePoint As Point Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick GoForward = Not GoForward gr = Me.CreateGraphics gr.Clear(Me.BackColor) Dim imageNum As Integer = GoForward + 1 gr.DrawImage(ImageList1.Images(imageNum), MousePoint) End Sub Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick MousePoint.X = e.X MousePoint.Y = e.Y Timer1.Start() End Sub End Class
в программе нужно лишь добавить два обхекта - таймер и список изображений. В списке изображений поставьте размер изображений побольше - например 64 на 64 вместо стандартных 16 или другой, зависимо от ваших изображений. В свойствах таймера можно поменять любое значение интервала - 1000 - картинка будет меняться раз в секунду. И нужно добавить два события - щелчок на форме, плюс тикание таймера. При щелчке на форме записываются координаты щелчка, и запускается таймер. При тиканию таймера запускается изменяется значение переменной (вы можете загрузить хоть 100 изображений, только вам надо добавить каунтер, счетчик. Это делается в Си при помощи комманды ++, единственное - надо сделать проверку на максимальное число, иначе будет ошибка). Итак, по тиканию изменилось значение на противоположное - для простоты. Потом оно преобразовывается в число. Это число мы напрямую используем для указания номера картинки. Единственное - добавляем единичку, ведь False - это -1. При каждом тикании экран очищается - для простоты - комманды Clear. Можно использовать более сложный процесс очищения экрана фоновым цветом, но нужно указать по крайней два числа - точка рисования плюс размер. Итак, получилась простая программка на Бейсике, которая может показывать две картинки как слайдшоу в месте щелкания мышки. Можно применять в играх - например для каких-то героев, которыми управляют мышкой. Анимацию же можно использовать для других целей - например для фоновых персонажей и так далее. Если вы хотите трехмерную графику - будет сложнее - тогда возможно ImageList-ом не обойтись. Но принцип тот же - по какой-то формуле изменяется изображение - или оно векторное или растровое, или оно двухмерное или трехмерное и так далее (цветно, черно-белое неважно).
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]