     #collision routines
     collidesWith: (other) ->
         if other is 'mouse'
-            collision = false
             if @_dis.visible
-                if @get('left', false) < Greenhorn.getMouseX() < @get('right', false) and
-                @get('bottom', false) < Greenhorn.getMouseY() < @get('top', false)
-                    collision = true
+                if @get('left', false) <= Greenhorn.getMouseX() <= @get('right', false) and
+                @get('bottom', false) <= Greenhorn.getMouseY() <= @get('top', false)
+                    return true
+            return false
         else
-            collision = true
-            if @_dis.visible and
-            other._dis.visible and
-            @_dis.level == other._dis.level
-                if @get('bottom', false) > other.get('top', false) or
-                @get('top', false) < other.get('bottom', false) or
-                @get('right', false) < other.get('left', false) or
-                @get('left', false) > other.get('right', false)
-                    collision = false
-            else collision = false
-        collision
+            if @_dis.visible
+                if other._dis.visible
+                    if @_dis.level == other._dis.level
+                        if @distanceTo(other) <= @get('radius', false) + other.get('radius', false)
+                            #declare arrays
+                            myLines = []
+                            otherLines = []
+                            
+                            #create lines representing boundaries
+                            for pt, i in @_bnd
+                                if i is @_bnd.length - 1
+                                    myLines.push new Line pt, @_bnds[0]
+                                else
+                                    myLines.push new Line pt, @_bnds[i+1]
+                            for pt, i in other._bnd
+                                if i is other._bnd.length - 1
+                                    otherLines.push new Line pt, other._bnd[0]
+                                else
+                                    otherLines.push new Line pt, other._bnd[i+1]
+                            
+                            #check for collisions
+                            for myLine in myLines
+                                for otherLine in otherLines
+                                    if myLine.collidesWith otherLine
+                                        return true
+            return false
     distanceTo: (other) ->
         otherX = otherY = 0
         if other is 'mouse'

                -@_dis.height / 2, #top
                @_dis.width, #width
                @_dis.height) #height

            #restore context
            @_dis.context.restore()
    _update: =>
        #fire update event
        @emit 'update'

    #update routines
    _draw: ->
        if @_dis.visible
            #save context
            @_dis.context.save()
            
            #fire draw:before event
            @emit 'draw:before'

            #translate and rotate
            @_dis.context.translate @_pos.x, -@_pos.y
