require 'gosu' class Map def initialize(width, height) @width = width @height = height @origin_x = width / 2 @origin_y = height / 2 end def transform_x(x, y, z) cart_x = (x - z) * Math.cos(0.46365) cart_x + @origin_x end def transform_y(x, y, z) cart_y = y + (x + z) * Math.sin(0.46365) -cart_y + @origin_y end end class GameWindow < Gosu::Window def initialize super(640, 480, false) self.caption = "Iso" @map = Map.new(640, 480) end def draw draw_box(0, 0, 0, 100, 100, 100, Gosu::Color::BLUE) draw_box(0, 0, 200, 40, 80, 40, Gosu::Color::RED) draw_axes end def draw_axes draw_line_to(0, 0, 0, 200, 0, 0, Gosu::Color::GREEN) draw_line_to(0, 0, 0, 0, 200, 0, Gosu::Color::RED) draw_line_to(0, 0, 0, 0, 0, 200, Gosu::Color::YELLOW) end def draw_line_to(x1, y1, z1, x2, y2, z2, color) draw_line(@map.transform_x(x1, y1, z1), @map.transform_y(x1, y1, z1), color, @map.transform_x(x2, y2, z2), @map.transform_y(x2, y2, z2), color) end def draw_box(x, y, z, width, height, depth, color) draw_line_to(x, y, z, x+width, y, z, color) draw_line_to(x, y, z, x, y+depth, z, color) draw_line_to(x, y, z, x, y, z+height, color) draw_line_to(x, y+depth, z, x+width, y+depth, z, color) draw_line_to(x+width, y, z, x+width, y+depth, z, color) draw_line_to(x, y+depth, z, x, y+depth, z+height, color) draw_line_to(x, y, z+height, x, y+depth, z+height, color) draw_line_to(x, y, z+height, x+width, y, z+height, color) draw_line_to(x, y+depth, z+height, x+width, y+depth, z+height, color) draw_line_to(x+width, y, z+height, x+width, y+depth, z+height, color) draw_line_to(x+width, y+depth, z+height, x+width, y+depth, z, color) draw_line_to(x+width, y, z+height, x+width, y, z, color) end end window = GameWindow.new window.show