Pull to refresh

Scala + Processing – интересный способ выучить новый язык

Reading time4 min
Views10K
Недавно мне довелось на собственном опыте убедиться: чтобы научиться применять какие-то новые технологии, недостаточно прочитать пару книг по теме, потому что без практики теория мгновенно улетучивается из головы.

Но что можно сделать такого интересного на Scala? На самом деле, выбор не слишком большой. Я как-то придумал небольшую тулзу, неспешно написал ее, и «забил». А через несколько месяцев, к своему стыду, гуглил синтаксис «for loop»…

Я решил, что дальше так дело не пойдет, и нужно найти какие-то небольшие проектики на основные возможности языка. Тут мне и пригодился Processing. Скучные учебные проекты он любому новичку (вроде меня) поможет превратить в визуальные инсталляции. А дальше можно выбрать, что покопать углубленно — например, генерацию фракталов, рендеринг частиц или визуализацию данных.

Я переписал на Scala и выложил на GitHub парочку примеров. На скрине как раз один из них — MSA Fluids. Заинтересовавшихся прошу под кат.



Когда-то я познакомился со Scala, и этот язык мне моментально понравился. Я пролистал несколько книг, в том числе и Programming in Scala, которую рекомендую решительно всем. Даже только теория позволила мне по-другому взглянуть на мир программирования. К большому сожалению, моя основная работа со Scala никак не связана, да и вообще язык, которым я лучше всего владею, в некоторых местах довольно сильно от нее отличается. И язык этот не Processing.

Processing


Итак, тут как раз отличное время представить Processing, так как мало кто о нем слышал, а уж руками трогали вообще единицы. Processing – это DSL для Java со своим микро IDE и разными библиотеками. Используется так называемыми Visual Artists для генерации всякого красивого трэшака.

Рекомендую покликать на Vimeo по видео с тэгом processing и посмотреть что народ придумывает. Вот парочка красивых:







Дабы не повторяться, на Хабре уже публиковались несколько интересных статей о Processing:

А я лишь кратко резюмирую все в них написанное своими словами. Помните, в детстве учили программированию на Бейсике или Logo, там черепашка линии рисовала? Ясен пень, каждый тут может наворотить еще и не такую красоту на своем любимом языке. Да еще в тридцать слоев абстракции обернет по дороге. А простым людям сложно понять что за ООП, классы, библиотеки такие, да и не нужно это им.

Вот и решили сделать такой простой язык на базе Java, чтобы помочь обычным Visual Artists воплощать свои идеи в императивном стиле. Мол, нарисуй тут линию, а тут квадратик. И пошло-поехало. Сейчас Processing уже сильно разросся и его сложно игнорировать. Для него написано множество отличных библиотек, а так как по сути это Java, можно использовать и вагон Java библиотек.

А Scala тоже выполняется на JVM… ну вы поняли, да?

На самом деле есть целый проект на основе Processing IDE, который позволяет писать на Scala – Spde. И про него уже писали на scala-lang.org. Но IDE этот мне кажется маленьким и несерьезным. Попытайся написать что-то большое и начнутся головняки. Так что давайте остановимся на чем-то более удобном.

Установка и настройка


Скорее всего, какой-то IDE для разработки на Scala у Вас уже стоит, так что не буду заострять на этом внимание. Я использую intelliJ IDEA со Scala плагином.

Сперва нужно скачать и установить Processing.


Далее в Scala проект подключить основную Processing библиотеку.

На Windows путь примерно аналогичный.

Код


Теперь создаем новый main класс. Я его назвал просто Test.

import processing.core._

object Test extends PApplet {

  private var test:Test = _

  def main(args: Array[String]) = {
    test = new Test
    val frame = new javax.swing.JFrame("Test")
    frame.getContentPane().add(test)
    test.init

    frame.pack
    frame.setVisible(true)
  }

}

class Test extends PApplet {

  override def setup() = {
  }

  override def draw() = {
  }
}


В Processing большинство функционала зашито в класс PApplet. Его, кстати, запускать можно и AppletViewer'ом, если выставить профиль в Run Configurations. Тогда метод main не нужен.

Данный код пока мало что делает, но по нему уже видно обычную структуру программ на Processing (которые называются скетчи). Дальше я немного расширю этот код. Он будет чернобелые рандомные цветочки рисовать за курсором. Вот примерно так:

import processing.core._
import math._
import scala.util.Random

object Test extends PApplet {

  private var test:Test = _

  def main(args: Array[String]) = {
    test = new Test
    val frame = new javax.swing.JFrame("Test")
    frame.getContentPane().add(test)
    test.init

    frame.pack
    frame.setVisible(true)
  }

}

class Test extends PApplet {

  var angle:Int = 0;

  override def setup() = {
    size(640, 360)
    background(102)
    smooth()
    noStroke()
    fill(0, 102)
  }

  override def draw() = {
    angle += 10
    var value = cos(toRadians(angle)) * 6.0
    for (a <- 0 to 360 by 75) {
      val xoff = cos(toRadians(a)) * value
      val yoff = sin(toRadians(a)) * value
      fill(Random.nextInt(255))
      ellipse( (mouseX + xoff).toFloat, (mouseY + yoff).toFloat, value.toFloat, value.toFloat );
    }
    fill(255);
    ellipse(mouseX, mouseY, 2, 2)
  }
}


Что дальше?


Я в качестве эксперимента перевел на Scala парочку интересных примеров (в том числе и знаменитые Fluids от MSA Visuals) и выложил их на GitHub: scala-processing-examples. Сейчас там всего два примера, но они довольно интересные.

Также, Вам наверняка понадобится справка по доступным методам. Ее (и еще множество полезных материалов) всегда можно найти на сайте processing.org.

Лично мой план — взять книжку, сесть и на каждую тему придумывать небольшой скетч, чтобы эту тему визуализировать и запомнить.

Еще несколько замечаний.


Для того, чтобы запустить примеры с GitHub, нужно импортнуть opengl библиотеки.

И (важно!) разархивировать куда-нибудь содержимое .jar архивов с нативными реализациями этих библиотек

А потом в Run Configuration прописать до них путь

Иначе, приложение будет сыпаться с ошибкой, мол, библиотека jogl не найдена.

Я так и не понял как в IDEA подключить нативные библиотеки более правильно. Возможно, никак.

И напоследок


Согласитесь, красивые картинки для изучения интересного языка гораздо лучше, чем унылые текстовые утилиты. Удачных экспериментов!
Tags:
Hubs:
+52
Comments16

Articles

Change theme settings