[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

[J2D , DisplayObject2D] HitTest 구현 알고리즘 (회전변환)

 

HitTest 의 실제 구현중 대상객체가 회전 되었을때 , 회전된 대상에 마우스를 올리면 회전되기전 객체의 영역안에 들어있는지 아닌지를 판별 하기 위한 연산

검은점 4개 : 회전중인 객체의 포인트

텍스쳐 : 회전 전의 이미지 영역

빨간색점 : 회전중인 객체 포인트 영역 의 마우스 포인터가 회전 변환된 점

=>> 빨간점이 텍스쳐 위에 있다면 True , 아니면 False

 

float rot = 0.01f;//업데이트시 로테이션 rad 추가량 float cx = 200;//회전중심점 x float cy = 200;//회전중심점 y void Test()//업데이트 함수

{ Matrix _transform = Matrix.Identity; _transform *= Matrix.CreateTranslation(-cx, -cy, 0); _transform *= Matrix.CreateRotationZ(rot); _transform *= Matrix.CreateTranslation(cx, cy, 0); rad += rot; //변환을 위한 rad 값 축적 , 실제 rad

var v0 = Vector2.Transform(new Vector2(p[0].x, p[0].y), _transform); p[0].x = v0.X; p[0].y = v0.Y; var v1 = Vector2.Transform(new Vector2(p[1].x, p[1].y), _transform); p[1].x = v1.X; p[1].y = v1.Y; var v2 = Vector2.Transform(new Vector2(p[2].x, p[2].y), _transform); p[2].x = v2.X; p[2].y = v2.Y; var v3 = Vector2.Transform(new Vector2(p[3].x, p[3].y), _transform); p[3].x = v3.X; p[3].y = v3.Y; } float rad = 0; void TestRed()//변환함수

{ float mx = Mouse.GetState().X; float my = Mouse.GetState().Y; double rx = (mx - s.x) * Math.Cos(-rad) - (my - s.y) * Math.Sin(-rad); double ry = (mx - s.x) * Math.Sin(-rad) + (my - s.y) * Math.Cos(-rad); trace(rx, ry); if (0 < rx && rx < 128 && 0 < ry && ry < 128) trace("TRUE"); mp.x = (float)rx + s.x ; mp.y = (float)ry + s.y ; }

 

Yamecoder 야매코더_
XNA 2012.04.19 16:07

[DisplayObject2D] 시작





기본 XNA 의 API가 너무 ROW 하고 사용하기 불편하다 . 특히 본인처럼 AS3 이라는 엔터프라이즈 환경의 API

를 사용한 사람이라면,

그래서 짧은 실력에도 불구하고 DisplayObject2D 라는 이름의 XNA 라이브러리를 한번 구축해볼려고 한다.

(이렇게 포스팅을 안하면, 동기유발이 안된다. = = )

물론 언제까지 꾸준히 할수 있을지 모르겠지만 , ( 회사 일정에 치여서 )

목표는 기본적인 Composite 패턴에 기초한 AS3의 DisplayObject , InteractiveObject 의 50% 정도의 구현이다.

* DisplayObject : (기본적으로 자신과 자식을을 리스트업하여 화면에 뿌려주고 너비,높이,좌표,등 기본적인 정보를 가지고 있다.)
   - alpha
   - rotation
   - x
   - y
   - getScreenPosition (자식들의 좌표를 스크린 좌표로 반환하는 속성)

* DisplayObjectContainer : 디스플레이 오브젝트에서 컨테이너 역할을 더하기 위해 덧붙여 상속됨
   - numChildren
   - getChildIndex
   - addChild()
   - removeChild()

* InteractiveObject : 마우스 , 터치 인식에 관련된 기능
   - {각종 이벤트 구현}



3개의 추상클래스의 선택적 상속으로
Stage2D , Sprite2D ... 등등을 구현하는 방법이다.


결론은 ,,
컴포지트 패턴에 대하여 좀더 연구하여야 한다.

자식과 부모와의 관계에서 발생하는 상속된 값들을 처리하는 알고리즘에서 생각할 것이 많다.
그런의미에서 보면 AS3 는 참 .. 잘 만들었다. 언어가 UX 네 = = ;;;
Yamecoder 야매코더_
XNA 2011.05.02 11:26

[간단메모] 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

[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

[KINECT] 2010.12.03일자 새버전 OpenKinectCamera class 공개

2010.12.03일자 새버전 OpenKinectCamera class 공개

 

OpenKinectCamera class 새버전 공개 (2010.12.03일자)

1. note that You need the file "libusb0.dll" in the "C:\Windows\System32"  folder to run the dll. 
It is Part of the libusb-win32 USB library. 
http://sourceforge.net/projects/libusb-win32/

2. official OpenKinect drivers from 
https://github.com/OpenKinect/libfreenect/tree/master/platform/windows/

3. C# Demo: (containing a built of the dll ("OpenKinectCamera.dll"))  (Visual C# Express project) 
http://dl.dropbox.com/u/13924535/KinectDemo.zip

4. C++ Source: (Visual C++ Express project) 
http://dl.dropbox.com/u/13924535/OpenKinectCamera_v20101203.zip

[원문링크] http://groups.google.com/group/openkinect/browse_thread/thread/956f1b078201fe17

 

 

 

[출처] 2010.12.03일자 새버전 OpenKinectCamera class 공개 (키넥트 개발 카페 Open Kinect) |작성자 티구티구

Yamecoder 야매코더_
XNA 2010.12.06 13:15

[찰스페졸드] 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 초간단 그림 붙이기







설치 : http://scripter.egloos.com/1582918

우선 설치를 마쳤다면 아주 간단한 작업을 시험 삼하 해보자
(잘 되나 안되나 봐야 .. 안심이 되더라. )


본 튜토리얼은 본인처럼 완전 초짜를 위한것이니 지나치게,  상세하게 설명하였다 

우선 c# 2008을 실행 하고 새로운 프로젝트를 추가 하자..

뭐 ., 듣기로는 빌드한것을 엑박이나 june 에서 돌릴수 있다고는 하나 나에겐 없음으로 windows Game 을 선택하겠다.
(Platformer Starter kit 은 샘플용으로 만든 게임인데 한번쯤 해보는것도 좋을듯하다)



솔루션 탐색이 이다. 이중 우리가 초 간단하게 건들여야 할것은 Game1.cs 과 Content 이다
(프로젝트 이름은 그냥 기본으로 했다)

우선 컨텐츠에 "추가 > 기존항목  "  하여 아무 이미지나 불러오겠다
그러면 컨텐츠에 추가가 된 화면을 볼수 있다

(일종의 플래시로 치면 라이브러리에 객체를 불러와 Asset 의 개념과 같다.)
그리고 확인할것은 AssetName!
만약 속성이 보이지 않는다면 추가된 그림파일에 마우스 오른쪽 버튼을 클릭하면 보인다.

확인했다면 코드로 넘어가자!

처음에 코드를 접하고 느낌은 너무 지저분하다.(아직도 적응안된다)
하지만 자세히 보면 슈퍼클래스를 필요한것만 오버라이딩 하고 있는 패턴이다.
익숙해지면 될것 같다 (PV3D의 PaperBase.as 를  보는것 같다)

클래스 상단에 Texture2D 변수를 추가한다


중간쯤 보면 LoadContent() 가 있다. 여기다가 pic1을 완성한다.
여기서 재미있는것은 Content클래스가 아까 솔루션 탐색기의 Content항목을 참조한다
그리고 "< , >"  요 형식은 제너릭 이라고 하는데 쉽게 생각해서 로드할 무언가를 원하는 타입으로
반환한다. 편리한것 같다 . 다음으로 "( , )" 안에는 아까확인했던 AssetName 을 입력한다.


제일 하단에 Draw() 에 그려?준다

주의해야 할것은 기본적으로 생성되어있는 SpriteBatch에다가 그리는것인데
그림과 같이 시작 하고 끝내야 한다. 그 사이에 원하는것을 그려야 한다.
(마치 as3 의 DisplayObjectContainer 같은 느낌이다)

그리고 결정적으로 그릴부분은 spriteBatch.Draw( ... ) 로 그리는데 첫번째는
그릴 객체 이고 두번째는 좌표인데 벡터를 생성하여 표시한다. 이부분은 참 아쉬운 부분이다.
as3 에서는 "pic1.x , pic1.y" 로 간편하게 할수 있는데,.,
마지막 인자는 영역을 채우는것 같은데 자세히는 아직 모르겠다.

 



그리고 F5 를 눌러 디버깅을 해보자
Yamecoder 야매코더_
tags : cshap, XNA3.0
XNA 2010.12.04 03:53

[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

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


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

[XNA Game Programing Chapter5 converting XNA3.1]



책 내용이 1.0 이어서 3.1 에 변경된 내용을 반영시켜야 결과물을 얻을수 있다.




Yamecoder 야매코더_
XNA 2010.12.04 02:21

[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

[XNA] 64bit 운영체제에서 FileNotFoundException 발생시








'
잘 .. 하고 있다가 .. 빌드할려니깐 요런다.

이유를 잘 모르겠으나 64비트 에서 문제가 발생하는거라고 한다.

그래서 cpu 세팅을 바꿔줌으로서 깔끔하게 해결할수 있다.


에서 Any CPU 부분이 있다 . 이것을 구성요소로 가서 

활성 솔루션에서 새로만들기 하여 x86으로 만들어 주면 된다



그럼 잘된다.. 진작 할껄..
Yamecoder 야매코더_
XNA 2010.12.03 23:54

XNA 시작하기


# 으로 다이렉트엑스 에 도전하다가 발견한 XNA .. 현제 마소에서 다이렉트X보다 XNA를 이용할것을

추천하고 있다고 한다.

그리고 directX 보다 훨신쉽게 개발할 할수 있다는데..

개발 환경이나 한번 알아보자.,
 

우선 c# 환경이 필요하겠다.




http://www.microsoft.com/express/vcsharp/#webInstall
다행이도 익스프레스에디션은 꽁짜 라고 한다 . 차후에 등록만 하면, (등록도 물론 공짜다)





http://www.microsoft.com/downloads/thankyou.aspx?familyId=80782277-d584-42d2-8024-893fcd9d3e82&displayLang=en
다음으로 XNA 가 필요하다 3.0 부터 비주얼 스튜디오 2008에서 돌아 간다고 한다



또한
http://creators.xna.com/en-US/

에가면 간단한 튜토리얼과 각종 게임을 볼수 있다.



사실 C# 에 뛰어든계기는 윈도우에서의 퍼포먼스와 각종 하드워어 지원이었다.

그리고 C# 기초를 공부하면서 느낀것은 AS3 와 비슷하면서도 . 자바와 비슷하다.

하지만 둘보다 막대한? 라이브러리와 편리한 개발환경, IDE의 한글화 등이 새로웠지만

확실히 AS3 보다 그래픽을 쉽게 다루진 못한다. 그점이 아쉽다.
Yamecoder 야매코더_
XNA 2010.12.03 23:43
Powerd by Tistory, designed by criuce
rss