I think you might be able to do:
Col=SpriteRayCast(....
Then Col would be the closest sprite to the original start location that is hit. You can probably get the number of hits, location, maybe even bounce vectors - but for detecting if the player is visible or not, the simple ray cast should be fine.
Might be interesting to mix up the ray cast check though, like checking the player position with a random offset, so long as the offset stays within the player sprite, you can add some chance to whether or not you got spotted, but also increase the accuracy.
Like, say the player is 49% visible around a corner, with a straigt collision check, the player would be regarded as hidden, because from the centre of the player sprite to the enemy is a straight an unchanging line. But, if you add a random offset, then theres's probably a 49% chance that the player will be seen, or be seen half as quickly as they would being fully visible. See, the random offset means sometime the offset position will be visible, and sometimes not. With just a little randomness, you'd end up with more realism - if the player is well hidden, like maybe only 5% visible, then it would take 20 times longer, 20 times more checks before the enemy would find them. So long as you don't check for visibility every loop, I think you'd notice the difference with the offset.
I would do something similar in 3D, like check the ray cast between an enemies eyes and a random bone position on a model - this technique is kinda free in terms of performance, and less prone to abuse I think. Sometimes I just sit and wonder why so many AI systems are so stupid and predictable - mix it up a bit - one thing is for sure, AI that is too calculated and precise is boring, a little random behavior here and there can turn that into fascinating

I am the one who knocks...
