Создаём свой Crimsonland.
Привет! Вот помню я , много людей просили у меня исходник arrow – master 2… и некоторые, поиграв, хотели создать нечто подобное. И у многих не получалось…
Вот решил написать туториал, как создать «Crimsonland за час». Конечно, не совсем за час, но можно))) На данный момент готов сама игра. Далее я буду писать подробно, что в каждой строчке делается. Пока даю саму игру: туториал.rar Задавайте вопросы. |
Re: Создаём свой Crimsonland.
Код:
Player.x = width*0.5 'Делаем, чтобы положение игрока было точно в центре. |
Re: Создаём свой Crimsonland.
Цитата:
оттуда немогу скачать/посмотреть !! |
Re: Создаём свой Crimsonland.
|
Re: Создаём свой Crimsonland.
IGR, это другая рапида ;) все норм качается. Данил, я бы сделал по-другому. Приду домой напишу.
|
Re: Создаём свой Crimsonland.
ОК !! совсем другое дело !!
начинаю качать !! со своей скоростю завтра докачаю, отпишусь !! :-) |
Re: Создаём свой Crimsonland.
Приступаем. Туториал будет разделен на 7 частей.
ЧАСТЬ 1. Инициализация мира. ЧАСТЬ 2. Загрузка медиа. ЧАСТЬ 3. Создания типов, переменных, функций, необходимых для работы игры. ЧАСТЬ 4. Создания типов для игры ЧАСТЬ 5. Создание обновления для объектов. ЧАСТЬ 6. Создание меню. ЧАСТЬ 7.Цикл для игры. Первые части и последнии будут легкие. Самая сложная - 5. Так. Приступаем... ЧАСТЬ 1. Инициализация мира. Вначале давайте подумаем, о чем будет наша игра. Сделаем давайте мы безумную экшн-мясо-кровища-шутер. По экрану будет бегать чел. Чел этот будет из автомата или из дробовика крошить монстров. Будут декалитры крови. Круто? ;) Ну. начнеим писать код. Создадим новый файл - file => new. Создали? сохраним его в папку Crimsonland2 (предварительо создав ее ;) ). Для начала нужно задать расширение экрана. Хранить значения мы будет в константах height , width. Для теста возьмем 1024х768. Пишем: [blitz] 'ЧАСТЬ 1. Инициализация мира. '======== КОНСТАНТЫ Const width=1024 , height=768 'Константы расширения '======== УСТАНОВКА ИГРЫ Graphics width,height,32 'Ставим настройки. [/blitz] Все. Теперь игра уже представляет собой что-то. Круто? думаю ,пока нет. ;) ЧАСТЬ 2. Загрузка медиа. Так. для начала сохраните у себя на компе эти картинки: Под названием 1.jpg и переместим в папку игры : CrimsonLand2/media/1.jpg . Это у нас будет текстура земли в игре. Под названием 1.png и переместим в папку игры : CrimsonLand2/media/1.png . Главный герой. Под названием blood.png и переместим в папку игры : CrimsonLand2/media/blood.png . Кровища для игры. Под названием bulletPistol.png и переместим в папку игры : CrimsonLand2/media/bulletPistol.png. Пуля. Под названием button.png и переместим в папку игры : CrimsonLand2/media/Button/button.png. Кнопка. Под названием buttondown.png и переместим в папку игры : CrimsonLand2/media/Button/buttondown.png. Когда наводим указатель на кнопку. Под названием buttonexit.png и переместим в папку игры : CrimsonLand2/media/Button/buttonexit.png. Под названием buttonexitdown.png и переместим в папку игры : CrimsonLand2/media/Button/buttonexitdown.png. Когда наводим указатель на кнопку. Под названием monster.png и переместим в папку игры : CrimsonLand2/media/monster/monster.png . Так. все медиа мы вроде загрузили. Сейчас напишем код ,который бы все это загружал... [blitz] Global Fonimage = LoadImage ("Media/1.jpg") 'Загружаем текстуру для игры. Global BulletImage = LoadImage ("Media/bulletPistol.png") 'Загружаем картинку пули. MidHandleImage BulletImage 'Координаты картинки монстра по центру. Global PlayerImage = LoadAnimImage ("Media/1.png",68,40,0,8) 'Загружаем картинку для главного игрока. MidHandleImage PlayerImage 'Делаем координаты картинки по центру. Global MonsterImage = LoadAnimImage ("Media/Monster/1.png",100,50,0,20) 'Загрузка картинки монстра. MidHandleImage MonsterImage 'Координаты картинки монстра по центру. Global BloodImage = LoadImage ("Media/Blood.png") MidHandleImage BloodImage Global Button = LoadImage ("Media/Button/button.png") 'Кнопка для начала новый игры. Global ButtonDown = LoadImage ("Media/Button/buttondown.png") MidHandleImage Button MidHandleImage ButtonDown Global ButtonExit = LoadImage ("Media/Button/buttonexit.png") 'Кнопка для начала новый игры. Global ButtonExitDown = LoadImage ("Media/Button/buttonexitdown.png") MidHandleImage ButtonExit MidHandleImage ButtonExitDown Global SMonster:TList=New TList Global SPlayer:TList=New TList 'Листы для объектов. Global SBullet:TList=New TList Global SBlood:TList=New TList [/blitz] Global - объявляет новую переменную. LoadImage - загружает картинку. MidHandleImage - координаты картинки по центру. TList - листы, списки, в которых будут содержатся данные об наших объектах. Загрузили в нашу игру мы медиа. Что дальше? ЧАСТЬ 3. Создания типов, переменных, функций, необходимых для работы игры. А дальше у нас идет создание необходимого. [blitz] Global TipGame 'Для того, чтобы можно было понять, что сейчас происходит. 0- меню. 1- игра. Global Level = 1000 'Уровень Global time Global a [/blitz] Объявляем переменные. [blitz] '======== ДЛЯ УПРАВЛЕНИЯ СПИСКАМИ Function UpdateEntities( list:TList ) For Local entity:TEntity=EachIn list entity.Update Next End Function '======== ТИП ДЛЯ РАБОТЫ С ДРУГИМИ ТИПАМИ 'Чтобы можно было работать с другими типами, необходим этот... Type TEntity Field link:TLink Method Remove() link.Remove Sila:-1 End Method Method AddLast( list:TList ) link=list.AddLast( Self ) End Method Method Update() Abstract End Type [/blitz] Можно сказать, функция для обновления объектов в списке, а тип для работы функции... вроде... [blitz] Function Dn_DrawImage (image, x#, y#, rotat#,level# ) 'Рисуем картинку через функцию. SetBlend Alphablend SetRotation rotat SetAlpha level DrawImage image, x, y End Function Function Dn_DrawAnimImage (image, x#, y#, rotat#,level#, f ) 'Рисуем картинку через функцию. SetBlend Alphablend SetRotation rotat SetAlpha level DrawImage image, x, y, f End Function [/blitz] Две функции для отрисовки изображений. Dn_DrawImage - для обычных картинок. image x - положение y - положение rotat - поворот картинки level - прозрачность. Dn_DrawAnimImage - для анимационных картинок. f - номер кадра. [blitz] '======== ОПРЕДЕЛИТЬ УГОЛ МЕЖДУ ТОЧКАМИ Function Angle!(x0!,y0!,x1!,y1!) Return ATan2(y1-y0,x1-x0) End Function [/blitz] Функция для определения угла между двумя точками. Так. завтра у нас будет две части. Самых сложных.... |
Re: Создаём свой Crimsonland.
ЧАСТЬ 4. Создания типов для игры. Так. завтрашнего дня я не дождался. Решил сделать 4 часть сегодня. ))) В этой части мы сделаем все необходимые типы для игры:
Так. Приступим сразу к коду: [blitz] Type TPlayer Extends TEntity 'Объявляем тип. Field X#,Y# 'Положение игрока. Field Life 'Жизнь. Field Ang 'Поворот. Field frame , animnext 'Для анимации. Field Weapon 'Какое оружие. 0 - автомат. 1 - дробовик Field Shot 'Когда был произведен предыдузий выстрел. Method Update() 'Цикл, где будут проходить все действия для пока здесь ничего не пишем, но сделаем метку. End Method Function CreatePlayer:TPlayer( ) 'Функция для создания игрока. Local Player:TPlayer=New TPlayer 'Создаем игрока. Player.x = width*0.5 'Делаем, чтобы положение игрока было точно в центре. Player.y = height*0.5 Player.life = 100 '100 жизней для начала. Player.AddLast SPlayer 'Добавляем объект в список. Return Player 'Возвращаем объект. End Function End Type [/blitz] Type - объявляет тип. Extends - "привязка". В нашем случае к типу TEntity. Помните, мы такой создали? Field - знаения для типа. Function CreatePlayer:TPlayer( ) - Функция для создания объекта - игрока. TPlayer означает, к какому типу относится функция. Так же у нас для монстра, пули и крови. Только поля аля значения другие и названия. ) Для того, чтобы создать игрока, достаточно ввести TPlayer.CreatePlayer (), но мы это напишем потом. [blitz] Type TMonster Extends TEntity 'Объявляем тип. Field X#,Y# 'Положение объекта. Field Life 'Жизнь. Field Ang 'Поворот. Field frame , animnext 'Для анимации. Method Update() 'Цикл, где будут проходить все действия для монстра. пока здесь ничего не пишем, но сделаем метку. End Method Function CreateMonster:Tmonster(x#,y#) 'Функция для создания монстра. Local monster:TMonster=New TMonster 'Создаем игрока. Monster.x = x Monster.y = y Monster.life = 100 '100 жизней для начала. Monster.AddLast SMonster 'Добавляем объект в список Return Monster 'Возвращаем объект. End Function End Type [/blitz] Чтобы создать монстра, надо написать: TMonster.CreateMonster(х, у) Х, У - положение монстра. Если мы хотим, чтобы у монстров разные жихни были, или еще что-нибудь, то нужно заместо: Function CreateMonster:Tmonster(x#,y#) Monster.life = 100 писать Function CreateMonster:Tmonster(x#,y#, life) Monster.life = life То есть при создании нового монтсра мы будем указывать еще и его количество жизней, но в моем туториаре мы не будем делать этого. ))) [blitz] Type TBullet Extends TEntity 'Объявляем тип. Field X#,Y# 'Положение пули. Field Ang 'Поворот. Field speed Method Update() 'Цикл, где будут проходить все действия для пули. пока здесь ничего не пишем, но сделаем метку. End Method Function CreateBullet:TBullet(x#,y#,ang#, speed) 'Функция для создания пули. Local Bullet:TBullet=New TBullet 'Создаем игрока. Bullet.x# = x# Bullet.y# = y# Bullet.ang = ang Bullet.speed = speed Bullet.AddLast SBullet 'Добавляем объект в список Return Bullet 'Возвращаем объект. End Function End Type [/blitz] Создаем пулю. Чтобы создать, нужно написать: TBullet.CreateBullet (x,y,поворот пули, скорость в px) Правда, делать мы это будем в методе обновлении игрока. [blitz] Type TBlood Extends TEntity 'Объявляем тип. Field X#,Y# 'Положение пули. Field Ang 'Поворот. Field Alpha# 'Прозрачность крови. Field AlphaM# 'Как быстро будет кровь становится прозрачнее Method Update() 'Цикл, где будут проходить все действия для крови. пока здесь ничего не пишем, но сделаем метку. Function CreateBlood:TBlood(x#,y#,m#) 'Функция для создания крови. Local Blood:TBlood=New TBlood 'Создаем игрока. Blood.x = x Blood.y = y Blood.alpham = m Blood.alpha = 1 Blood.ang = Rand (360) Blood.AddLast SBlood 'Добавляем объект в список Return Blood 'Возвращаем объект. End Function End Type [/blitz] Типы все похожи ,не правда ли? То же самое и с кровью. Только мы добавили несколько новых значений. Значение alpham, alpha. Ang у нас будет каждый раз разное. Чтобы кровь была не похоже друг на друга, каждый раз рисуем ее в случайном повороте. Alpha - при зарисовке будет указыватся, на сколько прозрачной будет кровь. Так же будет как "счетчик". Постепенно это значение будет уменьшатся на alpham, и когда alpha будет меньше или равна 0 ,то удаляем кровь. Хе. Вы почти создали основу , "каркас" вашей игры. Осталось не так уж и много... Правда посмотреть пока не на что... |
Re: Создаём свой Crimsonland.
ЧАСТЬ 5. Создание обновления для объектов. Без обновления объектов у нас игра просто не будет работать. Так давай те же напишем его! ;) [blitz] 'Движение игрока. If KeyDown(Key_W) Then Y = Y - 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 If KeyDown(Key_S) Then Y = Y + 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 If KeyDown(Key_A) Then X = X - 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 If KeyDown(Key_D) Then X = X + 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 Ang = Angle(x,y,MouseX(),MouseY())'Определяем поворот игрока. If frame=8 Then frame=0 Dn_DrawAnimImage (playerImage, x, y, ang,1,frame ) If shot < MilliSecs () And MouseDown (1) Then If weapon = 0 Then shot = MilliSecs () + 50 ; TBullet.CreateBullet (x,y,ang+Rand(-6,6),30) If weapon = 1 Then shot = MilliSecs () + 500 ; For i = 0 To 10 ; TBullet.CreateBullet (x,y,ang+Rand(-40,40),15) ; Next End If If KeyHit (key_f1) Then weapon=0 If KeyHit (key_f2) Then weapon=1 SetRotation 0 DrawText life ,0 , 0 [/blitz] Так. найдите в коде обновление игрока / type TPlayer => Method Update () Там мы оставляли метку. Убираем ее и пишем вышенаписанное .))) [blitz] If KeyDown(Key_W) Then Y = Y - 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 If KeyDown(Key_S) Then Y = Y + 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 If KeyDown(Key_A) Then X = X - 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 If KeyDown(Key_D) Then X = X + 3 ; If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 [/blitz] Перемещение главного игрока. То есть при нажатие на клавишу (W,A,S,D) , у нас изменяются координаты. И так же при нажатие на клавигу у нас происходит смена кадров. X=X+3 , где 3 - скорость. Изменить, если надо) If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 Если animnext < с.времени , то animnext = с.время+50мс , кадр = +1 Каждые 50 мс увеличиваем кадр на 1. А всего у нас кадров 8. => если покажется 9 кадр, несуществующий, будет ошибка. Ставим ограничение: [blitz] If frame=8 Then frame=0 [/blitz] (если кадр = 8 , то кадр = 0) Примечание: отсчет кадров начинается с нуля => 8 кадр - несуществующий. [blitz] Dn_DrawAnimImage (playerImage, x, y, ang,1,frame ) [/blitz] Рисуем анимационную картинку - playerImage . В положении х игрока, у игрока, с поворотом ang. С прозрачностью 1 (непрозрачный) и кадром frame. [blitz] Ang = Angle(x,y,MouseX(),MouseY())'Определяем поворот игрока. [/blitz] Определяем через нашу функцию поворот между точкой один (главный герой) и точкой два (курсор) [blitz] If shot < MilliSecs () And MouseDown (1) Then If weapon = 0 Then shot = MilliSecs () + 50 ; TBullet.CreateBullet (x,y,ang+Rand(-6,6),30) If weapon = 1 Then shot = MilliSecs () + 500 ; For i = 0 To 10 ; TBullet.CreateBullet (x,y,ang+Rand(-40,40),15) ; Next End If [/blitz] Если shot меньше с.времени и нажата левая кнопка мыш, то: если оружие 0 (автомат), то увеличиваем shot, и создаем пулю. если оружие 1 (дробовик), то увеличиваем shot, и много (11) пуль создаем пулю. 11 потому-что начинается счет с 0 и идет до 10 - 11. счетчик: наша переменная содержит число. (системное время) если системное время больше начего числа, то выполняем действие какое-нибудь, и увеличиваем число на с.время+мс. [blitz] If KeyHit (key_f1) Then weapon=0 If KeyHit (key_f2) Then weapon=1 [/blitz] Если нажимаем клавишу F1, то достаем автомат, или переменная weapon = 0 Если нажимаем клавишу F2, то достаем дробовик, или переменная weapon = 1 [blitz] SetRotation 0 DrawText life ,0 , 0 [/blitz] Рисуем жизни. ) Так. Главного героя сделали. Все. перерыв. Идите выпейте чего-нибудь, отдохните))) Отдохнули? приступаем к монстрам. [blitz] Method Update() 'Цикл, где будут проходить все действия для монстра. If life < 0 Then remove ; Return; If Level>300 Then Level:-5 For Player:TPlayer = EachIn SPlayer If x > player.x - 30 And x < player.x + 30 And y > player.y - 30 And y < player.y + 30 Then player.life:-1 TBlood.CreateBlood (player.x,player.y,0.01) End If Ang = Angle(x,y,player.x,player.y)'Определяем поворот монстра Next x=x+(3.5*Cos(ang)) y=y+(3.5*Sin(ang)) If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 If frame=20 Then frame=0 Dn_DrawAnimImage (monsterimage, x, y, ang,1,frame ) End Method [/blitz] Весь код на монстров. [blitz] If life < 0 Then If Level>300 Then Level:-5; remove ; Return [/blitz] Если жизни меньше 0 ,то : если у нас скорость появления монстров (Level) больше 300, о умеьшаем ее. (на деле же чем меньше скорость, тем чаще они появляются.) Удалям объект (через TEntity, по этому не подствечивается) Возвращаем все. [blitz] For Player:TPlayer = EachIn SPlayer If x > player.x - 30 And x < player.x + 30 And y > player.y - 30 And y < player.y + 30 Then player.life:-1 TBlood.CreateBlood (player.x,player.y,0.01) End If [/blitz] Смотрим на всех героев главных (а их он у нас один, но можно сделать и больше, только как быть с управлением?) Если нащ монстр близко к герою : [blitz] If x > player.x - 30 And x < player.x + 30 And y > player.y - 30 And y < player.y + 30 Then [/blitz] То : [blitz] player.life:-1 TBlood.CreateBlood (player.x,player.y,0.01) [/blitz] Уменьшаем жизни героя и создаем кровь в позиции героя. сейчас немного объясню, почему так пишем... Смотрите, мы в методе игрока писали просто x , а здесь player.x, так? а х у нас это координата монстра. Дело в том, что если если мы используем значения объекта прямо в его типе, то писать player. и тому подобное не надо. А если мы вызываем значения объекта из другого типа (из монстра вызываем героя), то надо писать player. и тому подобное... [blitz] x=x+(3.5*Cos(ang)) y=y+(3.5*Sin(ang)) [/blitz] Перемещаем монстра относительно его поворота. 3.5 - скорость его. Если надо , можно увеличить или умеьшить... [blitz] If animnext < MilliSecs () Then animnext=MilliSecs()+50 ; frame:+1 If frame=20 Then frame=0 Dn_DrawAnimImage (monsterimage, x, y, ang,1,frame ) [/blitz] Для анимации... думаю, уже не надо расписывать) ПУЛИ [blitz] Method Update() 'Цикл, где будут проходить все действия для пули. 'Если пуля вылетает за пределы карты - удаляем. If x<-100 Or x>=width+100 Or y>=height Or y<=-100 Then remove Return EndIf For Monster:TMonster = EachIn SMonster If x > monster.x - 25 And x < monster.x + 25 And y > monster.y - 25 And y < monster.y + 25 Then monster.life:-20 TBlood.CreateBlood (x,y,0.001) remove Return End If Next x=x+(speed*Cos(ang)) y=y+(speed*Sin(ang)) Dn_DrawImage bulletImage, x, y, ang,1 End Method [/blitz] [blitz] If x<-100 Or x>=width+100 Or y>=height Or y<=-100 Then remove Return EndIf [/blitz] Если пуля вылетает за пределы экрана - удаляем. [blitz] For Monster:TMonster = EachIn SMonster If x > monster.x - 25 And x < monster.x + 25 And y > monster.y - 25 And y < monster.y + 25 Then monster.life:-20 TBlood.CreateBlood (x,y,0.001) remove Return End If Next [/blitz] Обновляем монстров. Если пуля близко к монстру ,то удаляем пулю, добавляе крови. [blitz] x=x+(speed*Cos(ang)) y=y+(speed*Sin(ang)) [/blitz] Перемещаем пулю. [blitz] Dn_DrawImage bulletImage, x, y, ang,1 [/blitz] Рисуем. КРОВЬ [blitz] Method Update() 'Цикл, где будут проходить все действия для крови. If alpha < 0 Then REmove ; Return alpha = alpha - alpham Dn_DrawImage (BloodImage, x, y, ang,alpha ) End Method [/blitz] Постепенно делаем кровь прозрачней. (уменьшаем alpha на alpham) Если прозрачность = 0 (т.е. совсем невидим), то удаляем Так. можете себя поздравить. Вы полностью сделали каркас вашей игры. ЧАСТЬ 6. Создание меню. Ни одна игра не обходится без меню. Так давайте же создадим меню и в нашей игре. [blitz] While TipGame <> 1 'Цикл для меню. Пока переменная не равна 1, будет меню. Cls Dn_DrawImage (button, width*0.5, height*0.5, 0,1 ) Dn_DrawImage (buttonexit, width*0.5, height*0.5+50, 0,1 ) If MouseX()> (width*0.5)-((ImageWidth(Button))*0.5) And MouseX()< (width*0.5)+((ImageWidth(Button))*0.5) And MouseY()> (height*0.5)-((ImageHeight(Button))*0.5) And MouseY()< (height*0.5)+((ImageHeight(Button))*0.5) Then 'Вот такой мегааццкий код для коллизии кнопка - курсор. '(width*0.5)-((ImageWidth(Button))*0.5) - ширину * 0.5 - ширину кнопки * 0.5 -- определяем начальную х кнопки. '(width*0.5)+((ImageWidth(Button))*0.5) - ширину * 0.5 + ширину кнопки * 0.5 -- определяем конечную х кнопки. 'и так же для высоты кнопки ;) Dn_DrawImage (buttondown, width*0.5, height*0.5, 0,1 ) End If If MouseX()> (width*0.5)-((ImageWidth(Button))*0.5) And MouseX()< (width*0.5)+((ImageWidth(Button))*0.5) And MouseY()> (height*0.5)-((ImageHeight(Button))*0.5) And MouseY()< (height*0.5)+((ImageHeight(Button))*0.5)And MouseDown (1) Then TipGame = 1 If MouseX()> (width*0.5)-((ImageWidth(Button))*0.5) And MouseX()< (width*0.5)+((ImageWidth(Button))*0.5) And MouseY()> (height*0.5)-((ImageHeight(Button))*0.5)+50 And MouseY()< (height*0.5)+((ImageHeight(Button))*0.5)+50 Then Dn_DrawImage (buttonexitdown, width*0.5, height*0.5+50, 0,1 ) End If If MouseX()> (width*0.5)-((ImageWidth(Button))*0.5) And MouseX()< (width*0.5)+((ImageWidth(Button))*0.5) And MouseY()> (height*0.5)-((ImageHeight(Button))*0.5)+50 And MouseY()< (height*0.5)+((ImageHeight(Button))*0.5)+50 And MouseDown (1) Then End Flip Wend [/blitz] Тут все просто. Рисуем две кнопки. Если курсор находится в зоне кнопки, то рисуем поверх нее другую. Если нажимаем на курсор и курсор находится над кнопкой, то делаем то-то. В нашем случае изменяем переменную TipGame 1. А цикл меню заверщается, если переменная становится не равна 0. то есть если мы нажимаем на "новая игра", то цикл меню завершается и продолжается выполнение кода... Кстати, cls - очищает экран, flip - все рисует. ЧАСТЬ 7.Цикл для игры. Так. Подошли мы к концу. [blitz] TPlayer.CreatePlayer () While Not KeyDown (KEy_Escape) Cls TileImage Fonimage , 0 , 0 UpdateEntities Sblood UpdateEntities Sbullet UpdateEntities Splayer UpdateEntities Smonster If time < MilliSecs () Then time = MilliSecs () + level a = Rand (1,4) Select a Case 1 TMonster.CreateMonster(-50, Rand(height)) Case 2 TMonster.CreateMonster (width+50, Rand(height)) Case 3 TMonster.CreateMonster (Rand(width) , -50) Case 4 TMonster.CreateMonster (Rand(width), height+50) End Select End If Flip Wend [/blitz] TPlayer.CreatePlayer () - что это такое? ;) TileImage Fonimage , 0 , 0 - Рисуем фон игры. [blitz] UpdateEntities Sblood UpdateEntities Sbullet UpdateEntities Splayer UpdateEntities Smonster [/blitz] Обновляем все объекты. UpdateEntities - наша функция, она была в самом начале. [blitz] If time < MilliSecs () Then time = MilliSecs () + level a = Rand (1,4) Select a Case 1 TMonster.CreateMonster(-50, Rand(height)) Case 2 TMonster.CreateMonster (width+50, Rand(height)) Case 3 TMonster.CreateMonster (Rand(width) , -50) Case 4 TMonster.CreateMonster (Rand(width), height+50) End Select End If [/blitz] Так. Если time меньше системного времени, то присваиваем переменной a случайное значение от 1 до 4. Если равно 1 , то создаем монстра слева экрана. Если 2, то справа. Если 3, то вверху экрана. Если 4, то снизу. Все! нажимаем F5! Работает? если нет - код в с тудию ,будем выеснять. А так все готово! Мы можите поздравить себя с созданием игры основы Crimsonland. Конечно ,все аспекты типа уровней, спецэффетов и тому подобного описывать я не буду ,но вы уже сделали основу. Уже легче. Поздравляляю! так.. а я спать. .у меня моск конкретно взорвался...:wallbash: |
Re: Создаём свой Crimsonland.
Все! туториал закончен, мона флудить)))
туториал.rar |
Re: Создаём свой Crimsonland.
Вложений: 1
Почему бы не ввести параметр по-умолчанию ?
Код:
Function CreateMonster:Tmonster(x#,y#,life = 100) Вот накидал, как бы я писал Кримсон: |
Re: Создаём свой Crimsonland.
У тебя, dimanche13, очень много методов.. по 3-4 на тип. .а у меня на тип один метод и одна функция. А типа "удаления" или тому подобного в отдельный тип отношу, доступный для дркгих...
Ну, это имхо. Я так делаю. Ты так. |
Re: Создаём свой Crimsonland.
Данил, это зависит от подхода конкретного программиста. Ты абсолютно прав, что каждый делает так как считает нужным. Посмотрев твой код, я и для себя присмотрел пару вещиц. ;)
|
Re: Создаём свой Crimsonland.
|
Ответ: Создаём свой Crimsonland.
Оличный туториал. Щас пишу нечто похожее на b3d, и еслиб только начатый был, то перешел бы на БМ. Только меня напрягает циферка в верхнем левом углу, это фпс?
|
Re: Создаём свой Crimsonland.
|
Ответ: Создаём свой Crimsonland.
Цитата:
|
Re: Создаём свой Crimsonland.
я говорил про дату последнего поста дурачек ))))) хватит некрофильничять !!!
|
Ответ: Создаём свой Crimsonland.
Ясно. Сори. Но туда вообще никогда не смотрю.
|
Re: Создаём свой Crimsonland.
так вот большинство людей (особенно новых) никогда и не смотрят, а если теме больше года врядли уже кто-то будет на такие детальные вопросы отвечать... хотя всё бывает )
|
Ответ: Создаём свой Crimsonland.
Ы. На днях открыл для себя Кримсонлэнд и понял, что это одна из лучших игр, сделанных когда-либо. Очень хотелось переделать там многое под себя, например, очень не хватает управления двумя мышками :-D , но я в игроделании не разбираюсь. Было приятно увидеть тут эту тему =)
|
Ответ: Создаём свой Crimsonland.
приятно было увидеть свою тему,в поднятых)
|
Ответ: Создаём свой Crimsonland.
Было бы неплохо дописать статью.
Чтоб там Hi-Score считалось. Бонусы. Оружия поболее+кач скорострельности и обьёма магазина Получится мега туториал по деланью клона кримсона. А кримсон во истину вещь! [/list] |
Ответ: Создаём свой Crimsonland.
Все это дописать - 5 минутное дело. И базовых знаний, что здесь дается, и так хватит)
Тогда еще уровни, эффектов побольше, колизии - дак на продажу уже можно будет) |
Re: Создаём свой Crimsonland.
да и какой смысл делать игру по четкой интсрукций ? в туторе все основы объясняются и можно самому делать дальше так как захочешь ))
|
Ответ: Создаём свой Crimsonland.
Чтоб показать новичкам полны цикл.
Чтоб они сделали то, во что можно играть тобеж игру с хоть какимто игровым стимулом а именно hi-score. После чего они обвешивали её своей графикой, пытались доделать ещё и в итоги сделали свой первый проэкт, который к томуже ещё и неплохой. |
Ответ: Создаём свой Crimsonland.
2Randomize, копипаст пропагандируем? :wild:
|
Ответ: Создаём свой Crimsonland.
Хотелось бы спросить, как сделать своего главного героя? Пробовал перерисовывать в фотошопе, получилось косячно, двигался совсем не так, глав.герой то исчезал, то появлялся.
|
Ответ: Создаём свой Crimsonland.
а ты на картинку вложенную посмотрел хоть ?? это набор кадров - естественно если кадров нет то он в лучшем случае нече не покажет - хотя всё решается незначительными исправлениями кода...
|
Ответ: Создаём свой Crimsonland.
NitE, смотрел конечно. Я пытался делать такие же кадры, но нечего не вышло.
|
Ответ: Создаём свой Crimsonland.
имхо там подход неправильный - вместо проигрывания кучи кадров проще в коде прописать чтобы одна картинка туда-сюда крутилас, или вообще статичьна была )
|
Ответ: Создаём свой Crimsonland.
NitE не подскажешь в какой именно строчке?
|
Ответ: Создаём свой Crimsonland.
19, 97, 104-107, 111, 112
|
Ответ: Создаём свой Crimsonland.
Piranha, ширину раздели на количество кадров - получишь ширину одной картинки)
NitE, как бы сначала я расчитывал, что сделаю нормальную анимацию :) затем ж я просто вставил этого чела. Тут уже по вкусу) |
Ответ: Создаём свой Crimsonland.
2Данил
а спрайты вы сами делали? и каким образом? |
Ответ: Создаём свой Crimsonland.
Терорист из Counter Strike
Монстр из WarCraft Всё выдёргивается риперами и распаковщиками. Допустим можно записать с экрана это как видео, а потом сделать по ней кадры (допустим много Bmp) Всё это дело вставляем в Active Gif Creator или в создавалку спрайтов Jimon`а и получаем полоску кадров (BMP Strip). |
Ответ: Создаём свой Crimsonland.
Можно сразу в bmp, способы выдернуть модельки из кс-ы давно лежат в гугле, ставим камеру на головой модельки, рендерим анимацию бега в bmp делаем "полоску" с ASpriter или любой другой прогой
|
Ответ: Создаём свой Crimsonland.
Вложений: 1
Подскажите как сделать карту (уровень), а то не могу понять как такое сделать. И еще как сделать скроллинг за игроком. Точнее я скроллинг сделал, но герой двигается не много быстрее чем камера и фигня какая то получается. :) Ну и если можно, то еще и что бы патроны заканчивались. И как сделать звук, а то в хелпе я нашел только 1 пример и и то для программного создания звука... :-)
У меня вот что получилось. :-) |
Ответ: Создаём свой Crimsonland.
Посмотри другие примеры, здесь дана основа, а то
"сделайте мне то, сделайте мне се, а вот здесь я хочу круттую игру, сделайте! А еще продайте и отдайте мне деньги!" .) грубо говоря, это так звучит :) почитай, поспрашивай, но посторайся сделать сам, иначе расслабишься |
Ответ: Создаём свой Crimsonland.
1) скорость камеры=скорость игрока
2) если патроны>0 выстрел, патроны=патроны-1 3) loadsound, playsound |
Ответ: Создаём свой Crimsonland.
Данил, я и так стараюсь. А насчет "сделайте мне то,се", я такого не говорил. Я просил подсказать как сделать. :)
А насчет карты (уровня) никто не знает чтоли? :( |
Ответ: Создаём свой Crimsonland.
Конкретизируй вопрос... Ты не понимаешь как делать модель? Или как "запихивать" её в игру? Или ты вообще ничего не понимаешь?
|
Ответ: Создаём свой Crimsonland.
h1dd3n, как сделать карту тоесть локацию по которой бегать? Тайлами или как? Как разные объекты (ящики, стены) разместить? Просто бегать по бесконечному игровому пространству без разных объектов не интересно.... И сори, что так криво пишу у меня просто уже 9-ое мая и сами понимаете... :)
|
Ответ: Создаём свой Crimsonland.
Опять не конкретный вопрос =) Но мне кажется я тебя понял.
Если ты делаешь любой объект на твоей карте, то это будет картинка (будь то хоть трава хоть ящик) если ты напимер хочешь сделать так чтобы твой чар не проходил сквозь "ящик" тебе надо проверять "ящик" и чара на коллизию, и например отталкивать чара. Чтобы создать карту для начала её надо нарисовать. Потом надо "расставить" "ящики" и т.д. Можно написать свой формат, а можно взять xml (хотя тут у всех спорные мнения), потом созданую "карту" надо загружать в игру, загружая файл описания карты (xml или свой формат). |
Ответ: Создаём свой Crimsonland.
Данил, анимку для монстра из Варика ты сам делал?
|
Ответ: Создаём свой Crimsonland.
А как сделать что бы "картинка игрока" всегда была так сказать на самом верху (что бы другие картинки ее не перекрывали)?
|
Ответ: Создаём свой Crimsonland.
Если я правильно понял, рисуй ее в последнюю очередь.
|
Ответ: Создаём свой Crimsonland.
Yalenz, да, выдирал модель, через прогу рендрил сверху, и через фотошоп обрабатывал, ставил все кадры в линию. На одного монстра уходила около часа.
|
Ответ: Создаём свой Crimsonland.
SkySream, то есть при обновлении нужно рисовать сначала - карту, то есть фон. затем монстры, потом пули, далее эффекты, в конце - игрока. и поверх всего - интерфейс. тогда получится так, как ты хочешь.
Halk-DS, если рисовать поверх всего, игрок будет бегать по гуи) |
Ответ: Создаём свой Crimsonland.
Данил, спасибо! :) А то у меня игрок бегает под плитами, пули поверх гуи летают. :-D
|
Ответ: Создаём свой Crimsonland.
Цитата:
Просто у меня выходило только саму модель вытащить=( |
Ответ: Создаём свой Crimsonland.
Yalenz, анимация из игры.
Я именно модель не выдирал, я тупо открыл архив игры через прогу, нашел нужную модель, и прямо в проге сделал 20 кадров анимации, затем обрезал. |
Ответ: Создаём свой Crimsonland.
хоть я не изучаю blitzMax , но урок очень хороший.
Правда на GML это занимало б меньше строк и времени.( если изучать как я gml 2 года) |
Ответ: Создаём свой Crimsonland.
pitonms, на gml можно добиться графики - салюта, сделать тени, физику полноценную, билн, ну хотя бы сделать из огромного коилчества объектов , где нои распалагаются на 10000х10000 пикселях одну большую или несколько малеьнких к4ратинок, содержащих все себе все эти объекты ,ну, или, допустим, шифратор/дешифратор? а модули можно подключать?) ... ну так, чисто ради интереса спрашиваю.
|
Ответ: Создаём свой Crimsonland.
Библиотеки можно подключать :) Есть даже специальная версия Ирлихта для сего дела (ГМИрлихт). Еще вроде физика специально была )
|
Часовой пояс GMT +4, время: 05:50. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot