[J2D] J2D 라이브러리 + Multitouch

* J2D 라이브러리

J2D 라이브러리의 기본 정신은 트리 컴포지트 패턴이다.

AS3 처럼 부모객체 자식객체가 있고(DisplayObjectContainer ,)

, 자식이 또한 부모가 될수 있고,

그 자식들을 추가 삭제 할수 있고 (addChild , removeChild , addChildAt , getChildAt)

부모 자식간의 Transform 을 계승한다.

 

기본 문법을 AS3 를 준수 하려고 노력하였다.

구현된 기능은

J2DObject - name , trace

DisplayObject - x , y , width , height , scaleX , scaleT , transform , rotation , hitTest

InteractiveObject - [MouseEvents(Down , up , move)] , MouseX , MouseY

DisplayObjectContainer - addChild , removeChild , addChildAt , getChildAt , getChildIndex , numChildren , getObjectUnderPoint , contain ,

Sprite - loadFormFile ,

Graphic - [NotYet]

 

 

Loader - loadUrl , CompleteEvent , IOErrorEvent

Stage -

BitmapData - setData , getData , setPixel , getPixel , getBitmapByte , boundRect , Clone , LoadFromStream

 

WebCamera -

URLLoader -

WebKit -

 

대략 이러하고 앞으로 추가해야할 기능은 Shader 쪽이다. 마치 As3 의 ShaderFilter 처럼 쉽게 이용하기 위해서이다.

Transform 을 이용하여 x , y , scale , rotatiom 등등을 구현하고 자식까지 계승하는것을 직접 구현을 했다.

정말 As3 는 잘 만든 언어이고, 그것을 사용했다는것은 아무도 없는 직선고속도로를 달리는것과 같다고 생각한다.

그만큼 생산적으로 빠르다는것이다.

 

하지만 XNA 와 같은 Hidef 플랫폼을 사용함으로서 표현의 한계를 넘는다는것이 고생의 의의 이다.

 

덕분에 XNA 로 인한 생산성은 높아 졌고 백그라운드로 돌려 처리하였던 WPF 용 미들웨어도 통합할수 있어,

프로덕트 배포시 유리하다.

 

또한 비교적 저사양의 PC 에서 돌릴수 있어 단가 적인 측면에서 유리하고 또한 PC 사이즈가 작아져서 상품 익스테리어에 도움이 될것으로 전망한다.

아래의 영상은 J2D 와 JMultitouch 를 붙인 것이다.

 

JMultitouch는 조금더 정리가 된후 포스팅 할것이다.

 

테스트 타블렛 사양은 (MSI 110w ATi Mobility Radeon HD 6250)

 

 

 

 

Yamecoder 야매코더_
XNA 2012.08.06 12:41

[간단메모] Texture2D , Alpha Color

private Texture2D tx;
        private Rectangle txRect;
        private Color txColor;
        protected override void LoadContent()
        {

            spriteBatch = new SpriteBatch(GraphicsDevice);
            using (System.IO.FileStream fs = new System.IO.FileStream
(
@"d:\logo2.jpg" ,System.IO.FileMode.Open)) { tx = Texture2D.FromStream(GraphicsDevice, fs); }; txRect = new Rectangle(0, 0, tx.Width, tx.Height); txColor = new Color(255, 255, 255, 0); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); txColor.A +=1; spriteBatch.Begin(); spriteBatch.Draw(tx, txRect, txColor); spriteBatch.End(); base.Draw(gameTime); }

txColor 를 보면 마지막 인자인 A(alpha) 값을 설정할수 있다.
이를 업데이트 시켜주면 알파블렌딩을 할수 있다.
Yamecoder 야매코더_
tags : Alpha, texture2D, XNA
XNA 2011.04.27 10:43

[XNA , WPF] XNA 에서 코드레벨로 WPF 생성하기




필요한 레퍼런스는
 
System.Windows.Presentaion
System.Xaml
PresentationCore
PresentationFramework

이고  필요한 using 은

using System.Threading;
using System.Windows;
using System.Windows.Controls;

되겠다.


Created with colorer-take5 library. Type 'csharp'
XNA , Game1.cs 중 일부

        Texture2D tex;
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            tex = Content.Load<Texture2D>("logo2");
            this.Window.Title = "currentThread :" + Thread.CurrentThread.ManagedThreadId;
            
            //[0] 새로운 wpf 어플을 생성하기 위해 새로운 스레드 생성 , 스레트타입은 STA
            Thread t = new Thread(startThread);
            t.ApartmentState = ApartmentState.STA;
            t.Start();
        }
        void startThread()
        {
            //[1] Application 객체를 선언하고 생성
            Application app = new Application();
            //[2] StartUp 이벤트를 건다.
            app.Startup += new StartupEventHandler(app_Startup);
            //[3] 그리고 시작!
            app.Run();
        }

        void app_Startup(object sender, StartupEventArgs e)
        {
            //[4] 새로운 윈도우를 생성한다
            Window win = new Window();
            win.Width = 300;
            win.Height = 300;
            win.Title = "currentThread :" + Thread.CurrentThread.ManagedThreadId;
            //[5] 새로운 윈도우를 표시한다
            win.Show();

            Button bt = new Button();
            bt.Content = "XNA 에서 WPF 생성��기";
            win.Content = bt;
        }

역시나 윈도우폼과 마찮가지로 STA 타입의 스레드가 필요하다.
그러나 윈폼과 Application 의 사용법이 다른점에 주의! (그냥 Application.Run 하면 안된다.)

또한 닷넷4.0의 경우 System.Xaml 을 필히 참조 시켜줘야 겠다. 
Yamecoder 야매코더_
XNA 2011.02.01 16:03

[.Net Profiler] ANTS Memory Profiler 사용해보기





현재 6버전까지 나왔다.

지금은 5버전 을 테스트 해보겠다.






메뉴 항목에서 .net Executable 을 선택하고 대상을 찾고 스타트 버튼을 누르자




그러면 실행과 동시에 프로파일러가 실행되고

상단에 사진기 모양의 아이콘 , Take Memory SnapShot 을 클릭한다.






그러면 익숙한 프로파일링 장면이 나올것이다.

여기서 Grop By namespace 를 체크하면

좀더 편리하게 객체를 조사할수 있다.




그럼 한번 객체를 생성하여 보자 , 정말 프로파일링이 되는지 ...



객체를 생성하고 스냅샷을 찍었더니 정말 Texture2d 객체의 개수가 늘어났다. 그에 따른 메모리 바이트도 표시되고
이전 스냅샷과 비교하여 얼마나 늘었는지 줄었는지도 표로 금방 알수 있다.

화살표로 되어 뺀부분은 객체를 삭제 하였을때 이다. 역시 대상객체의 개수가 줄었으며 이러한 방법으로 메모리관리를 할수 있다.





부가적으로 아래와 같은 ., 클래스를 추적하는 기능도 있더라...

사실 이러한 실시간 프로파일러를 VS2010 안에서 찾을려고 오랜시간 노력했지만 찾지 못했고 ,

MSDN 에서 답을 찾았다.
http://social.msdn.microsoft.com/Forums/ko-KR/visualcsharpko/thread/ff4afa62-123a-4311-a609-9eb210b70145
(강보람 MVP님 ㄳ ! )




Yamecoder 야매코더_
C# 2011.01.16 00:44

[XNA on TUIO] CCV 1.4 <- TUIO -> XNA


.


CCV1.4 가 업데이트 됬다길래 , 성능도 시험 해볼겸사 , 해서 보니, 집에 있는 대충의 물건만으로도 멀티터치를 구현할수 있겠거니 하는 생각이 들었다.

웹캠이 필요했는데 , 마침 , 세계최강의 가정용 웹캠 마이크로 소프트 시네마 ! 를 ,, 적외선캠으로 만들기에는 너무 아까웠다 ,
그래서 적외선 말고도 강력하게 대비를 줄수 있는 물건을 생각하다가, 한번도 열어보지 않았던 연봉계약서, 검은 봉투와 대충 공책 짤라서 만든 흰색 종이 사각형으로 카메라 설정 조금 만져주고 하니, 별 손색업는 멀티포인트 테스트 장비가 되었다.






c# TUIO 라이브러리 :

간단한 tuio 클라이언트 사용법은 ..



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TUIO;
using Microsoft.Xna.Framework;
/*
 * CCV 에서 넘어온 좌표를 리턴하는 클래스 ;
 * 작성자 : superSc , Yamecoder , jjongun 
*/

namespace TEST_XNA_TUIO
{
    //TuioListener 를 상속하고 , ,
    public class XNATuioListener : TuioListener
    {
        //TuioClient 를 사용한다;.
        private TuioClient clinet;
        private Point point;
        private int stageWidth;
        private int stageHeight;

        public XNATuioListener(int _stageWidht , int _stageHeight)
            :base()
        {
            clinet = new TuioClient();
            //클라이언트와 리스너를 연결하고 ; ,
            clinet.addTuioListener(this);
            //접속을 한다.
            clinet.connect();

            stageWidth = _stageWidht;
            stageHeight = _stageHeight;
            point = new Point();
        }



        #region TuioListener &#47716;&#48260;
        void TuioListener.addTuioObject(TuioObject tobj)
        {
        }

        void TuioListener.updateTuioObject(TuioObject tobj)
        {
        }

        void TuioListener.removeTuioObject(TuioObject tobj)
        {
        }

        void TuioListener.addTuioCursor(TuioCursor tcur)
        {
        }

        void TuioListener.updateTuioCursor(TuioCursor tcur)
        {
            point.X = tcur.getScreenX(stageWidth);
            point.Y = tcur.getScreenY(stageHeight);
        }

        void TuioListener.removeTuioCursor(TuioCursor tcur)
        {
        }

        void TuioListener.refresh(TuioTime ftime)
        {
        }
        #endregion

        public void disconnect()
        {
            clinet.disconnect();
        }

        public Point getPoint
        {
            get { return point; }
        }
    }
}
 
상속 구현된 인터페이스를 보면 알겠지만 , tuio 정보들을 모두 수집할수 있다 ,

이를 비동기적으로 컨트롤 할 구조만 완성되면 XNA 를 이용하요 멀티터치 컨텐츠를 쉽고 강력하게 만들수 있다.

참고 : 네이버 XNA 카페

//

스케일 구현이나, 다중 포인터 생성은 , 다음에 , .. 금요일엔 한없이 한가하고 개을러 지다가  , 일요일저녁만 되면 주말을 알차게 활용못한 내자신이 부끄러워 지고 ,이제서야 조급해 지지만 이미 시계는 월요일 새벽 - - ;
또한 , 그것은 break 업는 무한 while 루프 .
Yamecoder 야매코더_
tags : c#, CCV1.4, nui, TUIO_LIB, XNA
XNA 2010.12.18 21:13

[KINECT] 키넥트 개봉기와 설치 드라이버 (Windows x64 on MacBook)



Yamecoder 야매코더_
XNA 2010.12.11 00:14

[찰스페졸드] windows phone7 책 완성판

 

첨부 압축은 7z; XNA 포함



출처 : http://blogs.msdn.com/b/microsoft_press/archive/2010/10/28/free-ebook-programming-windows-phone-7-by-charles-petzold.aspx

Yamecoder 야매코더_
XNA 2010.12.06 09:56

[XNA , Texture2D] Texture2D from Bitmap (fast copy)


종전의 방식 (http://scripter.egloos.com/2548511) 으로는 너무 느려 실시간으로 이미지를 갱신하는데에
무리가 있었다.

그래서 아에 Stream 으로 복사하는 방법을 찾았고 Aforge 의 영상을 붙이는데 성공했다.







이전의 http://www.codeproject.com/KB/game/VidTextureClassWebcamApp.aspx?msg=2630927
보다 화질은 좋아졌다.(쨍 .. 하다..)
간혹 보이는 계단현상이 없어졌다.

속도는 .. 처음엔 조금 딜레이가 생기다가 곧 VideoTexture 만큼 복귀 되었으나 약간 속도가
불안정하긴 했다.

하지만 VideoTexture 에서 런타임중 간헐적으로 나오는 오퍼레이터 에러는 없어 덜컥? 거리는 현상이
없다.

그리고 VideoTexture 보다는 시피유 점유율이 조금 높게 나왔다.

Created with colorer-take5 library. Type 'csharp'

private Texture2D tx;
        //Aforge �� 플레이어
        VideoSourcePlayer player = new VideoSourcePlayer();

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            tx = new Texture2D(graphics.GraphicsDevice, 1024, 768);//dummy;


            //Aforge �� 디바이스 설정 
            FilterInfoCollection device = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            VideoCaptureDevice cam = new VideoCaptureDevice(device[0].MonikerString);
            
            player.VideoSource = cam;
            player.Start();

            //플레이어가 갱신될때 마다 ��출
            player.NewFrame += new VideoSourcePlayer.NewFrameHandler(player_NewFrame);
        }


        //인��로 비트맵을 받음
        void player_NewFrame(object sender, ref Bitmap _image)
        {
            //비트맵�� 고속 복사
            MemoryStream camStream = new MemoryStream();
            player.GetCurrentVideoFrame().Save(camStream, ImageFormat.Bmp);
            camStream.Position = 0;
            tx = Texture2D.FromFile(graphics.GraphicsDevice, camStream);
            
        }
 
 
 
포인트 : 비트맵의 고속복사. 


나중에 곧.. ? Aforge의 VideoSourcePlayer의 stream 을 직접 참조 할수 있는 방법을 모색하여 좀더
높은 퍼포먼스를...
Yamecoder 야매코더_
tags : bitmap, copy, texture2D, XNA
분류없음 2010.12.04 03:48

[Sharp Developer , XNA3.1] SharpDeveloper 의 Empty 프로젝트에 XNA 사용하기








새 솔루션에서 Empty 프로젝트를 생성




참조 추가에 xna 를 찾아준다.




기본적인 Game1.cs 코딩을 해준다.


시작점을 잡아주고...



디버깅
성공...



오늘도 잡기술만 늘어가고........
Yamecoder 야매코더_
C# 2010.12.04 02:31

[Texture2D] Texture2D에 일정역역만 복사하기



원본 텍스쳐에서 일부분만 그리는 방법에서 기초적인 방법은 Draw 에서

그릴 영역을 지정하는것인데 리소스 낭비가 발생할수 있어서

아에 처음부터 영역을 정하고 들어가도록 하는 방법이다.

Created with colorer-take5 library. Type 'csharp'

//http://scripter.egloos.com
        //원본 이미지 텍스쳐
        Texture2D targetTx;

        //복제할 이미지 텍스쳐
        Texture2D copyTx;
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            //원본 이미지를 가져��다
            targetTx = Texture2D.FromFile(GraphicsDevice,@"c:\a.jpg");

            //복제할 이미지를 만든다.
            copyTx = CloneImage(targetTx, 0, 0, 200, 200);
        }


        //복제 메소드 :: 매개변��로는 원본이미지,좌표,크기 이다. 
        public Texture2D CloneImage(Texture2D image, int x, int y, int w, int h)
        {
            //면적을 만든다.
            Rectangle srcRect = new Rectangle(x, y, w, h);

            //면적만큼�� 바이트 배열을 생성한다
            // *4 인이유는 ���� 정���� 메모리 크기가 4바이트이기때문은 상식
            byte[] data = new byte[srcRect.Width * srcRect.Height * 4];
            
            //원본이미지에서 면적만큼 가져와 바이트배열에 저장한다.
            image.GetData(0, srcRect, data, 0, data.Length);
            
            //새로운 텍스쳐를 생성한다.
            //주��할점은 TextureFormat을 원본이미지�� Format과 같게해야 된다.
            Texture2D result = 
                new ResolveTexture2D(this.GraphicsDevice, srcRect.Width, srcRect.Height, 0, image.Format);
            
            //데이터를 채워주고..
            result.SetData(data);
            
            //����한다.
            return result;
        }
 
 
 
참고 :: http://xna.omgsoft.com.cn/education/graphicex_class.aspx


중요한점은 복제될 Texture2D의 Format  과 원본 Texture2D 의 Format 이 일치해야 되더라



Yamecoder 야매코더_
XNA 2010.12.04 02:30

[XNA , Texture2D] Texture2D from Bitmap (very Simple)


Content.Load<T> 로 불러올수 있는것은 *.xnb밖에 없다.

동적으로 캡춰되거나 연산된 비트맵을 받아오기가 영 까다롭다.

그래서 매우 간단한 비트맵 복사 방법을 생각했다.


Created with colorer-take5 library. Type 'csharp'

private Texture2D tx;
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            //비트맵을 만든다.
            Bitmap b = new Bitmap(@"c:\a.jpg");
            //xna �� 컬러배열을 타겟 비트맵 크기만큼 생성한다.
            xColor[] pixels = new xColor[b.Width * b.Height];
            //x , y 루프를 돌려 비트맵�� 컬러를 검출��여 xna 컬러배열에 넣는다.
            for (int y = 0; y < b.Height; ++y)
                for (int x = 0; x < b.Width; ++x)
                {
                    cColor c = b.GetPixel(x, y);
                    pixels[(y * b.Width) + x] = new xColor(c.R, c.G, c.B, c.A);
                }
            //texture2d를 생성��고 컬러를 적용한다.
            tx = new Texture2D(graphics.GraphicsDevice, b.Width, b.Height, 1, TextureUsage.None, SurfaceFormat.Color);
            tx.SetData<xColor>(pixels);


        }
실시간으로 캡춰가 될때 퍼포먼스는 아직 무리수
 
 
Yamecoder 야매코더_
XNA 2010.12.04 02:28

[c#][Aforge] 웹캠 영상출력



http://www.codeproject.com/KB/game/VidTextureClassWebcamApp.aspx?msg=2630927
는 속도도 그렇고., 품질이 조금 아닌듯 하여..

Aforge 로 캠영상을 받아서 픽셀을 실시간으로 Texture2D로 카피하는 계획을 세웠다.

우선 Aforge.net 으로 매우 간단한 캠 영상받기


Created with colorer-take5 library. Type 'csharp'

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Video.DirectShow;
using AForge.Controls;

namespace AforgeTest
{
    public partial class Form1 : Form
    {
        // 크기설정
        int _wid = 640;
        int _hei = 480;


        VideoSourcePlayer player;
        public Form1()
        {
            setPlayer();
            InitializeComponent();

            this.ClientSize = new System.Drawing.Size(_wid, _hei);
            this.Load += new EventHandler(Form1_Load);
            this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
        }

        //플레이어 셋팅
        void setPlayer()
        {
            player = new VideoSourcePlayer();
            player.Width = _wid;
            player.Height = _hei;
            this.Controls.Add(player);
        }

        //초기화
        void Form1_Load(object sender, EventArgs e)
        {
            //디바이스�� 설정
            FilterInfoCollection device = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            //카메라�� 설정 :: 디바이스�� 0 번째를 가져��다( 카메라가 하나일경우 )
            VideoCaptureDevice cam = new VideoCaptureDevice(device[0].MonikerString);
            //카메라�� fps 설정 :: 안해도 됨
            //cam.DesiredFrameRate = 30;

            //플레이어에 적용 / 시작
            player.VideoSource = cam;
            player.Start();
        }

        //종료
        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            player.SignalToStop();
            player.WaitForStop();
        }

    }
}





Aforge : http://code.google.com/p/aforge/
            http://www.aforgenet.com/

참고 : http://stackoverflow.com/questions/1789684/webcam-calling-in-xna




추가 :: avi 불러오기
다음과 같이 초기화 하면 된다.


            FileVideoSource video = new FileVideoSource(@"G:\Down\movie.avi");
            player.VideoSource = video;
            player.Start();





속도가... 빠르다..
 

 
Yamecoder 야매코더_
tags : Aforge, csharp, XNA
C# 2010.12.04 02:27

하나의 BasicEffect 에 여러 텍스쳐 그리기


대신 루프에 한줄씩 더 추가되어 시피유 올라감 --;
Yamecoder 야매코더_
XNA 2010.12.04 02:23

[XNA4.0] windows phone Test Deploy


윈도우폰 이건 . 사야할것같다.

XNA도 마음껏 돌려 봤으면 한다.
Yamecoder 야매코더_
XNA 2010.12.04 02:21

[XNA3.1 index buffer vertex buffter] 교과서와는 다른 버퍼메모리 사용법


한참을 방황했다.. 버퍼가 안되서..

DrawUserIndexPrimitives  vs  DrawIndexPrimitives   라는 주제를 한번쯤 보았을것이다.

물론 후자쪽이 빠르다. 그런데, 가지고 있는 한글번역판 책들은 죄다 xna1.0 버전이라,, 그런지

xna3 에서는 사용법이 달랐다.




Created with colorer-take5 library. Type 'csharp'

public void setVertices()
        {
            
           // vertices 들 ~//
            //vertexBuff 라는 멤버 변��가 있겠죠..
            vertexBuff = new VertexBuffer(device.GraphicsDevice, VertexPositionNormalTexture.SizeInBytes * vertices.Length, BufferUsage.WriteOnly);
            vertexBuff.SetData(vertices);
        }
        public void setIndices()
        {

           //index들  ~//
            //indexBuff 라는 멤버 변��가 있겠죠..
            indexBuff = new IndexBuffer(device.GraphicsDevice, typeof(int), indices.Length, BufferUsage.WriteOnly);
            indexBuff.SetData<int>(indices);
        }
        

         //메인클��스에 update()에 넣어야 함
        public void update()
        {
            device.GraphicsDevice.Vertices[0].SetSource(vertexBuff, 0, VertexPositionNormalTexture.SizeInBytes);
            device.GraphicsDevice.Indices = indexBuff;
        }

        //메인클��스에 draw()에 넣어야함
        public void render(Matrix view , Matrix projection)
        {
            effect.World = Matrix.Identity; ;
            effect.View = view;
            effect.Projection = projection;

            effect.Begin();

            /* //여러개일경우
            foreach (EffectPass p in effect.CurrentTechnique.Passes)
            {
                p.Begin();
                device.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, indices.Length / 3);
                p.End();
            }*/

            effect.CurrentTechnique.Passes[0].Begin();
            device.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vertices.Length, 0, indices.Length / 3);
            effect.CurrentTechnique.Passes[0].End();

            effect.End();
           
        }
물론 여러가지 방법이야 있겠지만 꾀나 골머리를 썩은 문제이므로 일단 이대로 ..

update 부분은 render 에도 해도 되나 그냥 로직과 분리를 하고 싶은 마음에서 한거다.

한가지 덧붙이자면

effect.World 라던지 effect.View 라던지 effect.Projection 은 변경사항이 없다면

따로 메소드를 빼서 루프를 돌리지 않는 방법도 있다.





( 첫째도 퍼포먼스 둘째도 퍼포먼스 셋째는 수면... ? )

Yamecoder 야매코더_
XNA 2010.12.04 02:20

[XNA Rectangle on 3D] 사각형을 그려보자 (제발)



우선 목표는 이러하다 , 사각형의 중심을 원점 으로 한 3d 상의 사각형을 만들것이다.

그리고 텍스쳐도 입혀 보자.

이목표를 실현 하기 위해서는 어느정도의 준비 과정이 필요하다. 바로 카메라의 셋팅이다.

물론 기본적으로 생성되어 있지만 3D 물체를 제대로 볼수가 없다.


Game1.cs


코드는 간단하나 워낙 단어들이 길어서 따로 주석을 포함한 소스코드를 참고 할것.
Yamecoder 야매코더_
XNA 2010.12.04 02:16

[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