From abfb596bc9212c5094dc7ec3645ace4e7d35856b Mon Sep 17 00:00:00 2001 From: lstrzebinczyk Date: Sat, 29 Apr 2017 20:28:52 +0200 Subject: introduce lines --- bin/ruby2d | 1 + ext/ruby2d/ruby2d-opal.rb | 17 ++++++++++++++--- ext/ruby2d/ruby2d.c | 43 ++++++++++++++++++++++++++++++++++++++++--- lib/ruby2d.rb | 1 + lib/ruby2d/image.rb | 2 +- lib/ruby2d/line.rb | 41 +++++++++++++++++++++++++++++++++++++++++ lib/ruby2d/sprite.rb | 2 +- lib/ruby2d/text.rb | 2 +- test/testcard.rb | 39 +++++++++++++++++++++++++++++++-------- 9 files changed, 131 insertions(+), 17 deletions(-) create mode 100644 lib/ruby2d/line.rb diff --git a/bin/ruby2d b/bin/ruby2d index c98b464..aa486ea 100755 --- a/bin/ruby2d +++ b/bin/ruby2d @@ -21,6 +21,7 @@ end 'application', 'dsl', 'quad', + 'line', 'rectangle', 'square', 'triangle', diff --git a/ext/ruby2d/ruby2d-opal.rb b/ext/ruby2d/ruby2d-opal.rb index 666a354..3d4be42 100644 --- a/ext/ruby2d/ruby2d-opal.rb +++ b/ext/ruby2d/ruby2d-opal.rb @@ -12,9 +12,10 @@ $R2D_WINDOW = nil // @type_id values for rendering const $R2D_TRIANGLE = 1; const $R2D_QUAD = 2; -const $R2D_IMAGE = 3; -const $R2D_SPRITE = 4; -const $R2D_TEXT = 5; +const $R2D_LINE = 3; +const $R2D_IMAGE = 4; +const $R2D_SPRITE = 5; +const $R2D_TEXT = 6; function on_key(e) { @@ -126,6 +127,16 @@ function render() { ); break; + case $R2D_LINE: + S2D.DrawLine( + el.x1, el.y1, el.x2, el.y2, el.width, + el.c1.r, el.c1.g, el.c1.b, el.c1.a, + el.c2.r, el.c2.g, el.c2.b, el.c2.a, + el.c3.r, el.c3.g, el.c3.b, el.c3.a, + el.c4.r, el.c4.g, el.c4.b, el.c4.a + ); + break; + case $R2D_IMAGE: el.data.x = el.x; el.data.y = el.y; diff --git a/ext/ruby2d/ruby2d.c b/ext/ruby2d/ruby2d.c index ae39fbb..ac4100d 100644 --- a/ext/ruby2d/ruby2d.c +++ b/ext/ruby2d/ruby2d.c @@ -92,9 +92,10 @@ // @type_id values for rendering #define R2D_TRIANGLE 1 #define R2D_QUAD 2 -#define R2D_IMAGE 3 -#define R2D_SPRITE 4 -#define R2D_TEXT 5 +#define R2D_LINE 3 +#define R2D_IMAGE 4 +#define R2D_SPRITE 5 +#define R2D_TEXT 6 // Create the MRuby context #if MRUBY @@ -664,6 +665,42 @@ static void render() { } break; + case R2D_LINE: { + R_VAL c1 = r_iv_get(el, "@c1"); + R_VAL c2 = r_iv_get(el, "@c2"); + R_VAL c3 = r_iv_get(el, "@c3"); + R_VAL c4 = r_iv_get(el, "@c4"); + + S2D_DrawLine( + NUM2DBL(r_iv_get(el, "@x1")), + NUM2DBL(r_iv_get(el, "@y1")), + NUM2DBL(r_iv_get(el, "@x2")), + NUM2DBL(r_iv_get(el, "@y2")), + NUM2DBL(r_iv_get(el, "@width")), + + NUM2DBL(r_iv_get(c1, "@r")), + NUM2DBL(r_iv_get(c1, "@g")), + NUM2DBL(r_iv_get(c1, "@b")), + NUM2DBL(r_iv_get(c1, "@a")), + + NUM2DBL(r_iv_get(c2, "@r")), + NUM2DBL(r_iv_get(c2, "@g")), + NUM2DBL(r_iv_get(c2, "@b")), + NUM2DBL(r_iv_get(c2, "@a")), + + NUM2DBL(r_iv_get(c3, "@r")), + NUM2DBL(r_iv_get(c3, "@g")), + NUM2DBL(r_iv_get(c3, "@b")), + NUM2DBL(r_iv_get(c3, "@a")), + + NUM2DBL(r_iv_get(c4, "@r")), + NUM2DBL(r_iv_get(c4, "@g")), + NUM2DBL(r_iv_get(c4, "@b")), + NUM2DBL(r_iv_get(c4, "@a")) + ); + } + break; + case R2D_IMAGE: { S2D_Image *img; r_data_get_struct(el, "@data", &image_data_type, S2D_Image, img); diff --git a/lib/ruby2d.rb b/lib/ruby2d.rb index 4c13dd9..9642aa1 100644 --- a/lib/ruby2d.rb +++ b/lib/ruby2d.rb @@ -7,6 +7,7 @@ require 'ruby2d/window' require 'ruby2d/application' require 'ruby2d/dsl' require 'ruby2d/quad' +require 'ruby2d/line' require 'ruby2d/rectangle' require 'ruby2d/square' require 'ruby2d/triangle' diff --git a/lib/ruby2d/image.rb b/lib/ruby2d/image.rb index 85ee076..91bb3f3 100644 --- a/lib/ruby2d/image.rb +++ b/lib/ruby2d/image.rb @@ -15,7 +15,7 @@ module Ruby2D end end - @type_id = 3 + @type_id = 4 @x, @y, @path = x, y, path @z = z @color = Color.new([1, 1, 1, 1]) diff --git a/lib/ruby2d/line.rb b/lib/ruby2d/line.rb new file mode 100644 index 0000000..5053854 --- /dev/null +++ b/lib/ruby2d/line.rb @@ -0,0 +1,41 @@ +# line.rb + +module Ruby2D + class Line + include Renderable + attr_accessor :x1, :x2, :y1, :y2, :color, :width + + def initialize(x1, y1, x2, y2, width=2, c='white') + @type_id = 3 + @x1, @y1, @x2, @y2 = x1, y1, x2, y2 + @width = width + self.color = c + add + end + + def color=(c) + @color = Color.from(c) + update_color(@color) + end + + private + + def update_color(c) + if c.is_a? Color::Set + if c.length == 4 + @c1 = c[0] + @c2 = c[1] + @c3 = c[2] + @c4 = c[3] + else + raise ArgumentError, "Lines require 4 colors, one for each vertex. #{c.length} were given." + end + else + @c1 = c + @c2 = c + @c3 = c + @c4 = c + end + end + end +end diff --git a/lib/ruby2d/sprite.rb b/lib/ruby2d/sprite.rb index ad8dc17..93f4f58 100644 --- a/lib/ruby2d/sprite.rb +++ b/lib/ruby2d/sprite.rb @@ -12,7 +12,7 @@ module Ruby2D # raise Error, "Cannot find image file `#{path}`" # end - @type_id = 4 + @type_id = 5 @x, @y, @path = x, y, path @clip_x, @clip_y, @clip_w, @clip_h = 0, 0, 0, 0 @default = nil diff --git a/lib/ruby2d/text.rb b/lib/ruby2d/text.rb index b3b4529..e326029 100644 --- a/lib/ruby2d/text.rb +++ b/lib/ruby2d/text.rb @@ -15,7 +15,7 @@ module Ruby2D # @font = resolve_path(font) # end - @type_id = 5 + @type_id = 6 @x, @y, @size = x, y, size @z = z @text = text.to_s diff --git a/test/testcard.rb b/test/testcard.rb index a7dc308..a6341c7 100644 --- a/test/testcard.rb +++ b/test/testcard.rb @@ -136,18 +136,41 @@ Quad.new( ] ) +# Lines +Line.new( + 354, 204, 397, 247, + 11, + [ + [1, 1, 1, 1], + [1, 1, 1, 1], + [1, 1, 1, 1], + [1, 1, 1, 1] + ] +); + +Line.new( + 395, 205, 355, 245, + 15, + [ + [1, 0, 0, 0.5], + [0, 1, 0, 0.5], + [0, 0, 1, 0.5], + [1, 0, 1, 0.5] + ] +); + # Images Image.new(590, 180, "#{media}/image.png") Image.new(590, 290, "#{media}/image.jpg") Image.new(590, 400, "#{media}/image.bmp") -img_r = Image.new(350, 200, "#{media}/colors.png") -img_r.width, img_r.height = 50, 50 +img_r = Image.new(400, 200, "#{media}/colors.png") +img_r.width, img_r.height = 50, 25 img_r.color = [1.0, 0.3, 0.3, 1.0] -img_g = Image.new(400, 200, "#{media}/colors.png") -img_g.width, img_g.height = 50, 50 +img_g = Image.new(400, 225, "#{media}/colors.png") +img_g.width, img_g.height = 25, 25 img_g.color = [0.3, 1.0, 0.3, 1.0] -img_b = Image.new(450, 200, "#{media}/colors.png") -img_b.width, img_b.height = 50, 50 +img_b = Image.new(425, 225, "#{media}/colors.png") +img_b.width, img_b.height = 25, 25 img_b.color = [0.3, 0.3, 1.0, 1.0] # Text @@ -162,7 +185,7 @@ txt_b.color = [0.0, 0.0, 1.0, 1.0] fps = Text.new(10, 470, "", 20, font) # Sprites -s1 = Sprite.new(500, 200, "#{media}/sprite_sheet.png") +s1 = Sprite.new(450, 200, "#{media}/sprite_sheet.png") s1.add(forwards: [ [ 0, 0, 50, 50, 30], [ 50, 0, 50, 50, 40], @@ -176,7 +199,7 @@ pointer_outline = Square.new(0, 0, 18, [0, 1, 0, 0]) flash = 0 # Updating opacity -opacity_square = Square.new(500, 255, 50, ["red", "green", "blue", "yellow"]) +opacity_square = Square.new(500, 200, 50, ["red", "green", "blue", "yellow"]) time_start = Time.now # Text size -- cgit v1.2.3