article search result of '곰동' : 1

  1. 2010.12.04 [C# XNA][texture2D.Setdata] XNA에서 픽셀을 하나하나 다루어 보자. (364)

[C# XNA][texture2D.Setdata] XNA에서 픽셀을 하나하나 다루어 보자.

xna의 API 가 익숙하지 않았던때, 픽셀을 다루기 위해 C#의 기본 GDI를 이용해여
마샬링 하여 텍스쳐에 붙였다.

그런데,. 반전이.. zune hd 에서 사용할수 있는 네임스페이스가 극히 제한적이라..
Bitmap은 가져 오지 못한다.

그래서 텍스쳐하나당 한픽셀을 그려야 된다고 생각하자 말도안되는 리소스 낭비이다.
텍스쳐2D 와 Draw메소드를 엄청나게 사용해야되서, 도저히 용납할수 없는 코딩이 될것이다.


고민끝에,  ,.XNA짱인,.  곰동님에게 긴급 질문했다. 그리고 친절히 답해 주셨다.
http://blog.naver.com/fly33499  )



위의 그림처럼 하나의 Texture2D에 여러개의 setData를 이용해 픽셀들을 다룰수 있다.

드디어 2D 비트맵을 다룰수 있게 되었다 마치 bitmapData의 setPixel 처럼 자유롭다.

기본적인 사용법은 이러하다.

주석 위주로 보면 됨


Created with colorer-take5 library. Type 'csharp'

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;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace WindowsGame9
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D tx;
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            graphics.PreferredBackBufferWidth = 272;
            graphics.PreferredBackBufferHeight = 480;
        }

        protected override void Initialize() { base.Initialize(); }
                
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            tx = new Texture2D(GraphicsDevice, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);

            //픽셀����그리기 (레벨 , 위��(x좌표,y좌표,1,1), 컬러값  ~ )
            tx.SetData<Color>(0, new Rectangle(0, 0, 1, 1),new Color[]{Color.Black} ,0, 1, SetDataOptions.None);
            

            //응용! 면적 체우기 

            //화려한?컬러값을 위해 랜덤 함�� ��출
            Random r = new Random();
            Color c;

            //가로크기
            for (int i = 0; i < graphics.PreferredBackBufferWidth; ++i)
            {
                //세로크기
                for (int j = 0; j < graphics.PreferredBackBufferHeight; ++j)
                {
                    //랜덤 컬러
                    c = new Color(new Vector3(r.Next(i), r.Next(j), r.Next(3)));
                    //픽셀만들기 , 총 272 * 280 개 만큼 그린다.
                    tx.SetData<Color>(0, new Rectangle(i, j, 1, 1), new Color[]{ c } , 0, 1, SetDataOptions.None);
                }
            }
        }

        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);
            
            //시작��고 그리고 끝내고 는 기본.
            spriteBatch.Begin();
            spriteBatch.Draw(tx, new Vector2(0, 0), Color.White);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

아직 깊게 봐야 할것이 많이 있지만, 우선 요것 가지고 쉽게 사용할수있도록
AS3 스타일로 클래스를 랩핑하면 매우 유용할듯하다.

원하는대로 Circle 이라던지 Line 이라던지 이제 루프만 잘 돌리면 된다.

다시한번 곰동님께 감사입니다~

※ zune hd의 해상도가 272 * 480 이라서 이러한 크기에서 테스트중..
 
Yamecoder 야매코더_
XNA 2010.12.04 00:08
Powerd by Tistory, designed by criuce
rss