why are my players drawn to the side of my viewport

Posted by Jetbuster on Game Development See other posts from Game Development or by Jetbuster
Published on 2014-06-08T11:10:07Z Indexed on 2014/06/09 3:44 UTC
Read the original article Hit count: 253

Filed under:
|
|

Following this admittedly brilliant and clean 2d camera class I have a camera on each player, and it works for multiplayer and i've divided the screen into two sections for split screen by giving each camera a viewport. However in the game it looks like this my brand

I'm not sure if thats their position relative to the screen or what

The relevant gameScreen code, the makePlayers is setup so it could theoretically work for up to 4 players

    private void makePlayers()
    {
        int rowCount = 1;
        if (NumberOfPlayers > 2) rowCount = 2;
        players = new Player[NumberOfPlayers];
        for (int i = 0; i < players.Length; i++)
        {

            int xSize = GameRef.Window.ClientBounds.Width / 2;
            int ySize = GameRef.Window.ClientBounds.Height / rowCount;
            int col = i % rowCount;
            int row = i / rowCount;
            int xPoint = 0 + xSize * row;
            int yPoint = 0 + ySize * col;
            Viewport viewport = new Viewport(xPoint, yPoint, xSize, ySize);
            Vector2 playerPosition = new Vector2(viewport.TitleSafeArea.X + viewport.TitleSafeArea.Width / 2,
            viewport.TitleSafeArea.Y + viewport.TitleSafeArea.Height / 2);
            players[i] = new Player(playerPosition, playerSprites[i], GameRef, viewport);
        }
        //players[1].Keyboard = true;
    }

    public override void Draw(GameTime gameTime)
    {
        base.Draw(gameTime);
        foreach (Player player in players)
        {
            GraphicsDevice.Viewport = player.PlayerCamera.ViewPort;
            GameRef.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, player.PlayerCamera.Transform);

            map.Draw(GameRef.spriteBatch);
            // Draw the Player

            player.Draw(GameRef.spriteBatch);                

            // Draw UI screen elements
            GraphicsDevice.Viewport = Viewport;

            ControlManager.Draw(GameRef.spriteBatch);

            GameRef.spriteBatch.End();
        }
    }

the player's initialize and draw methods are like so

    internal void Initialize()
    {
        this.score = 0;
        this.angle = (float)(Math.PI * 0 / 180);//Start sprite at it's default rotation
        int width = utils.scaleInt(picture.Width, imageScale);
        int height = utils.scaleInt(picture.Height, imageScale);
        this.hitBox = new HitBox(new Vector2(centerPos.X - width / 2, centerPos.Y - height / 2), width, height, Color.Black, game.Window.ClientBounds);
        playerCamera.Initialize();
    }

    #region Methods
    public void Draw(SpriteBatch spriteBatch)
    {
        //Console.WriteLine("Hitbox: X({0}),Y({1})", hitBox.Points[0].X, hitBox.Points[0].Y);
        //Console.WriteLine("Image: X({0}),Y({1})", centerPos.X, centerPos.Y);

        Vector2 orgin = new Vector2(picture.Width / 2, picture.Height / 2);
        hitBox.Draw(spriteBatch);

        utils.DrawCrosshair(spriteBatch, Position, game.Window.ClientBounds, Color.Red);
        spriteBatch.Draw(picture, Position, null, Color.White, angle, orgin, imageScale, SpriteEffects.None, 0.1f);
    }

as I said I think I'm gonna need to do something with the render position but I'm to entirely sure what or how it would be elegant to say the least

© Game Development or respective owner

Related posts about XNA

Related posts about 2d