note description: "[ An arrow widget ]" author: "Jimmy J. Johnson" class ARROW inherit VITP_WIDGET redefine default_create, target_imp, build_widgets, paint end create default_create feature {NONE} -- Initialization default_create -- Initialize attributes do -- create head_dot create nock create shaft create head Precursor {VITP_WIDGET} end build_widgets -- Create the widgets that make up Current local t: EV_MODEL_TRANSFORMATION do -- Use the `dot' as reference point to build the arrow (the center of the nock). -- The EV_MODEL_DOT and EV_MODEL_LINE do not scale nicely, so use circle and -- rectangle to build the parts of the arrow. create t.make_zero t.translate (width // 2, 0) dot.transform (t) direction := North build_nock build_shaft build_head end build_nock -- Create the end of the arrow opposite the head -- A circle slightly bigger than the shaft, centered on `dot' local p1, p2: EV_COORDINATE r: INTEGER do r := (width // 2) + (width // 4) create p1.make_precise (dot.x - r, dot.y - r) create p2.make_precise (dot.x + r, dot.y + r) create nock.make_with_points (p1, p2) extend (nock) end build_shaft -- Create the shaft as a rectangle `width' wide with an arrow on the -- end. Assume the arrow tip ends `Default_length' away from `dot'. local p: EV_COORDINATE len, wid: INTEGER do io.put_string ("ARROW.build_shaft -- fix me! Add a pointed tip. %N") len := length wid := width // 2 create shaft create p.make_precise (dot.x - wid, dot.y) shaft.extend_point (p) create p.make_precise (dot.x + wid, dot.y) shaft.extend_point (p) create p.make_precise (dot.x + wid, dot.y + len) shaft.extend_point (p) create p.make_precise (dot.x - wid, dot.y + len) shaft.extend_point (p) extend (shaft) end build_head -- Create the point (or retical) end of the arrow local p: EV_COORDINATE do create head end feature -- Access direction: INTEGER -- The direction the arrow is pointing if not targetting a unit width: INTEGER -- The size of the `shaft' do Result := 100 end length: INTEGER -- The length of the `shaft' calculated from the distance between the -- two widgets or as a percentage of the size of the `unit_widget' local xd, yd: INTEGER do Result := 500 end feature -- Basic operations fill_widgets -- Nothing to do here. do end paint -- Set the colors of the sub-widgets do Precursor {VITP_WIDGET} -- if attached unit_widget as uw then -- if attached targetted_widget as tw then -- if uw.unit.nationality = US then -- nock.set_foreground_color (adjusted_color (US_retical_color)) -- nock.set_background_color (adjusted_color (US_retical_color)) -- shaft.set_foreground_color (adjusted_color (US_retical_color)) -- shaft.set_background_color (adjusted_color (US_retical_color)) -- else -- nock.set_foreground_color (adjusted_color (Japanese_retical_color)) -- nock.set_background_color (adjusted_color (Japanese_retical_color)) -- shaft.set_foreground_color (adjusted_color (Japanese_retical_color)) -- shaft.set_background_color (adjusted_color (Japanese_retical_color)) -- end -- else -- -- there is no target -- nock.set_foreground_color (adjusted_color (arrow_color)) -- nock.set_background_color (adjusted_color (arrow_color)) -- shaft.set_foreground_color (adjusted_color (arrow_color)) -- shaft.set_background_color (adjusted_color (arrow_color)) --io.put_string ("ARROW.paint -- fix me! Hide/show the retical %N") -- end -- end end feature {NONE} -- Implementation target_imp: detachable ATTACK_UNIT -- Anchor for `target' nock: EV_MODEL_ELLIPSE -- Shows the end opposite the head shaft: EV_MODEL_POLYGON -- The shaft of the arrow head: EV_MODEL_POLYGON -- The point of the arrow -- head: RETICAL -- Gun sight retical North: INTEGER = 1 South: INTEGER = 2 East: INTEGER = 3 West: INTEGER = 4 North_east: INTEGER = 5 South_east: INTEGER = 6 North_west: INTEGER = 7 South_west: INTEGER = 8 end