Pro_grammer Пользователь Сейчас: Offline
Имя: Виктор Регистрация: 16.12.2019
| Всем привет! Уверен, многие знакомы с VBS, но не многие знают, что на этом языке можно не только управляющие скрипты писать, но и полноценные 2D игры. Язык, созданный компанией Microsoft на основе языка Visual Basic( или если вам ближе QB, QBasic ), достаточно прост в изучении, не требует специальных инструментов и всегда находится под рукой. Т.е. любой файл, который имеет расширение ".vbs" система попытается интерпретировать в машинные команды и выполнить. В принципе, для написания простейшей программы понадобится только Блокнот (notepad.exe). Уверен, каждый сможет запустить его на своём компьютере! Если всё же не приходилось этого делать, то нажмите сочетание клавиш Win + R , наберите в строке notepad.exe , нажмите кнопку "OK" вы увидите окно Блокнота. Напечатайте в окне редактора следующий текст: MsgBox "Привет! Я программа на VBS"
Сохраните в любое место этот файл с именем msg.vbs. Запустите на выполнение и вы увидите на экране окошко - стандартное сообщение Widows Поздравляю! Вы написали программу на VBS. Если это ваша первая программа, и вы намерены написать свою первую настоящую игру, то вам придётся изучить кое-какие основы программирования на VBS, благо, информации о языке предостаточно. http://scriptcoding.ru/category/vbscript-znakomstvo/page/2/Достаточно будет изучить основные конструкции : переменные, циклы, условные операторы. Или вникать по ходу дела. И так, начнём. Что обычно делает любая игра? Как она выглядит? На заре компьютеризации, когда компьютеры были большие, игры были текстовые. Игра выглядела как набор повествований и вопросов , от ответов на которые зависел дальнейший ход событий и собственно исход игры. В то же время возникли псевдографические игры, это когда вы управляете какой либо буквой, и она стреляет в другую вражескую букву знаками препинания. По легенде буквы могли быть космическими кораблями, или воинами. Воображение рисовало красочные картины боя. Теперь плохие новости. У VBS совершенно нет даже такой возможности. Он не умеет рисовать даже буквы в произвольном месте экрана. Всё, на что он способен, это вывести сообщение в окошке типа MsgBox принять строку в окошке InputBox. Текстовую игру написать мы ещё сможем, например "Угадай число": Randomize
a= Rnd(1) 'переменной a присваивается случайное число от 0 до 1
a=Fix(a*10) 'переменной присваивается случайное число от 0 до 10
x=CInt(inputbox("Введите число ","Угадайте число от 0 до 10 за 3 попытки!!!"))
If x>a Then
Msgbox "Загаданное число меньше! ",vbSystemModal,"результат: "
x=CInt(inputbox("Попытайтесь угадать ещё раз: ","Осталось всего 2 попытки!!!"))
ElseIf x<a Then
Msgbox "Загаданное число больше! ",vbSystemModal,"результат: "
x=CInt(inputbox("Попытайтесь угадать ещё раз: ","Осталось всего 2 попытки!!!"))
End If
If x<a Then
Msgbox "Загаданное число больше!",vbSystemModal,"результат: "
x=CInt(inputbox("Попытайтесь угадать ещё раз: ","Осталась всего 1 попытка!!!"))
ElseIf x>a Then
Msgbox "Загаданное число меньше! ",vbSystemModal,"результат: "
x=CInt(inputbox("Попытайтесь угадать ещё раз: ","Осталась всего 1 попытка!!!"))
End If
If x=a Then
Msgbox "Вы угадали загаданное число!!! ",vbSystemModal,"результат: "
Else
Msgbox "Вам не удалось угадать загаданное число за 3 попытки!!! ", _
vbSystemModal,"результат: "
End If
То стрелять буквами в буквы точно нет. А тем более, мы собрались писать достаточно современные игры, с изображениями, музыкой и анимацией! Как быть? Обычно, даже те языки программирования, на которых серьёзные дядьки пишут настоящие программы и то не умеют ни чего такого. Для того, что бы они обрели такую возможность к ним подключают специальные библиотеки. Под Microsoft Windows для облегчения программирования игр существует DirectX. Это огромный набор API который содержит готовые классы, процедуры, функции, структуры и константы, существенно упрощающие процесс создания различного ПО, как 2D, так и 3D. Нам с вами весь этот набор не нужен. Нам нужны основные операции. Тем более только 2D - загрузка изображений, вывод их на экран, вывод на экран текста, рисование примитивов- линий, кругов, прямоугольников, воспроизведение звуков и музыки, управление всем этим хозяйством при помощи мышки и клавиатуры. В общем подобрать небольшую библиотеку, которая всё это умеет. Вторая плохая новость. VBS не умеет работать с библиотеками. Штатными средствами ну ни как не подключить внешнюю DLL. И тут опять нашлись добрые люди, которые создали библиотеку dynwrap.dll - небольшой ActiveX, который может быть использован в любых средах, которые в состоянии выступить в роли OLE-клиента в административных скриптах Windows (.vbs и .js). Описание и библиотеку можно посмотреть тут http://script-coding.com/dynwrap.html Библиотека обеспечивает подобие инструкции "Declare" в VBScript. Это позволяет вызывать произвольные функции из DLL-библиотек (например, win32 функции API). Бинго! Мы подобрались к сути того, как это возможно на VBS свободно писать 2D игры, как на любом другом языке программирования! Мы скачиваем dynwrap.dll (она есть уже в папке с игрой, её не обязательно скачивать отдельно) Регистрируем в системе библиотеку с помощью regsvr32.exe. Командная строка регистрации библиотеки (файл регистрации BAT есть в папке с игрой ) может выглядеть, например, так: regsvr32.exe "C:\WINDOWS\system32\dynwrap.dll" Далее подключаем к коду на VBS библиотеку для 2D игр (она есть уже в папке с игрой, её не надо скачивать отдельно), её регистрировать не надо, надо просто положить в папку с будущей игрой, подбираем нужные изображения, звуки, музыку, и пишем управляющий код на VBS. Синтаксис стандартный BASIC микрософт. Открыть спойлер Закрыть спойлер ' Pong VBS
Set Wrap = CreateObject("DynamicWrapper")
Rem ********** Объявления функций библиотеки 2d_game*************
Wrap.Register "g2d.dll", "RunScreen", "i=ll", "f=s", "r=l" ' открываем экран с разрешением
Wrap.Register "g2d.dll", "PrintText", "i=llsll", "f=s", "r=l" ' (x,y,text$,color=0,Size=18)
Wrap.Register "g2d.dll", "AnimateSprite", "i=lllllllll", "f=s", "r=l" ' № спрайта, координаты x,y, размер одного кадра W,H, кол-во столбцов, первый кадр, последний кадр, задержка
Wrap.Register "g2d.dll", "ExamineInput", "i=l","f=s", "r=l" ' управляет клавой, мышкой, очисткой экрана цветом Колор
Wrap.Register "g2d.dll", "InputKey", "i=l", "f=s", "r=l" ' Ждет нажатия указанной клавиши, возвращает 1
Wrap.Register "g2d.dll", "ImageLoad", "i=lsl", "f=s", "r=l" ' Грузит файл BMP,PNG,JPG и делает из него спрайт с указанной прозрачностью
Wrap.Register "g2d.dll", "PrintImage", "i=llllll", "f=s", "r=l" ' Выводит спрайт на экран
Wrap.Register "g2d.dll", "RotateSprite", "i=llllllll", "f=s", "r=l" ' Выводит спрайт на экран с поворотом на угол Im,x,y,W=-1,H=-1,Angle=0, Mode=1, Transparensy=255
Wrap.Register "g2d.dll", "GrabImg", "i=lllll", "f=s", "r=l" ' Создает новый спрайт с экрана GrabImg(img.l, x.l, y.l, Width.l, Height.l)
Wrap.Register "g2d.dll", "XMouse", "f=s", "r=l" ' возвращает х коордтнату мыши
Wrap.Register "g2d.dll", "YMouse", "f=s", "r=l" ' возвращает у коордтнату мыши
Wrap.Register "g2d.dll", "MouseKl", "i=l", "f=s", "r=l" ' Ждет клика указанной кнопки мыши, возвр 1
Wrap.Register "g2d.dll", "CollisionImage", "i=llllll", "f=s", "r=l" ' возвращает 1 если есть коллизии в спрайтах (Рисунок1,x1,y1,Рисунок2,x2,y2)
Wrap.Register "g2d.dll", "PrintBox", "i=lllll", "f=s", "r=l" ' рисует прямоугольник x.l,y.l,Width.l, Height.l,Color.l=0
Wrap.Register "g2d.dll", "PrintLine", "i=lllll", "f=s", "r=l" ' рисует линию x.l,y.l,x2.l, y2.l,Color.l=0
Wrap.Register "g2d.dll", "PrintPoint", "i=llll", "f=s", "r=l" ' рисует точку x.l,y.l,Size.l,Color.l=0
Wrap.Register "g2d.dll", "StopScreen","f=s", "r=l" ' Закрытие экрана
'**************** Конец функций 2d_game*************************
' Регистрируем API функцию Beep
Wrap.Register "KERNEL32.DLL", "Beep", "i=ll", "f=s", "r=l"
' Регистрируем API функцию PlaySound
Wrap.Register "winmm.dll", "PlaySoundA", "i=sll", "f=s", "r=l"
' Регистрируем API функцию Sleep
Wrap.Register "kernel32", "Sleep","i=l"
' GetTickCount извлекает число миллисекунд, которые истекли с тех пор как система была запущена.
Wrap.Register "KERNEL32.DLL", "GetTickCount", "r=l"
' Параметры экрана
ScrW = 800
ScrH = 600
Wrap.RunScreen ScrW, ScrH
Start = Wrap.GetTickCount()
' загрузка всех изображений
Wrap.ImageLoad 0, "plato.jpg", RGB(255, 255, 255) ' Фоновое изображение
Wrap.ImageLoad 1, "tens2.png", 0'RGB(255, 255, 255) ' шар
Wrap.ImageLoad 2, "bitaCpu.bmp", RGB(255, 255, 255) ' бита компа
Wrap.ImageLoad 3, "bitaGmr.bmp", RGB(255, 255, 255) ' бита игрока
' папка нашего скрипта
strSFN = WScript.ScriptFullName
strSFN = Left(strSFN,InStrRev(strSFN,"\"))
'заставка перед игрой
Do Until Ext = 1 ' Пока не нажата любая клавиша -
Ext = Wrap.InputKey(-1)
resi = Wrap.ExamineInput(0)
Wrap.PrintText ScrW/4, ScrH/2, "####### ИГРА Пинг-Понг #######", RGB(0, 255, 0), 15
Wrap.PrintText 5, ScrH - 20, "Для продолжения нажмите любую клавишу", RGB(255,0 , 0), 8
Stp = Wrap.GetTickCount()
itg = Stp - Start
if itg < 1000 then
f = f+1
else
fps = f
f = 0
Start = Wrap.GetTickCount()
end if
Wrap.PrintText 5, 5, "FPS = " & fps, RGB(255,0 , 0), 8
Loop
Wrap.PlaySoundA strSFN & "start.wav", 0, &H20000 or &H1
Ext = 0
Wrap.Sleep 1000 ' Задержка на 1 секунду
GameGo = 0 ' признак начала игры
Cpu = 0
Gmr = 0
sharX = ScrW/2-15 ' половина размера спрайта
sharY = ScrH/2-15
bitaGmrX = ScrW - 11
bitaGmrY = ScrH/2
bitaCpuX = 1
bitaCpuY = ScrH/2
SpeedGamer = 3
SpeedCpu = 3
SpeedSharX = 4
SpeedSharY = 4
' Главный цикл игры
Do Until Ext = 1 ' Пока не нажата esc
Ext = Wrap.InputKey(1) ' ожидание клавиши ESC
resi = Wrap.ExamineInput(0)' Опрос клавиатуры и мыши
' вывод на экран игрового поля
Wrap.PrintImage 0, 0, 0, ScrW, ScrH, 255
Wrap.PrintText 10, 10, "## Компьютер = " & Cpu & " ##", RGB(0, 255, 0), 15
Wrap.PrintText ScrW - 200, 10, "## Игрок = " & Gmr & " ##", RGB(0, 0, 255), 15
'Wrap.PrintImage 1, sharX,sharY , -1, -1, 255 ' шар на экран
Wrap.AnimateSprite 1,sharX,sharY, 30,30,4,1,16,8 ' № спрайта, координаты x,y, размер одного кадра W,H, кол-во столбцов, первый кадр, последний кадр, задержка
Wrap.PrintImage 2, bitaCpuX,bitaCpuY , -1, -1, 255 ' бита компа на экран
Wrap.PrintImage 3, bitaGmrX,bitaGmrY , -1, -1, 255 ' бита геймера на экран
if Wrap.InputKey(200) = 1 Then' нажата коавиша Вверх
GameGo = 1 ' Начало игры после движения игока ввверх
if bitaGmrY > 1 Then
bitaGmrY = bitaGmrY - SpeedGamer
end if
end if
if Wrap.InputKey(208) = 1 Then' нажата коавиша Вниз
if bitaGmrY < ScrH - 150 Then
bitaGmrY = bitaGmrY + SpeedGamer
end if
end if
If GameGo = 1 Then
sharX = sharX + SpeedSharX
sharY = sharY + SpeedSharY
' Одно очко геймеру
If sharX <= 1 Then
SpeedSharX = SpeedSharX * -1
Wrap.PlaySoundA strSFN & "over.wav", 0, &H20000 or &H1
Gmr = Gmr + 1
end If
' Одно очко компу
If sharX >= ScrW-30 Then ' минус размер спрайта
SpeedSharX = SpeedSharX * -1
Wrap.PlaySoundA strSFN & "over.wav", 0, &H20000 or &H1
Cpu = Cpu + 1
End If
If sharY <= 1 Then SpeedSharY = SpeedSharY * -1: Wrap.PlaySoundA strSFN & "blip1.wav", 0, &H20000 or &H1
If sharY >= ScrH-30 Then SpeedSharY = SpeedSharY * -1: Wrap.PlaySoundA strSFN & "blip1.wav", 0, &H20000 or &H1
' Комп следит за шаром
If sharY > bitaCpuY Then bitaCpuY = bitaCpuY + SpeedCpu
If sharY < bitaCpuY Then bitaCpuY = bitaCpuY - SpeedCpu
If Wrap.CollisionImage(1, sharX, sharY, 3,bitaGmrX, bitaGmrY) Then ' встреча с битой игрока
Wrap.PlaySoundA strSFN & "blip2.wav", 0, &H20000 or &H1
if Wrap.InputKey(208) = 1 Then
SpeedSharX = SpeedSharX * -1
SpeedSharY = SpeedSharY * -1
else
SpeedSharX = SpeedSharX * -1
end if
end if
If Wrap.CollisionImage(1, sharX, sharY, 2,bitaCpuX, bitaCpuY) Then ' встреча с битой компа
Wrap.PlaySoundA strSFN & "blip2.wav", 0, &H20000 or &H1
SpeedSharX = SpeedSharX * -1
end if
End If
' Считаем FPS
Stp = Wrap.GetTickCount()
itg = Stp - Start
if itg < 1000 then
f = f+1
else
fps = f
f = 0
Start = Wrap.GetTickCount()
end if
Wrap.PrintText 405, 5, "FPS = " & fps, RGB(255,0 , 0), 8
Loop
st= Wrap.StopScreen()' закрываем экран
Список функций игровой библиотеки указаны в комментариях при декларировании этой библиотеки. Скачивайте архив, распаковывайте в папку, к которой имеете доступ (касается систем, где не вы хозяин, а она решает, что и где вам разрешить), регистрируйте dynwrap.dll запустив regdynwrap.bat (возможно от админа!) и после чего запускайте сам файл Pong.vbs. Если тема понравится, то опубликую ещё несколько игр, типа космической стрелялки, автогонки, воздушный бой и т.п. Изменено Витаминыч (17.01 / 19:25) (всего 1 раз)
Прикрепленные файлы: VB_pong.zip (152.94 кб.) Скачано 163 раза screen.jpg (23.06 кб.) Скачано 167 раз screen1.jpg (57.98 кб.) Скачано 122 раза scrin.jpg (135.33 кб.) Скачано 132 раза |