Game Programming/XNA

XNA :: XNA Game Studio 4.0 # 8 - Camera 구현하기 (카메라)

VallistA2015. 4. 23. 10:06

 

 

 

횡스크롤이나 종스크롤 게임을 구현할때 카메라를 필연적일 것이다.

모든 오브젝트를 움직이는 일을 하느리 카메라로 한번에 움직이는 작업이 더 편하기 때문이다.

 

보통 모든 카메라는 3D를 평면에서 나타내주는 일을 거친다.

이 것에 대해 좀 더 자세히 알고싶다면 렌더링 파이프라인을 알아야 하는데, 이 강좌는 쉽게 가는 강좌이므로 여기서 적지는 않고, 나중에 DX 강좌를 할 때 하도록 하겠다.

 

우리는 카메라를 구현할 때 SpriteBatch를 봐야한다. SpriteBatch는 도화지라고 매 차례 언급을 했는데, 우리는 그 도화지를 보는 것을 한번에 움직이는 작업을 할 것이다.

 

먼저 카메라는 아래와 같이 구현했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;  
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace XNAFrameWork.Framework.Lib
{
    public class Camera
    {
        public Microsoft.Xna.Framework.Matrix matrix;
        public Microsoft.Xna.Framework.Vector2 position;
        public Microsoft.Xna.Framework.Vector2 scale;
        public Microsoft.Xna.Framework.Vector2 anchor;
        public float rotation;
 
        public Camera()
        {
            CameraReset();
        }
 
        public void CameraReset()
        {
            SetPosition(new Microsoft.Xna.Framework.Vector2(0, 0));
            SetScale(new Microsoft.Xna.Framework.Vector2(1, 1));
            SetAnchor(new Microsoft.Xna.Framework.Vector2(0.5f, 0.5f));
            SetRotation(0);   
        }
 
        public void SetPosition(Microsoft.Xna.Framework.Vector2 pos)
        {
            position = pos;
 
            UpdateMatrix();
        }
 
        public void SetScale(Microsoft.Xna.Framework.Vector2 pos)
        {
            scale = pos;
 
            UpdateMatrix();
        }
 
        public void SetAnchor(Microsoft.Xna.Framework.Vector2 pos)
        {
            anchor = pos;
 
            UpdateMatrix();
        }
 
        public void SetRotation(float pos)
        {
            rotation = pos;
 
            UpdateMatrix();
        }
 
        public Microsoft.Xna.Framework.Vector2 GetPosition()
        {
            return position;
        }
 
        public Microsoft.Xna.Framework.Vector2 GetScale()
        {
            return scale;
        }
 
        public Microsoft.Xna.Framework.Vector2 GetAnchor()
        {
            return anchor;
        }
 
        public float GetRotation()
        {
            return rotation;
        }
 
        void UpdateMatrix()
        {
            matrix = Microsoft.Xna.Framework.Matrix.Identity *
                     Microsoft.Xna.Framework.Matrix.CreateTranslation(-position.X, -position.Y, 0) *
                     Microsoft.Xna.Framework.Matrix.CreateRotationZ(rotation) *
                     Microsoft.Xna.Framework.Matrix.CreateTranslation(anchor.X, anchor.Y, 0) *
                     Microsoft.Xna.Framework.Matrix.CreateScale(new Microsoft.Xna.Framework.Vector3(scale.X, scale.Y, 1));
        }
    }
}

 

먼저 3D 좌표계에서 우리는 Matrix 라는 것을 쓰게된다.

이 matrix 라는게 무엇이냐 하면 자료를 가지고 있는 행렬이라 생각하면된다.

 

행렬로 깊이와, 현재 화면을 이루고 있는 요소를 가지고 있게끔 되는데 이것도 3D 프로그래밍의 기초이기 때문에 나중에 DX 강좌할 때 자세히 설명하게 될 수도 있겠다.

 

UpdateMatrix 쪽을 보면 알겠지만 스케일, 위치, 각도, 중심점 값을 넘겨주면서 곱해준다.

그렇게 하여 카메라의 위치와 속성정보를 주었으며 이 UpdateMatrix는 수시로 돌려줄 것이다.

 

그리고 이제 카메라를 사용하는 방법에 대해 알아보도록 하자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
 
namespace WindowsGame1
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        Camera cam;
        GraphicsDeviceManager graphics;
 
        SpriteBatch spriteItem;
        Texture2D texture;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
 
            Content.RootDirectory = "Content";
        }
 
        protected override void Initialize()
        {
            base.Initialize();
            spriteItem = new SpriteBatch(GraphicsDevice);
 
            cam = new Camera();
            cam.SetPosition(new Vector2( -200, -200));
 
        }
 
        protected override void LoadContent()
        {
            texture = Content.Load<Texture2D>("xna");
        }
 
 
        protected override void UnloadContent()
        {
             
        }
 
        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
 
             
 
            base.Update(gameTime);
        }
 
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
 
            spriteItem.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, cam.matrix);
 
            spriteItem.Draw(texture, new Vector2(0,0), Color.White);
 
            spriteItem.End();
 
            base.Draw(gameTime);
        }
    }
}


이렇게 간단하게 사용할 수 있다.

댓글

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!

자고 싶습니다. ㅠㅠ

Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today :

Total :

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment