Jump to content

  • Log In with Google      Sign In   
  • Create Account

We need your help!

We need 7 developers from Canada and 18 more from Australia to help us complete a research survey.

Support our site by taking a quick sponsored survey and win a chance at a $50 Amazon gift card. Click here to get started!

what is this code doing

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Anddos   Members   -  Reputation: 558


Posted 23 December 2012 - 10:26 PM

This is the code


p.x = max(min(p.x, 800), 0);
p.y = max(min(p.y, 600), 0);
float x = (p.x - 400) / 800.0f;
float y = (p.y - 300) / 600.0f;    
D3DXVECTOR3 lookAt(x, 1.5f - y, -1.0f);

Edited by Michael Tanczos, 24 December 2012 - 08:51 AM.



#2 Cornstalks   Crossbones+   -  Reputation: 7003


Posted 23 December 2012 - 10:48 PM

It's getting the position of the cursor on the screen, seeing how far away it is from the center of the screen, and then creating a vector that represents this offset, likely to be used to make the camera look at where the cursor is.

[ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

#3 Servant of the Lord   Crossbones+   -  Reputation: 26905


Posted 24 December 2012 - 12:12 AM

To further elaborate:

max() returns whichever of the two parameters are larger.

min() returns whichever of the two parameters are smaller.


p.x and p.y are the location, in pixels, of the mouse on the screen.

The screen's width is 800, and the height is 600.



p.x = max(min(p.x, 800), 0);  //If 'p.x' is greater than the screen's width, it returns the screen's width (just to keep it in bounds).

p.x = max(min(p.x, 800), 0);  //If 'p.x' is less than 0, it returns 0 (just to keep it in bounds).


And the same with 'p.y' and the screen's height.



float x = (p.x - 400) / 800.0f; //Subtracts half the screen's width from 'p.x', to put 'p.x' in a range from -400 to 400 with 0 being the center of the screen.

float x = (p.x - 400) / 800.0f//Divides it by 800, to convert the range from "-400 to 400" to "-0.5 to 0.5".


And the same with 'p.y'...


D3DXVECTOR3 lookAt(x, 1.5f - y, -1.0f); //Creates a 3D math vector for Direct3D. Based off the name of the vector, it'll probably be used to reorient the camera to look in that direction.

It's perfectly fine to abbreviate my username to 'Servant' rather than copy+pasting it all the time.
All glory be to the Man at the right hand... On David's throne the King will reign, and the Government will rest upon His shoulders. All the earth will see the salvation of God.
Of Stranger Flames - [indie turn-based rpg set in a para-historical French colony] | Indie RPG development journal | [Fly with me on Twitter

#4 haegarr   Crossbones+   -  Reputation: 6373


Posted 24 December 2012 - 04:12 AM

(I would expect that GetCursorPos returns pixel indices in the range [0, nCols-1] and [0, nRows-1] for a nCols by nRows screen. If so, then the following 2 aspects are worth to be mentioned. Besides these details the posts above already stated what the snippet is good for.)

First, a given screen of 800 x 600 pixels has pixel indices ranging from 0 to 799 and from 0 to 599. Cursor positions are usually given by the pixel indices the hot spot is over, so the maximums should IMHO be limited to 799 and 599 instead of 800 and 600. (Also I'm not sure why the given code snippet needs to limit the cursor position at all.)

Second, a pixel is a tiny area, but nevertheless an area, while a D3DXVECTOR denotes an infinitesimal small, well, point in this case. To map from the one to the other, one has to decide what location on a pixel should be hit. If nothing "special" is done (as in the given solution), then the lower left corner will be hit. This causes the following asymmetry: The left lower pixel will result in (x,y) = (-0.5, -0.5), while the upper right pixel will result in (x,y) = (0.49875, 0.49833). If, on the other hand, the center should be hit (for symmetrical results), then half the extent of a pixel has to be considered.

Another consequence is that with the solution "as is" the (x,y) = (0,0) results for the pixel to the right and top of the real center of the screen. Actually the screen's center is not covered by a pixel, because it lies at the corners of 4 surrounding pixels, so you can't address it with the pointer device.

Edited by haegarr, 24 December 2012 - 06:34 AM.

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.