I figured out what is going on, and it is not good.
Since I was seeing such weird things using the MIDP 2.0 GameCanvas classes on the blackberry, I decided to try other MIDP platforms.
Unfortunately the problems appear to be with the blackberry MIDP 2.0 implementation. I have tried some sample apps on multiple platforms (using NetBeans) and here are the things I have found with the Blackberry implementation of "javax.microedition.lcdui.Game"
1. When placing a Sprite, the (X,Y) location is not correct, the actual placement will always be (x*2,Y*2) instead.
2. When using a sprite with multiple frames, the position of the sprite will be offset by HALF the location of the frame in the sequence. So if you supply the sprite frames in a vertical strip, when using setReferencePixel(x,y), you really have to call setReferencePixel(x/2,y/2 + (frame*(framewidth/2))) in order for your sprite to show up on the screen at (x,y).
3. Collision detection using the Sprite.collidesWith() is also pretty messed up, I haven't figured out a work-around yet. I don't think there is one, I think that the internal positions are being used, but the layers are being placed on the screen wrong. So either the collisions work, or the screen looks right, and you won't get them both to work right.
I don't know how any of this affects the javax.microedition.lcdui.Graphics classes yet, but I don't think it does, everything I've used seems to work as I expect.
Again, I have verified this with other sample applications compiled for multiple platforms, as well as my own. Does anyone know of any updates or patches? Does anyone know where/who I can submit this bug report to?
Obviously the blackberry is targeted to professionals (like myself) and this is the MIDP Game API, but even professionals like to play sometimes.
And these problems make porting of MIDlets tough.