Войти на сайт

Авторизация, ждите ...
×

ТЕМА: (XP)EKLib v1.5

(XP)EKLib v1.5 15 года 7 мес. назад #23496

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
EKLib v.1.5

Предисловие:
Вот, наконец, я и закончил вылавливать всех жуков в своем творении и с гордостью, а так же потаенным страхом в душе, могу представить на ваш суд свою библиотеку. Методов в ней уже довольно много . Но действительно стоящих всего два - выдергивание любых кусков из изображения и рисование текста с переносом слов. С последним я мучился особенно долго, но теперь он должен работать, как часы... Смотрите, тестите, оценивайте, пользуйтесь, критикуйте... Только ногами не бейте... или, хотя бы, не по голове... Пожелания и советы - пишите все. Вот...

Методы:
  • getImagePartByIndex - Метод возвращает фрагмент изображения.
  • intToString - Метод преобразует целое число в строку с заданным количеством знаков.
  • changeFont - Метод изменяет все параметры шрифта заданного изображения
  • hyphenDrawText - Метод построчно рисует заданный text на bitmap, перенося непомещающиеся слова
  • drawFigure - Метод рисует геометрические фигуры на заданном изображении
  • findFileExp - Метод возвращает первый найденный файл в директории path, именем filename и расширением взятым из массива exp
Примечание: Подробное описание методов, их параметров, а так же инструкции по применению вы можете найти в теле скрипта.

В следующих версиях планирую:
  • Добавить новые фигуры в метод drawFigure.

Скрипт:
#==============================================================================
# EK Lib v.1.5
#------------------------------------------------------------------------------
# Created by: Equilibrium Keeper [[email protected]]
# Created on: 10.09.2008 01:37:16
# Отдельное спасибо: insider, Рольф
#          А так же: rpgmaker.sk6.ru, rpg-maker.info, gdsa.rpgmaker.ru
#==============================================================================
# Описание: Библиотека содержит несколько наиболее часто используемых мной
#           функций. При желании вы можете воспользоваться ими, но делайте
#           это на свой страх и риск.
#------------------------------------------------------------------------------
# Установка: В редакторе скриптов создайте чистую страницу над  Main  и
#            скопируйте туда данный скрипт. В Main создайте новый объект%
#            $EKLib = EKLib.new
#==============================================================================
class EKLib
#------------------------------------------------------------------------------
  # Метод возвращает фрагмент изображения
  # filename : string  - имя файла, относительно папки проекта
  # index    : integer - порядковый номер фрагмента
  # width    : integer - ширина каждого фрагмента
  # height   : integer - высота каждого фрагмента
  # Примечание: Счет ведется слева направо, сверху вниз; index - с единицы.
  def getImagePartByIndex (filename, index, width, height)
    bitmap = Bitmap.new (filename)
    bitmap_result = Bitmap.new (width, height)
    n = bitmap.width / width
    x = (index * width - width) - ((index - 1) / n) * width * n
    y = ((index - 1) / n) * height
    rect = Rect.new(x, y, width, height)
    bitmap_result.blt(0, 0, bitmap, rect)
    return bitmap_result
  end
#------------------------------------------------------------------------------
  # Метод преобразует целое число в строку с заданным количеством знаков
  # number         : integer - число, которое требуется преобразовать
  # digits         : integer - количество знаков в возвращаемой строке
  # filling_symbol : string  - символ, заполняющий не достающие знаки
  def intToString (number, digits = 3, filling_symbol =  0 )
    i = number
    counter = number.to_s
    for i in number.to_s.size..digits - 1
      counter = filling_symbol + counter
      i += 1
    end
    return counter
  end
#------------------------------------------------------------------------------
  # Метод изменяет все параметры шрифта заданного изображения, если они не указаны,
  # возвращает их к значению по умолчанию
  # bitmap : bitmap  - изображение, для которого изменяются параметры шрифта
  # size   : integer - размер шрифта
  # bold   : bool    - флаг утолщенности
  # italic : bool    - флаг курсива
  # color  : color   - цвет шрифта
  # name   : string / [string] - имя шрифта или массив имен
  def changeFont (bitmap, size = 24 , bold = false, italic = false,
                  color = Color.new(255,255,255,255), name = [ Arial ,  Courier New ,  Times New Roman ])
    bitmap.font.size = size
    bitmap.font.bold = bold
    bitmap.font.italic = italic
    bitmap.font.color = color
    bitmap.font.name = name
  end
#------------------------------------------------------------------------------
  # Метод построчно рисует заданный text на bitmap, перенося непомещающиеся слова
  # text     : string  - строка (длина не важна), которую требуется записать
  # bitmap   : bitmap  - изображение, на котором будем рисовать
  # width    : integer - максимальная длина строк
  # x        : integer - координата x начала первой строки
  # y        : integer - координата y начала первой строки
  # height   : integer - высота строки; при некорректном значении, будет высчитана автоматически
  def hyphenDrawText (text, bitmap, width, x = 20, y = 20, height = -1)
    n = 0
    index = 0
    strings = []
    while n   text.size
      length = text.size
      while bitmap.text_size(text[n, length]).width   width
        length /= (bitmap.text_size(text[n, length]).width.to_f / width.to_f).to_f
      end
      strings[index] = text[n, length]
      while (strings[index][length - 1, 1] !=     && strings[index][length - 1, 1] !=   )
        length -= 1
        strings[index] = strings[index][0, length]
      end
      n += length - 1
      index += 1
    end
    for i in 0..strings.size - 1
      if strings[i][0, 1] ==     then strings[i] = strings[i][1, strings[i].size] end
      if height   (bitmap.font.size.to_f / 1.2).to_f then height = bitmap.text_size(strings[i]).height end
      bitmap.draw_text(x, y + height * i, width, height, strings[i])
    end
  end
#------------------------------------------------------------------------------
  # Метод рисует геометрические фигуры на заданном изображении
  # bitmap : bitmap - изображение, на котором будем рисовать
  # type   : string - тип фигуры, которую будем рисовать
  # color  : color  - цвет, который будем использовать, к примеру Color.new(255,255,255,255)
  # Прочие параметры изменяются от фигуры к фигуре - смотрим скрипт
  # Доступные типы фигур:  square  =  квадрат;
  def drawFigure (bitmap, type, color, param1 = 0, param2 = 0, param3 = 0, param4 = 0, param5 = 0, param6 = 0)
    case type
    when  square 
      filling = param1 # : integer [0, 1] - будем ли заливать квадрат или оставим его пустым
      gauge   = param2 # : integer - толщина линии, в случае заливки принципиального значения не имеет
      x       = param3 # : integer - координата x верхнего левого угла квадрата
      y       = param4 # : integer - координата y верхнего левого угла квадрата
      width   = param5 # : integer - ширина квадрата
      height  = param6 # : integer - высота квадрата
      if filling != 0
        bitmap.fill_rect(x, y, width, height, color)
      else
        bitmap.fill_rect(x, y, width, gauge, color)
        bitmap.fill_rect(x, y, gauge, height, color)
        bitmap.fill_rect(x, y + height - gauge, width, gauge, color)
        bitmap.fill_rect(x + width - gauge, y, gauge, height, color)
      end
    end
  end
#------------------------------------------------------------------------------
  # Метод возвращает первый найденный файл в директории path,
  # с именем filename и расширением, взятым из массива exp
  # path     : string - директория в которой следует производить поиск,
  #                     может быть приравнена к    или nil
  # filename : string - имя файла или его абсолютный адрес без расширения
  # exp      : string / [string] - одна из констант, передаваемая в виде строки
  #                                или массив возможных расширений файла
  # Константы для exp:  images  =  изображения;  audio  =  аудио.
  def findFileExp (path, filename, exp)
    if filename == nil || filename ==   
      return false
    end
    if path == nil then path =    end
    if exp ==  images 
      exp = [ png ,  jpg ,  bmp ]
    elsif exp ==  audio 
      exp = [ mp3 ,  wav ,  ogg ,  wma ]
    end
    for i in 0..exp.size - 1
      if FileTest.exist?(path + filename +  .  + exp[i])
        return (filename +  .  + exp[i])
      end
    end
    return false
  end   
#------------------------------------------------------------------------------
end
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Тема заблокирована.

(XP)EKLib v1.5 15 года 7 мес. назад #23497

  • Kuraudo
  • Kuraudo аватар
  • Вне сайта
  • Просветлённый
  • Философ
  • Сообщений: 456
  • Спасибо получено: 7
  • Организатор конкурсовРазработчик2 место 3 место
Такс, пока мало представляю как это выглядит, но спасибо, попробую разобраться)
Это все, потому что я ужасный тип.
Тема заблокирована.

(XP)EKLib v1.5 15 года 7 мес. назад #23498

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
Попробуй. И доложи о результатах. (=
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Тема заблокирована.

(XP)EKLib v1.5 15 года 7 мес. назад #23501

  • Arykray
  • Arykray аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 595
  • Спасибо получено: 52
Больше всего мне понравилось в этом коде то, что он отформатирован по всем правилам и приятен для чтения))))
Чем сложнее задача - тем проще ее не решать.

Тема заблокирована.

(XP)EKLib v1.5 15 года 7 мес. назад #23503

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
Хех, это такой вежливый намек, что само он фигня, нафиг никому не нужен, а пара идей, которые еще можно было вытянуть на троечку исполнены на -6? ^______^
Но, спасибо, старался... ^^ И по части оформления тоже. (=
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Тема заблокирована.

(XP)EKLib v1.5 15 года 7 мес. назад #23506

  • Inca
  • Inca аватар
Equilibrium Keeper, а опиши пожалуйста популярнее для чего такие скрипты можно использовать. Мне что-то трудно сообразить...
Тема заблокирована.

(XP)EKLib v1.5 15 года 7 мес. назад #23509

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
getImagePartByIndex - вещь ценная и нужная, спасет вас от бесчисленных картинок в папках графики. Актуально, к примеру, если у вас в проекте 100+ иконок предметов. Или та же сотня монстров и у каждого своя физиономия. Да, собственно, и для сетов мосек каваииных персонажей подойдет. Просто пихаем все изображения в один файл (при условии, что они одинакового размера), а потом циферкой выбираем нужный фрагмент.
intToString - за большую востребованность данного метода не ручаюсь, но пригодиться может, к примеру, когда нужно перебрать большое количество файлов, различающиеся лишь порядковым номером. Иначе, придется называть их без ноликов и в папке они будут следовать примерно так: a1, a2, a20, a21, a22, a23, a3, a4... и т.д. Думаю, понятно. Не смертельно, но, имхо, не удобно. Уж лучше старые добрые нолики - a01, a02, a03....
changeFont - этот товарищь еще до конца не сформирован, и я сильно сомневаюсь в его необходимости, но пока рука не поднимается удалить... прикручу поддержку фонтов, что бы он менял, как их на битмапах, так и просто их, может, еще чего придумаю... а может и потру...
hyphenDrawText - без лишней скромности скажу, что значение этого метода переоценить сложно. Ибо стоит тебе попытаться нарисовать текст в 2 и более строчки на битмапе, если по какой-то причине (а причин полно) не получится сделать это стандартным мессаджем, как тут же возникнет проблема переноса слов. Этот метод наиболее оптимально подсчитывает длину для каждой строки, с учетом типа и размера шрифта, подбирает высоту строки, если ее не указать вручную, и сам переносит непомещающиеся слова! Причем именно слова, не оставляя кусок слова на одной строке, а другой - на второй. В будущем добавлю поддержку больших слов - которые при всем желании не поместятся на строке (сейчас выдает false) и выравнивание текста, аля html овские align и valign
drawFigure - просто и мило. несмотря на то, что сейчас оно умеет рисовать лишь квадраты, даже это умение способно облегчить кому-нибудь жизнь, если квадрат нужно нарисовать полый , и не 1, а десяток. Моя большая мечта - научить его рисовать кружки. ^^
findFileExp - это вторая сомнительная функция... тем не менее, ее можно использовать что бы выбрать наиболее предпочтительное расширение файла, а соответственно появляется возможность хранить несколько файлов под одним именем, но с разными расширениями... фигня, конечно, но вдруг кому-нибудь пригодится?..

Воть... =^-^=
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Тема заблокирована.

(XP)EKLib v1.5 15 года 7 мес. назад #23510

  • Dr. Nick To
  • Dr. Nick To аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 2158
  • Спасибо получено: 24
Не простую ты штуку выбрал. Особенно тем, что это не просто набор скриптов, а библиотека расширяющая способности мейкера. (разработчики бы об этом подумали)

getImagePartByIndex я смотрю работет с любой картинкой как с тайлсетом, выбитает фрагмент рисунка. И если самим тайлам она не поможет, всё равно эвент, но вот с другой графикой, ты прав, может. Только вот листы графики, как раз то, что ограничивает. Ибо поменять элемент в середине листа будет непросто. (не программе, а пользователю. Например рожа не понравилась)
Вот если эта функция сможет отвечать ещё и за анимацию произвольных кусков графики (То есть не брать один и показывать, а брать несколько, и показывать по очереди.), тогда будет гениально.


intToString Ещё неплохо бы выбирать количество ноликов.
Народ у нас жадный. Кому то количество предметов 01 хватит, а другому и 001 мало.


changeFont без комментариев. Хорошая функция, пригодится.
особенно вместе с hyphenDrawText

drawFigure это вообще первый шаг к созданию графичаского редактора на мейкере. А если без шуток, то в мейкере нарисовать интересно не квадрат, а проще, линию. Таким образом изменяя эту функцию, можно делать полоски жизни или там маны без извращений. Просто пускать поверх шаблона линию сделанную c помощью. drawFigure А если ещё и градиент прикрутить, то ух чего можно будет сделать.
На седьмом столбе мудрости дома клана Тайра в Эдо написано: Каждый, кто не понимает разницу между небрежностью и качеством, старанием и поспешностью, - достоин сожаления.
Тема заблокирована.

(XP)EKLib v1.5 15 года 7 мес. назад #23511

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3

getImagePartByIndex Ибо поменять элемент в середине листа будет непросто. (не программе, а пользователю. Например рожа не понравилась)
Вот если эта функция сможет отвечать ещё и за анимацию произвольных кусков графики (То есть не брать один и показывать, а брать несколько, и показывать по очереди.), тогда будет гениально.
Да, насчет замены - верно. К сожалению, мои познания в программировании не столь велики, как хотелось бы; а так, в идеале, собрать бы внешнюю программку для работы с такими вот произвольными сетами... Может, и займусь...
Ну, а по поводу последовательности картинок - поскольку она ничего сама не показывает, а лишь возвращает образец bitmap, то нет ничего сложного в том, что бы вернуть целый массив из определенного количества элементов. Сделаю.
intToString Ещё неплохо бы выбирать количество ноликов.
Народ у нас жадный. Кому то количество предметов 01 хватит, а другому и 001 мало.
А выбор количества ноликов там есть ^_-
def intToString (number, digits = 3, filling_symbol = 0 ).
И даже выбор значка, если не нравится нолик. ^^
changeFont без комментариев. Хорошая функция, пригодится.
особенно вместе с hyphenDrawText
В таком случае довожу ее до ума.
drawFigure это вообще первый шаг к созданию графичаского редактора на мейкере. А если без шуток, то в мейкере нарисовать интересно не квадрат, а проще, линию. Таким образом изменяя эту функцию, можно делать полоски жизни или там маны без извращений. Просто пускать поверх шаблона линию сделанную c помощью. drawFigure А если ещё и градиент прикрутить, то ух чего можно будет сделать.
А вот тут меня опредили. Чужую славу грабастать себе не буду, но имени автора я не знаю. =\
class Bitmap
  def draw_line(start_x, start_y, end_x, end_y, start_color, width = 1, end_color = start_color)
    distance = (start_x - end_x).abs + (start_y - end_y).abs
    if end_color == start_color
      for i in 1..distance
        x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
        y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
        if width == 1
          self.set_pixel(x, y, start_color) 
         else
          self.fill_rect(x, y, width, width, start_color) 
        end
      end
    else
      for i in 1..distance
        x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
        y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
        r = start_color.red   * (distance-i)/distance + end_color.red   * i/distance
        g = start_color.green * (distance-i)/distance + end_color.green * i/distance
        b = start_color.blue  * (distance-i)/distance + end_color.blue  * i/distance
        a = start_color.alpha * (distance-i)/distance + end_color.alpha * i/distance
        if width == 1
          self.set_pixel(x, y, Color.new(r, g, b, a))
        else
          self.fill_rect(x, y, width, width, Color.new(r, g, b, a)) 
        end
      end
    end
  end
end
Узнать бы имя автора - переписал бы под свою библиотеку с сохранением копирайтов. А так... Автор, я так понимаю, кто-то из корейцев... Теперь даже самому нечто похожее не написать - чужие формулы засели в голове. =\
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Тема заблокирована.

(XP)EKLib v1.5 15 года 5 мес. назад #24058

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
К выходу готовится новая версия. так теперь вопрос:
Как лучше сделать: Отдельным классом, как это сделано сейчас - соответственно сохранится совместимость с ранними версиями.
Или же изменять существующие классы, такие как Bitmap, добавляя им новые методы?
Как будет выглядеть грамотнее, красивее и... удобнее... с точки зрения скриптописания?
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Тема заблокирована.

(XP)EKLib v1.5 15 года 5 мес. назад #24059

  • Arykray
  • Arykray аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 595
  • Спасибо получено: 52
Делай так, как тебе приятней, это твой скрипт и ты в праве преподнести его как считаешь нужным!
Чем сложнее задача - тем проще ее не решать.

Тема заблокирована.

(XP)EKLib v1.5 15 года 5 мес. назад #24061

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
Сделал, так, как считал правильнее. ^_^
Обновлено в соседней темке.
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Тема заблокирована.

(XP)EKLib v1.5 15 года 5 мес. назад #24184

  • Dr. Nick To
  • Dr. Nick To аватар
  • Вне сайта
  • Архитектор Миров
  • Сообщений: 2158
  • Спасибо получено: 24
Тема закрыта. Продолжение смотрите в теме
(XP)EKLib v2.0
rpg-maker.info/index.php?option=com_smf&...g24183;topicseen#new
На седьмом столбе мудрости дома клана Тайра в Эдо написано: Каждый, кто не понимает разницу между небрежностью и качеством, старанием и поспешностью, - достоин сожаления.
Тема заблокирована.
Модераторы: NeKotZima
Время создания страницы: 0.308 секунд