require 'oekaki'
include Math

L = 400
R1 = 150; R2 = (L - R1 * 2) / 2 - 5
STP1 = (PI / 180) * 0.5; STP2 = (PI / 180) * 10

Oekaki.app width: L, height: L do
  draw do
    clear
  end

  i = 0

  timer(20) do
    x = L / 2 + (R1 * cos(STP1 * i) + R2 * cos(STP2 * i))
    y = L / 2 - (R1 * sin(STP1 * i) + R2 * sin(STP2 * i))
    color(0, 65535, 0)
    arc(false, x, y, 3, 3, 0, 64 * 360)
    i += 1
  end

  key_in do |w, e|
    Gtk.main_quit if e.keyval == Gdk::Keyval::GDK_Return
  end
end

   

require 'oekaki'

Oekaki.app width: 300, height: 300 do
  draw do
    white = color(65535, 65535, 65535)
    red   = color(65535, 0, 0)
    blue  = color(0, 0, 65535)

    rectangle(true, 0, 0, 300, 300, white)

    ar = []
    50.times {ar << [rand(300), rand(300)]}    #線の数は50本(配列に座標を入れる)
    polygon(true, ar, blue)                    #多角形を描く

    text("Polygon", 180, 260, 20 * 1000, red)  #文字列を描く

    img = get_pic(0, 0, 300, 300)              #画像の取り込み
    save_pic(img, "sample.png")                #画像ファイルに保存
  end
end

   

require 'oekaki'

L = 400

Oekaki.app width: L, height: L, title: "Circle Fall" do
  timer(10) do
    show = proc do |y|
      x = rand(L - 10)
      color(rand(65535), rand(65535), rand(65535))
      arc(true, x, y, 10, 10, 0, 64 * 360)
    end

    show.call(0) if rand < 0.15
    show.call(rand(L - 10)) if rand < 0.05

    img = get_pic(0, 0, L, L)
    show_pic(img, 0, 1)
    color(0, 0, 0)
    rectangle(true, 0, 0, L, 1)
  end

  key_in do |w, e|
    Gtk.main_quit if e.keyval == Gdk::Keyval::GDK_Return
  end

  draw do
    color(0, 0, 0)
    rectangle(true, 0, 0, L, L)
  end
end

   

require 'oekaki'

L = 500; R = 25

Oekaki.app width: L, height: L do
  draw do
    clear
  end

  quit_window = proc do
    make_window do |w|
      w.title = ""
      b = button do
        set_size_request(120, 40)
        add(Gtk::Label.new.set_markup('<span size="x-large">Quit!</span>'))
        signal_connect("clicked") {Gtk.main_quit}
      end
      add(b)
    end
  end

  mouse_button do |w, e|
    quit_window.call if e.button != 1
    color(rand(65536), rand(65536), rand(65536))
    arc(true, e.x - R, e.y - R, R * 2, R * 2, 0, 64 * 360) 
  end
end

   

require 'oekaki'

Width, Height = if ARGV.size == 2
  ARGV.map(&:to_i)
else
  [1000, 700]
end

Max_r, Min_r = 40, 10
ColorMax = 65535
MaxNum = 60

class Circle
  def initialize(ob)
    @slot = ob
    @width, @height = Width, Height
    renewal
    @y = rand(@height)
  end
  attr_reader :height
  attr_writer :y

  def renewal
    @width, @height = @slot.get_window_size
    @max_r = rand(Max_r - Min_r) + Min_r
    @x = rand(@width)
    @y = -rand(@max_r)
    @color = [rand(ColorMax), rand(ColorMax), rand(ColorMax)]
    @fall_step = 1 + rand * 3
    @r = 1
    @r_step = rand * 0.2 + 0.8
  end

  def paint
    @slot.color(@color[0], @color[1], @color[2])
    @slot.circle(true, @x, @y, @r)
    @y += @fall_step
    @r += @r_step
    @r_step *= -1 if @r > @max_r or @r < 1
    renewal if @y > @height + Max_r
    true
  end
end

Oekaki.app width: Width, height: Height, resizable: true do
  circles = []
  MaxNum.times {circles << Circle.new(self)}
  black = color(0, 0, 0)

  draw do
    clear
  end

  timer(60) do
    clear(black)
    circles.each(&:paint)
  end

  window_changed do
    clear(black)
    circles.each do |c|
      c.renewal
      c.y = rand(c.height)
      c.paint
    end
  end
end