I know things similar to this have been posted, but I'm still trying to find a good solution... I'm drawing Texture2D objects on the ground in my game, and for Mouse-Over or targeting methods, I'm detecting whether or not the pixel in that Texture at the mouse position is Color.Transparent. This works perfectly when I do not rotate the texture, but I'd like to be able to rotate textures to add realism/variety. However, I either need to create a new Texture2D that is rotated at the correct angle so that I can detect its pixels, or I need to find some other method of detection... Any thoughts?
1 Answer
\$\begingroup\$
\$\endgroup\$
0
You need to convert the mouse position to image coordinates by 'reverse' rotating the mouse vector. Technically, what you are doing is transforming the mouse position from screen coordinates to image coordinates.
- get the position of the mouse relative to the position of the image
- rotate this vector by the inverse of the angle the image was rotated
use this new vector to inspect the pixel
protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); // TODO: Add your update logic here MouseState ms=Mouse.GetState(); //convert mouse position to a vector Vector2 mPos = new Vector2(ms.X, ms.Y); //get mouse position relative to image position mPos = mPos - spritePos; //rotate the relative mouse vector in the opposite angle that we rotated the image Matrix rot = Matrix.CreateRotationZ(-spriteAngle); mPos = Vector2.Transform(mPos,rot); //add the image origin (if used in drawing) mPos += imageOrigin; //now the mouse position is Image coordinates //convert mouse position to a point for next stage Point mP=new Point((int)mPos.X,(int)mPos.Y); if(imageRect.Contains(mP)){// check if point is in the image rectangle //get the index of the pixel in the color array int index = mP.X +mP.Y * image.Width; if (imageData[index] == Color.Transparent) { //do stuff; } } base.Update(gameTime); }