Четверг, 28.03.2024, 19:08
Приветствую Вас Гость
Главная | Колебания бонусов - Форум | Регистрация | Вход
Меню сайта
Наш опрос
Какой персонаж вам больше по душе?
1. Тор
2. Ктулху
3. Гном
4. Медвед
5. Креведко
Всего ответов: 10
Форма входа
Друзья сайта
Статистика
Форум
[ Новые сообщения · Участники · Правила форума · Поиск ]
  • Страница 1 из 1
  • 1
Форум » Программирование » BlitzMax » Колебания бонусов (Совет новичкам)
Колебания бонусов
Ize_g0reDate: Пятница, 03.08.2007, 13:57 | Message # 1
Рядовой
Группа: Пользователи
Сообщений: 24
Статус: Offline
Начнём издалека:
Новичка от профессионала отличает внимание к деталям, к каждой мелочи.
Приблизим:
В данном случае мелочью будет выступать колебание бонусов. Например: игра, сделанная профессионалом, будет содержать монетки, которые будут колебаться вверх/вниз. Лишняя трата ресурсов? Вовсе нет. Так красивее, а потому такой бонус более способствует погружению игрока в виртуальный мир, нежели статичный.

Как же сделать эти самые колебания? Гораздо проще, чем вы думаете.

Для начала поместим в глобал список монет и загрузим изображение монетки:

Code

Global coin:Timage=LoadImage("coin.png")
Global Clist:TList=New TList

Затем создадим тип:

Code

' Тип монеток. Поля: х,у, фаза колебания.
Type coins
  Field x:Int
  Field y:Int
  Field phase:Int
  ' Метод отрисовки монет
  Method drawer()
   phase:+1
   If phase=360 Then phase=0
   DrawImage(coin,x-plX,y+16*Sin(phase))
  End Method
  ' Метод проверки монет на коллизии с игроком
  Method collide(px:Int,py:Int)
   If Abs(x-px)<16 And Abs(y+16*Sin(phase)-py)<16 Then  
' те действия, которые должны происходить при взятии монетки
   EndIf
  End Method
End Type

Тут уже надо пояснить:
Метод drawer() отрисовывает каждую монетку в позиции Х,У+некоторое смещение, которое зависит от фазы колебания.
Метод коллизии же проверяет коллизии с boundary Box

Однако это всё то, что пишется до главного цикла.

Небольшое отступление:
Так мы создадим некоторое количество монеток.

Code

Local k:Int
For k=1 To (Rand(30)+30)
coin_create(Rand(1000),Rand(700))
Next

Как же нам использовать эти методы? Да очень просто! Через функции:

Code

Function coin_create(x:Int,y:Int)
Local c:coins
  c=New coins
  c.x=x ; c.y=y ; c.phase=0
  ListAddLast Clist,c
End Function
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Function coin_update()
Local c:coins
For c=EachIn Clist
  c.drawer()
Next
End Function

И, соответственно, в главном цикле нужно прописать вот это:

Code

coin_update()

Добавлено (03.08.2007, 13:57)
---------------------------------------------
Ах, да, забыл:
Монетки можно улучшить ещё, если сделать их не через простые картинки, а через анимированные. Как заставить картинки анимироваться синхронно с подъёмом? Подумайте сами, это не так сложно, как кажется.
ПС
Совет: обратите ещё раз своё внимание на поле phase


Ize'g0re's game lab
Return=CurrentPhase(Ize'g0re)
Read Returned. . .
/Work in Progress
 
JohnKDate: Пятница, 03.08.2007, 14:05 | Message # 2
EA FAN
Группа: Администраторы
Сообщений: 408
Статус: Offline
Молодец! На сайте одной статьей стало больше smile


 
dimanche13Date: Суббота, 04.08.2007, 19:52 | Message # 3
Рядовой
Группа: Пользователи
Сообщений: 16
Статус: Offline
Думаю, метод колизии монеты с игроком надо перенести в методы игрока. Это моё ИМХО. Я делал всё немного проще, но об этом в моем туториале wink
пока пишу его...
 
Ize_g0reDate: Суббота, 04.08.2007, 22:51 | Message # 4
Рядовой
Группа: Пользователи
Сообщений: 24
Статус: Offline
Будет интересно посмотреть на ваш способ!

Ize'g0re's game lab
Return=CurrentPhase(Ize'g0re)
Read Returned. . .
/Work in Progress
 
dimanche13Date: Суббота, 04.08.2007, 22:56 | Message # 5
Рядовой
Группа: Пользователи
Сообщений: 16
Статус: Offline
Code

Global ItemsList:TList = CreateList()

Type TItems  
  Field x:Int
  Field y:Int
  Field width:Int
  Field height:Int
   
  Field points:Int
  Field miny:Int
  Field maxy:Int
  Field diry:Int
  Field speed:Int
  Field AnimDelay:Int
   
  Function Create(sx:Int,sy:Int,pts:Int)
   Local TI : TItems = New TItems
    TI.Width = 6
    TI.Height = 16
    TI.x = sx * TILESIZE + ((TILESIZE - TI.width) / 2)    'отцентровать
    TI.y = sy * TILESIZE + ((TILESIZE - TI.height) / 2)    'отцентровать
    TI.points = pts
    TI.miny = TI.y - 4
    TI.maxy = TI.y + TI.Height + 4
    TI.diry = -1
    TI.speed = 1
    TI.AnimDelay = 5
   ListAddLast(ItemsList ,TI)
  End Function  
   
  Method Update()  
   If(Animdelay < 0)

       If ( miny > (y) Or maxy < (y + height - 1) )  
          diry = -diry
       End If
    
       y = y + speed * diry
    
       AnimDelay = 5

   End If   
    
   AnimDelay :- 1
    
  End Method
   
  Method Draw()  
   SetColor(255 , 255 , 0)
   DrawRect(x,y,Width,Height)
  End Method  
   
End Type
 
Форум » Программирование » BlitzMax » Колебания бонусов (Совет новичкам)
  • Страница 1 из 1
  • 1
Поиск:
Copyright JohnK© 2024