SFML community forums

Help => Window => Topic started by: Lauro on January 06, 2020, 11:03:33 am

Title: Sprite not in the expected position
Post by: Lauro on January 06, 2020, 11:03:33 am
I create the render window in a state (I use state manager) in this way:
renderWindow.create(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Xenon", sf::Style::Fullscreen);
 

where the two macros are 1280 and 800.

in another state(objects are shared among states well, I'm sure), when I create a object that is supposed to be in the center of the screen, it is shifted to the right.
Specifically I have a spaceship class that has 4 "different" spaceship possible. The difference, other than their stats (fire rate, acceleration and so on.. that I will not report since they are not influent), are of course the dimensions of the sprite, that I use to subtract it to the half of the screen dimensions (both in width and height) to move its top left corner and put the spaceship's center in the center of the window.
Three of the spaceships are centred well, one is shifted in the right (correct y-position, x-position shifted to the right side of the screen).

this is how I manage the positioning, I will cut the stats attribution since are irrelevant:
xPos=((float)WINDOW_WIDTH - sprite.getLocalBounds().width)/2;
    yPos=((float)WINDOW_HEIGHT - sprite.getLocalBounds().height)/2;
    std::cout << xPos << ", " << yPos << std::endl;
    sprite.setPosition(xPos, yPos);
    std::cout << "position is" << sprite.getPosition().x << ", " << sprite.getPosition().y << std::endl;
    sprite.setOrigin(sprite.getLocalBounds().width/2,sprite.getLocalBounds().height/2);
 
I use the same code for all the 4 spaceships, in facts the constructor use a switch case for the texture selection and appropriate stats attribution, than it has a shared part (out of the switch case) with this portion of code.

What's the problem? I added the first cout to see what value is assigned to xPos and yPos but it always print the value it should have, and it is the same printed to the second cout, every time i run the program, for all the spaceships.

EDIT: now I changed a minor thing in the program, the entities life is considered as boolean and not as int and now randomly 2 spaceship are in the correct position and 2 are shifted (once i experienced a shift on the left)...
Title: Re: Sprite not in the expected position
Post by: Laurent on January 06, 2020, 12:52:43 pm
If you set the origin of your sprites to their center, then their position should just be the center of the window (WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2). Your code would work only in the case of the default origin (ie. the top-left corner).

But the shifting should be consistent, if you see random results then you may have some other problem, probably elsewhere in your code.
Title: Re: Sprite not in the expected position
Post by: Lauro on January 06, 2020, 04:46:15 pm
Thanks Laurent, I did so:
sprite.setOrigin(sprite.getLocalBounds().width/2,sprite.getLocalBounds().height/2);
    xPos = (float)WINDOW_WIDTH/2;
    yPos = (float)WINDOW_HEIGHT/2;
    sprite.setPosition(xPos, yPos);
 

and this is not resolving anything but the fact that now 3 sprites are positioned well and 1 is still not positioned well  :o :-\
Title: Re: Sprite not in the expected position
Post by: Hapax on January 06, 2020, 04:54:01 pm
The following isn't the solution since there is clearly something happening that shouldn't be that you need to know about but...

If you set the sprite's position to the view's centre, does that place it in the correct place?:
sprite.setPosition(renderWindow.getView().getCenter());
Title: Re: Sprite not in the expected position
Post by: Lauro on January 06, 2020, 06:16:39 pm
The following isn't the solution since there is clearly something happening that shouldn't be that you need to know about but...

If you set the sprite's position to the view's centre, does that place it in the correct place?:
sprite.setPosition(renderWindow.getView().getCenter());

the fact is that the sprite I have to center doesn't know about the render window..

edit: I tried as you said and it works fine, but the code now is a bit messy, and i haven't touched anything since last edit report
edit2: Now, all ok, just the same problematic spaceship is shifted in the bottom, but has the correct axis
Title: Re: Sprite not in the expected position
Post by: Lauro on January 07, 2020, 01:16:46 pm
somebody has any idea?
Title: Re: Sprite not in the expected position
Post by: Laurent on January 07, 2020, 01:37:14 pm
You should write a complete and minimal example that reproduces the problem, then post it here.