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); } } } |
이렇게 간단하게 사용할 수 있다.
'Game Programming > XNA' 카테고리의 다른 글
XNA :: XNA Game Studio 4.0 # 9 - 필자가 구현한 XNA 프레임워크 (XNA Framework) (0) | 2015.04.23 |
---|---|
XNA :: XNA Game Studio 4.0 # 7 - 마우스 및 키 입력 처리 (0) | 2015.04.22 |
XNA :: XNA Game Studio 4.0 # 6 - 비디오 출력 (0) | 2015.04.22 |
XNA :: XNA Game Studio 4.0 # 5 - 사운드 출력 (0) | 2015.04.22 |
XNA :: XNA Game Studio 4.0 # 4 - 레이블 (폰트) 출력 (0) | 2015.04.20 |
댓글
VallistA
병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!
자고 싶습니다. ㅠㅠ
Github :: 링크
궁금한점 문의 주시면 답변드리도록 하겠습니다
VISITED
Today :
Total :
Lately Post
Lately Comment