[C#/XNA] Kamera a "obiekty" 3037 1

O temacie

Autor Remix

Zaczęty 5.07.2014 roku

Wyświetleń 3037

Odpowiedzi 1

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O
Przepraszam jeśli źle nazwałem ten temat jednak nie wiedziałem jak go nazwać :)

Mam mianowicie malutki problem dot. kamery. Otóż mam taki oto kod kamery:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace Camera
{
    public class Camera2D
    {
        protected float _zoom;
        protected Matrix _transform;
        protected Matrix _inverseTransform;
        protected Vector2 _pos;
        protected float _rotation;
        protected Viewport _viewport;
        protected MouseState _mState;
        protected KeyboardState _keyState;
        protected Int32 _scroll;

        public float Zoom
        {
            get { return _zoom; }
            set { _zoom = value; }
        }
        /// <summary>
        /// Camera View Matrix Property
        /// </summary>
        public Matrix Transform
        {
            get { return _transform; }
            set { _transform = value; }
        }
        /// <summary>
        /// Inverse of the view matrix, can be used to get objects screen coordinates
        /// from its object coordinates
        /// </summary>
        public Matrix InverseTransform
        {
            get { return _inverseTransform; }
        }
        public Vector2 Pos
        {
            get { return _pos; }
            set { _pos = value; }
        }
        public float Rotation
        {
            get { return _rotation; }
            set { _rotation = value; }
        }


        public Camera2D(Viewport viewport)
        {
            _zoom = 1.0f;
            _scroll = 1;
            _rotation = 0.0f;
            _pos = Vector2.Zero;
            _viewport = viewport;
        }

        /// <summary>
        /// Update the camera view
        /// </summary>
        public void Update()
        {
            //Call Camera Input
            Input();
            //Clamp zoom value
            _zoom = MathHelper.Clamp(_zoom, 0.0f, 10.0f);
            //Clamp rotation value
            _rotation = ClampAngle(_rotation);
            //Create view matrix
            _transform = Matrix.CreateRotationZ(_rotation) *
                            Matrix.CreateScale(new Vector3(_zoom, _zoom, 1)) *
                            Matrix.CreateTranslation(_pos.X, _pos.Y, 0);
            //Update inverse matrix
            _inverseTransform = Matrix.Invert(_transform);
        }

        /// <summary>
        /// Example Input Method, rotates using cursor keys and zooms using mouse wheel
        /// </summary>
        protected virtual void Input()
        {
            _mState = Mouse.GetState();
            _keyState = Keyboard.GetState();
            //Check zoom
            if (_mState.ScrollWheelValue > _scroll)
            {
                _zoom += 0.1f;
                _scroll = _mState.ScrollWheelValue;
            }
            else if (_mState.ScrollWheelValue < _scroll)
            {
                _zoom -= 0.1f;
                _scroll = _mState.ScrollWheelValue;
            }
            //Check rotation
            /*
            if (_keyState.IsKeyDown(Keys.Left))
            {
                _rotation -= 0.1f;
            }
            if (_keyState.IsKeyDown(Keys.Right))
            {
                _rotation += 0.1f;
            }
             */
            //Check Move
            if (_keyState.IsKeyDown(Keys.A))
            {
                _pos.X += 2.5f;
            }
            if (_keyState.IsKeyDown(Keys.D))
            {
                _pos.X -= 2.5f;
            }
            if (_keyState.IsKeyDown(Keys.W))
            {
                _pos.Y += 2.5f;
            }
            if (_keyState.IsKeyDown(Keys.S))
            {
                _pos.Y -= 2.5f;
            }
        }

        /// <summary>
        /// Clamps a radian value between -pi and pi
        /// </summary>
        /// <param name="radians">angle to be clamped</param>
        /// <returns>clamped angle</returns>
        protected float ClampAngle(float radians)
        {
            while (radians < -MathHelper.Pi)
            {
                radians += MathHelper.TwoPi;
            }
            while (radians > MathHelper.Pi)
            {
                radians -= MathHelper.TwoPi;
            }
            return radians;
        }

    }
}

I tutaj pojawia sie mój problem, chciałbym napisać kod który zmieniałby pewną zmienną w zależności od tego jaki prostokąt na ekranie został kliknięty. I tutaj pojawia się problem. Próbowałem dodawać wartość wektora kamery do poszczególnych wartości pozycji myszki ale to nie zadziałalo... Ma ktoś jakieś pomysły?
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Możesz zrobić tak, że jak obiekt zostanie kliknięty, to poprzez zdarzenie zostanie zmieniona kamera (wartość jakiegoś pola).


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry