если кому то они будут надо пишите в этой теме) будем вместе соображать)
и так начнем), качаем *(у кого не скачено демо версия) запускаем выбираем скачать можно тут если вы хоть раз юзали бейсико-подобный язык(например pure бейсик)), или вообще знаете что такое программирование то в первом уроке у вас проблем не будет точно
предлагаю просто повторить один из уроков по xna для си шарпа (c#) как вообще загрузить спрайт( изображение) и заставить его двигаться.
для начала создадим новый проект нажатием в меню new projeсt, или на загрузке меню приветствия(без разницы) см. скрин
перед вами появится окно выбора шаблона(его скринить не буду)) выбираем ну...... например agk portait project, честно сказать я сам даже не знаю в чем разница между всеми этими шаблонами, думаю что в платформах и разрешении(кто в курсе скажите)) среда этого движка подготовит нам пару файлов main.ags, и setup.ags.
начнем с разбора setup.agc исходный код его
Code
rem rem ----------*** AGK Setup File ***---------- rem rem NOTE: This file is used by the core binary rem to configure basic setup values required rem prior to execution of the AGC source code. rem No spaces allowed beyond this point:
rem Window title (delete to hide window bar) title=My AGK Portrait Application
rem Specify the initial device width width=320
rem Specify the initial device height height=480
// Specify whether to use fullscreen mode fullscreen=0
в нем хранятся всего три параметра
тут я ваще думаю не нужно комментировать ну да ладно обсудим) первый параметр, или переменная titile это то что будет отображаться в заголовке приложения далее идет параметр, или переменная width это ширина экрана девайса, и height это высота девайса.(стандартный такой телефон современный)))
и параметр fullscreen отвечает за то как наше приложение будет выглядеть(хз зачем это для телефона ведь мы уже указали разрешение экрана))) (знатоки объясните)) вообщем если туда вместо нуля поставить 1 то на компе оно запустится в полно экранном режиме.
все что перед словом rem это комментарии в стиле бейсика) раз пошла такая пьянка сразу скажу что комментарии можно писать и другими способами например: всем языкам известный си подобный его еще называют
Code
//одно строчный /* много строчный */ 'можно даже так)) но не советую, такой комент даже среда эта не подсвечивает но это возможно)), из личного опыта.
ну и главный файл нашей игры main.agc
Code
rem rem AGK Application rem
rem Portrait App SetDisplayAspect( 0.66 )
rem A Wizard Did It! do Print("hello world") Sync() loop
тут сперва идет коммент а потом не понятная функция), и цикл с заколебавшим всех начинающих программистов словом)) че эта функция делает я толком объяснить не могу(так как сам плохо понял), ну попробуйте сами поменять значение дробной например на 22 , и запустите проект она вам покажет не полную часть этих двух слов, думаю зачем она нужна понятно?) если нет идем в справку переводим читаем)
ну... глубоко вдохнув начнем писать нашу первую игру) по мотивам одноименного рассказа про xna только не много по круче)
для начала не чего менять не будем и загрузим спрайт и отобразим его на экране с настройками которые подготовила нам agk, за одно и поймем нафига та функция в самом начале).
сохраним проект (по умолчанию он хранится там где мы его создали в самом начале) (сорри об этом я не писал посчитал это не нужной процедурой) )
берем любой спрайт я возьму этот и кидаем его в папку media среда сделала её за вас, если это не так то создаем в ручную эту папку где лежит наша игра, то есть где главный файл main
пишем функцию которая грузит спрайты
Code
Ball1 = LoadImage("ball1.png")
сразу хочу сказать что тут нет такого строго типа как например в шарпе), тут можно писать встроенные функции как вам захочется, тоесть можно было написать эту функцию например так
Code
//LoAdImAgE("ball1.png")
обратите внимание на то как мы загрузили спрайт, в переменной ball сейчас хранится id этого спрайта, давайте посмотрим на него)
пишем:
Code
print (ball1)
для тех кто пока не понимает весь код)
Code
rem rem AGK Application rem
rem Portrait App SetDisplayAspect( 0.66 ) loadimage("ball1.png") rem A Wizard Did It! do Print("hello world") print (ball1) Sync() loop
после слов "hello world " нам показало 10001 должно быть)) это и есть id спрайта. если загрузить еще один спрайт в другую переменную, и вывести на экран то уже покажет цифру 10002, проверим? пишем сразу после того где грузили первый спрайт.
Code
ball2 = loadimage(ball1.png)
и в главном цикле сразу после функции вывода id первого спрайта пишем:
Code
print (ball2)
для ленивых полный код)
Code
rem rem AGK Application rem
rem Portrait App SetDisplayAspect( 0.66 ) ball1 = loadimage("ball1.png") ball2 = loadimage ("ball1.png") rem A Wizard Did It! do Print("hello world") print (ball1) print (ball2) Sync() loop
думаю понятно всем стало зачем я привел эти примеры)) если нет то попробую объяснить, нужны они для того чтоб понимать к какому мы спрайту в данный момент обращаемся.
а теперь момент истины)) пробуем нарисовать этот мяч*(хз че там у вас у меня мяч) сразу после загрузки спрайта пишем
Code
createsprite(ball1)// создаем объект спрайта
в главном цикле пишем
Code
//не забудьте удалить долбанутые слова типо привет мир), и всю нашу писанину с идентификаторами setspriteposition(ball1,35,35)
как обычно весь код:
Code
rem rem AGK Application rem
rem Portrait App SetDisplayAspect( 0.66 ) ball1 = loadimage("ball1.png") createsprite(ball1) rem A Wizard Did It! do
setspriteposition(ball1,35,35) Sync() loop
функция setspriteposition(id,x,y) позиционирует спрайт с указанным id в координатах (х , y) опля спрайт то увидели?) а теперь пробуйте менять дробную самой первой функции), и вы точно наверное поймете зачем она нужна, поменяйте её так например 0.10), да и так и оставьте норм размер.
продолжим.... теперь удалим функцию SetDisplayAspect( ) и вставим эту) за место неё setvirtualresolution(320,480) это функция больше подходит для телефонов, по экспериментируйте с ней меняя разрешение. //на данном этапе нам уже понадобятся переменные для того чтоб знать где ваше наш мяч в данный момент находится)
//пишем до главного цикла
Code
//координаты x,y x as integer y as integer
//скорость ispeedX = 5 ispeedY = 5 CountClick as integer
чего мы сделали? объявили переменные целого типа, x и y нам известны только при старте программы, но нам нужно чтоб мяч двигался, по этому его координаты мы пока только объявили. и объявили переменную CountClick она у нас будет отвечать за количество кликов по нашему мячу) весь код по традиции))
//скорость ispeedX = 5 ispeedY = 5 CountClick as integer
do
Sync() loop
пора запускать наш мячик)
пишем в главном цикле:
Code
setspriteposition(ball1,x,y) x = x + ispeedx y = y + ispeedy
тут мы просто в главном цикле к позиции спрайта добавляем скорость), и мяч постоянно движется, но пока он просто улетает за экран и его не видно потом сделаем так чтоб он отскакивал сперва от нижнего края экрана, пока самым примитивным образом)
тут есть один момент) который нужно знать, всегда если мы загружаем спрайт функцией LoadImage() то начальные координаты спрайта считаются 0,0 то есть самый левый верхний угол существует еще функция загрузки спрайта которая загружает спрайт, у которого начальные координаты начинаются от центра, это удобно например если нужно вращать его( пример колесо), не помню название функции)), как вспомню пропишу сюда))
и тут началась логика))
Code
if (x < 0 ) then ispeedx = abs(ispeedx) if (y < 0 ) then ispeedy = abs(ispeedy) if x > (GetDevicewidth() - getspritewidth(ball1)) then ispeedx =- abs(ispeedx) if y > (GetDeviceheight() - getspriteheight(ball1)) then ispeedy =- abs(ispeedy)
в этой части мы проверяем не улетел ли наш мяч за экран, то есть если положение мяча меньше 0 то мы просто берем мяч и приводим его координаты к абсолютному числу кому не понятна функция абс прошу сюда
//скорость ispeedX = 5 ispeedY = 5 CountClick as integer
do
setspriteposition(ball1,x,y) x = x + ispeedx y = y + ispeedy
//отскок мяча от края экрана if (x < 0 ) then ispeedx = abs(ispeedx) if (y < 0 ) then ispeedy = abs(ispeedy) if x > (GetDevicewidth() - getspritewidth(ball1)) then ispeedx =- abs(ispeedx) if y > (GetDeviceheight() - getspriteheight(ball1)) then ispeedy =- abs(ispeedy)
Sync() loop
скомпилируйте и за пустите игру) мяч будет отскакивать от стенок, причем мы это сделали довольно примитивным методом)
пару слов о функциях которые использовались в двух проверках)
если вы знаете хоть не много англ язык то сами должны понять что это за функции) для тех у кого с этим проблемосы попробую объяснить, GetDevicewidth() возвращает ширину экрана getspritewidth(id) возвращает ширину спрайта, id спрайта параметр функции ну и похожие две функции соответственно возвращают высоту спрайта, и экрана
то есть проверка по оси х(например) выглядит так: если наш спрайт по оси х(не забываем у нас спрайт позиционирован так что там стоят координаты переменных х , и y)больше чем ширина экрана - ширина самого спрайта, (это трудно понять для начала но если хорошо по думать то все станет ясно)))), ведь наш спрайт начинается с координат 0,0
настал черед нашей уже наверное забытой переменной) которая отвечает у нас за кол-во кликов) по нашему мячику, но нам нужна будет еще одна переменная.
назовем её IspID кстати первая буква i означает тип переменной, в данном случае это целое число, это совсем не обязательно ставить букву "i" перед каждой переменной я это делаю для удобства, для того чтобы знать какого типа переменная, до главного цикла её объявим сразу за переменной CountClick
Code
if ( GetPointerPressed ( ) = 1 ) then IspID = GetSpriteHit ( GetPointerX ( ), GetPointerY ( ) )
разберем эти функции и вообще че это такое))
функция GetPointerPressed ( ) возвращает 0 если не нажали на экран, или 1 если нажали(true,false ей аналог) GetPointerX ( ) возвращает координаты по оси х того места на девайсе где ткнули пальцем))), ну и та же функция для оси y то есть эта проверка на то что: если нажали на экран то записываем в переменную IspID id спрайта
Code
if (getspriteimageid(ball1)) = (IspID) CountClick= CountClick+1 setspritecolor(ball1,random(1,255),random(1,255),random(1,255),100) IspID=0
endif
тут все еще проще)если id спрайта совпадает с id спрайтом этого же спрайта)))) если они совпадают то меняем цвет функцией setspritecolor(id,цвет,цвет,цвет,прозрачность), в которых прописаны случайные числа от 1 до 255 и обнуляем переменную IspIDдля того чтоб наш мяч не зациклился на рандом цвете)) полный код:
//скорость ispeedX = 5 ispeedY = 5 CountClick as integer IspID as integer
do
setspriteposition(ball1,x,y) x = x + ispeedx y = y + ispeedy
//отскок мяча от края экрана if (x < 0 ) then ispeedx = abs(ispeedx) if (y < 0 ) then ispeedy = abs(ispeedy) if x > (GetDevicewidth() - getspritewidth(ball1)) then ispeedx =- abs(ispeedx) if y > (GetDeviceheight() - getspriteheight(ball1)) then ispeedy =- abs(ispeedy)
if (getspriteimageid(ball1)) = (IspID) CountClick= CountClick+1 setspritecolor(ball1,random(1,255),random(1,255),random(1,255),100) IspID=0
endif //ну и просто выводим количество кликов по спрайту(у нас же есть переменная которая считает наши клики по спрайту)
print ("click") print(CountClick) Sync() loop
для загрузки перед игрой можно использовать картинку она должна наызватся так AGKSplash.png не обязательно png но название должно быть таким для фона нужно иметь картинку совпадающую желательно с размерами экрана, и загружать нужно её самую первую например так
Code
CreateSprite ( LoadImage ( "bg.jpg" ) )
кстати демо версия работает на ура уже второй месяц.), единственный минус это не могу обнову скачать и обновится ваше да и друзья не могут по тестить приложение)
для того чтоб использовать звук например при клике на спрайт, нужно его сперва загрузить до главного цикла загрузить сам звук, например сразу после объявления всех переменных
Code
fx = Loadsound( "BLIP1.WAV" )
И затем в нужном месте его вставить, например там где мы нажимаем на спрайт
Code
if (getspriteimageid(ball1)) = (IspID) CountClick= CountClick+1 setspritecolor(ball1,random(1,255),random(1,255),random(1,255),255) IspID=0 //добавить эту строку PlaySound( fx )
с праздником всех женского пола)))
Сообщение отредактировал arrow25 - Четверг, 12 Июля 2012, 05:45
как высчитать процент(например )попаданий, то есть есть одно число и есть еще одно, заранее они просто не известны(например сколько раз я ткнул на определенный спрайт и с сколько раз я ткнул не на него, т.е мимо)??)
В процессе игры подсчитываешь общее количество кликов и количество кликов по спрайту. В конце, делишь количество кликов по спрайту, на общее количество кликов и умножаешь на 100.
Вообще вопросы нужно задавать в отдельных темах, а конкретно этот вопрос нужно задавать гуглу, потому что должно быть стыдно.
По поводу уроков по AGK, то они однозначно нужны и кому-нибудь пригодятся, но уроки нужно оформлять так, чтобы было удобно читать. Любой дурак может написать программу, которую поймёт компилятор. Хорошие программисты пишут программы, которые смогут понять другие программисты.
спасибо за ответ, по поводу уроков учту), просто это первый урок в моей жизни который я написал, скорей всего я его до оформлю. по поводу стыдно): мне ни разу не стыдно спросить про это, я даже не стыжусь говорить о том что мое образование всего 8 классов обычной школы. про google конечно понятно, что лучше спросить у него но я же спрашиваю именно про игровой процесс), зачем тогда вообще этот форум и сайт есть?
Добавлено (08.03.2012, 07:20) --------------------------------------------- апну тему, так как до оформил её)
Сообщение отредактировал arrow25 - Четверг, 08 Марта 2012, 04:37
Вот это уже другое дело. Любой дурак может написать программу, которую поймёт компилятор. Хорошие программисты пишут программы, которые смогут понять другие программисты.
да я сам в шоке), сча еще думаю добавить звук и какой то логический конец с алгоритмом который ты мне подсказал алхимик у тя случаем он не установлен?) а то чето звук не могу воспроизвести,при клике на спрайт, ошибку выдает(( или допилить этот урок), так то отскок от стен можно одной функцией сделать)), ну по старинке думаю лучше будет разобрать код че там ке чему кто бы с переводом справки помог было бы ваше суперски)())
Добавлено (11.03.2012, 00:31) --------------------------------------------- нашел интересное видео по физике http://www.youtube.com/watch?v=I03qn5ROhu0&feature=player_embedded
function playagk() dim a [ maxrecord * 2 ] as integer
// draw agk spritestart = 0 maxblocks = 953 a[0]=0; a[1]=0; a[2]=260; a[3]=247; a[4]=260; a[5]=247; a[6]=260; a[955]=0; for l = 0 to 800
for i = 1 to ((maxblocks-1)/2) SetSpritePosition ( mysprites [ i+spritestart ] , a[i*2+0] + (sin(i+l)*(800-l)) ,a[i*2+1] + (cos(i+l)*(800-l)) ) SetSpritePhysicsOff ( mysprites [ i+spritestart ] ) next i Sync() next l
// for i = 1 to ((maxblocks-1)/2) SetSpritePosition ( mysprites [ i+spritestart ] , a[i*2+0] ,a[i*2+1] ) SetSpritePhysicsOff ( mysprites [ i+spritestart ] ) // Sync() next // pause for i = 0 to 30*1 Sync() next //enable physics. for i = 1 to ((maxblocks-1)/2) SetSpritePhysicsOn ( mysprites [ i+spritestart ] , 2 ) Sync() next // pause for i = 0 to 30*6 Sync() next // spritestart = 0 // fireworks maxblocks = 224 a[0]=0; a[1]=0; a[2]=433; a[3]=474; a[4]=433; a[5]=470; a[6]=433; a[225]=50;
for i = 1 to ((maxblocks-1)/2) SetSpritePosition ( mysprites [ i ] , a[i*2+0] ,a[i*2+1] ) SetSpritePhysicsOff ( mysprites [ i ] ) Sync() next //enable physics. for i = 1 to maxblocks SetSpritePhysicsOn ( mysprites [ i ] , 2 ) next for i = 0 to 30*4 Sync() next
for i = 1 to ((maxblocks-1)/2) SetSpritePosition ( mysprites [ i+spritestart ] , a[i*2+0] ,a[i*2+1] ) SetSpritePhysicsOff ( mysprites [ i+spritestart ] ) Sync() next // pause for i = 0 to 30*2 Sync() next //enable physics. for i = 1 to maxblocks SetSpritePhysicsOn ( mysprites [ i+spritestart ] , 2 ) next // pause for i = 0 to 30*2 Sync() next
endfunction
Сообщение отредактировал arrow25 - Четверг, 08 Марта 2012, 10:09
Перевожу видео http://www.youtube.com/watch?v=Mr21vCiQ3HY, видеоурок по AGK Если есть веб-дизайнер-энтузиаст, который состряпает сайт на любом движке с приятным дизайном, буду рад сотрудничеству (домен и хостинг оплачу).
Сообщение отредактировал Kefir87 - Воскресенье, 11 Марта 2012, 02:01
алхимик у тя случаем он не установлен?) а то чето звук не могу воспроизвести,при клике на спрайт, ошибку выдает((
Инсталятор где-то на винте лежит, вечером посмотрю. Любой дурак может написать программу, которую поймёт компилятор. Хорошие программисты пишут программы, которые смогут понять другие программисты.
Инсталятор где-то на винте лежит, вечером посмотрю.
да уже не стоит если ты по поводу звуков), я уже пережевал эту тему), и добавил его к первому посту. просто почему то сперва использовал функции для музыки а не для звуков).
Quote (Gavolot)
Убери, а то заминусуют зря. Материться нельзя))
убрал)
Сообщение отредактировал arrow25 - Понедельник, 12 Марта 2012, 19:48
Вот он движок моей мечты xD...Это язык более понятен. Спасибо за урок. Подскажите а он полностью платный? на Android я не смогу портировать игру?
к горькому сожалению он платен((, инди версия этого движка стоит 100+ с чем то американской валюты), на андройд экспортировать можно, но только в полной версии(.
Добавлено (16.03.2012, 22:20) --------------------------------------------- дальнейшие уроки скорей всего будут проходить так:
есть конкретная задача, например как сделать прыжок в платформере, или как сделать диалоги, или меню вот в таком формате будут уроки,можете сами предлагать уроки своей тематики и мы попробуем их разобрать вместе.
Сообщение отредактировал arrow25 - Пятница, 16 Марта 2012, 22:15
к горькому сожалению он платен((, инди версия этого движка стоит 100+ с чем то американской валюты), на андройд экспортировать можно, но только в полной версии(.
Тоесть вы создаете игры просто в самом движке и не куда их не портируете?
в пробной версии да, даже если вы слепите игру для windows и за хотите её показать другу, ни чего не получится, нужно чтобы у друга программа была тоже таковы печальные данные об игре.
Сообщение отредактировал arrow25 - Пятница, 16 Марта 2012, 22:49
Понятно. Не чего не осталось бесплатного в этом мире xD А кряка на эти движки наверно скорее всего не будет xD
Добавлено (16.03.2012, 22:48) --------------------------------------------- Понятно. Не чего не осталось бесплатного в этом мире xD А кряка на эти движки наверно скорее всего не будет xD
да кому надо тот купит её и так, так то на этом движке мне кажется можно реализовать в 2d можно все что угодно были бы мысли и мозги), функций там умотатся
Новую тему плодить не хочется. - Я так и не понял по сабжу. Поясните, кто знает. 1) Сам AGK вообще никаких готовых проетов и не собирает? (как например это делает юнити). Для каждой платформы нужно ставить набор тулзов (IDE+SDK и тд) и в них самих все делать? Т.е. самому ручками все собирать и тестировать и править в сторонних инструментах?
2) В триале принципиально не работает broadcasting (запуск проектов на девайсах по wi-fi) или это только у меня?) (По триалу вообще никаких выводов не сделать, кроме того что BASIC предельно прост и его осилит вообще любой.)
Самоделкин, это тема с уроками и вопросами по ним. Для отдельных вопросов заведи новую тему. Любой дурак может написать программу, которую поймёт компилятор. Хорошие программисты пишут программы, которые смогут понять другие программисты.