'학습'에 해당되는 글 46건

  1. MessageBox 2012/01/10
  2. [DX9] 4.라이트의 작성과 사용 2 - 매터리얼과 라이트 설정 2011/07/12
  3. [DX9] 4.라이트의 작성과 사용 1 - 신 지오메트리 초기화 2011/07/12
  4. [DX9] 3.행렬의 사용방법 3 - 사영 트랜스폼 행렬 정의 2011/07/12
  5. [DX9] 3.행렬의 사용방법 2 - 뷰 트랜스폼 행렬 정의 2011/07/06
  6. [DX9] 3.행렬의 사용방법 1 - 월드 트랜스폼 행렬 정의 (1) 2011/07/06
  7. [DX9] 2.정점의 렌더링 3 - 표시의 렌더링 2011/07/04
  8. [DX9] 2.정점의 렌더링 2 - 정점 버퍼의 설정 2011/07/04
  9. [DX9] 2.정점의 렌더링 1 - 커스텀 정점 타입의 정의 2011/07/02
  10. [DX9] 1.디바이스의 작성 5 - 셧 다운 2011/07/02
  11. [DX9] 1.디바이스의 작성 4 - 신의 렌더링과 표시 2011/07/02
  12. [DX9] 1.디바이스의 작성 3 - 시스템 메시지 처리 2011/07/02
  13. [DX9] 1.디바이스의 작성 2 - Direct3D 의 초기화 2011/07/01
  14. [DX9] 1.디바이스의 작성 1 - 윈도우 작성 2011/07/01
  15. Repository의 클로닝 또는 Check out 2011/05/11
  16. 커맨드라인에서 Subversion Repository 셋업 2011/05/11
  17. 트랜지션 2011/04/07
  18. LayerAnimation 2011/04/07
  19. UIView애니메이션 2011/04/07
  20. 사운드 재생 2011/04/06
  21. 가속도와 단말의 방향 취득 2011/04/02
  22. 로케이션 매니저 생성 2011/04/01
  23. XCode4에서의 Framework추가 2011/04/01
  24. Xcode 4 업데이트 2011/03/10
  25. Xcode 4 UNIVERSAL... 2011/03/10
  26. 카메라와 앨범 2011/02/28
  27. HTTP통신 (1) 2011/02/24
  28. 프리퍼런스 저장 2011/02/22
  29. 문자열 바이트 배열 변환 2011/02/22
  30. 폰트 패밀리 명 취득 2011/02/21

MessageBox

from 학습/DirectX 2012/01/10 12:35
TCHAR szBuf[256];
 wsprintf(szBuf, TEXT("%d"),ddsd.lPitch);
 MessageBox(main_window_handle,szBuf,TEXT("TEST"),MB_OK);
Creative Commons License
2012/01/10 12:35 2012/01/10 12:35

Direct3D 에서 라이팅을 사용하려면 1개 또는 여러개의 라이트를 작성해야합니다. 어떤 색이 지오메트리 오브젝트를 조사할 것인가를 결정하려면 지오메트리 오브젝트를 렌더링할 매터리얼을 작성할 필요가 있습니다. 신을 렌더링하기 전에 Lights 샘플 오브젝트는 1개의 매터리얼과 1개의 디렉셔널 라이트를 설정하는 애플리케이션 정의 함수인 SetupLights 를 호출합니다.


매터리얼 작성

매터리얼은 라이트가 조사될 때에 지오메트리 오브젝트의 서피스에 반사할 색을 정의합니다. 다음 코드는 D3DMATERIAL9  구조체를 사용해 황색의 매터리얼을 작성합니다.

D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
g_pd3dDevice->SetMaterial( &mtrl );

매터리얼의 디퓨즈 색과 앰비엔트 색이 황색으로 설정됩니다. IDirect3DDevice9::SetMaterial 메소드를 호출해서 매터리얼을 신의 렌더링에 사용되는 Direct3D 디바이스에 적용합니다. IDirect3DDevice9::SetMaterial 가 받아들이는 유일한 파라메터는 설정된 매터리얼의 어드레스 입니다. 이 호출이 행해진 뒤 다른 매터리얼을 지정하는 IDirect3DDevice9::SetMaterial 가 호출될 때까지 이 매터리얼을 사용해 모든 프리머티브가 렌더링 됩니다.

이것으로 매터리얼이 신에 적용되었습니다. 다음으로 라이트를 작성합니다.


라이트 작성

Direct3D 에서 사용할 수 있는 라이트에는 다음 3종류가 있습니다.

  • 화이트 라이트
  • 디렉셔널 라이트
  • 스팟 라이트

샘플 코드에서는 한쪽 방향으로 라이트를 조사하는 디렉셔널 라이트를 작성합니다. 또, 코드를 사용해 라이트의 방향을 좌우로 움직입니다.

다음 코드는 D3DLIGHT9 구조체를 사용해 디렉셔널 라이트를 작성합니다.

D3DXVECTOR3 vecDir;
D3DLight9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;

다음 코드는 이 라이트의 디퓨즈 색을 흰색으로 설정합니다.

light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;

다음 코드는 라이트의 방향을 원형으로 회전시킵니다.

vecDir = D3DXVECTOR3(cosf(timeGetTime()/360.0f),
                     0.0f,
                     sinf(timeGetTime()/360.0f) );
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

D3DXVec3Normalize 을 호출해서 라이트의 방향을 결정하려고 사용되는 방향 백터를 정규화합니다.

범위로는 Direct3D 에 라이트의 이펙트가 미치는 범위를 지정합니다. 이 멤버는 디렉셔널 라이트에는 영향주지 않습니다. 다음 코드는 이 라이트에 1000단위의 범위를 할당합니다.

light.Range = 1000.0f;

다음 코드는 IDirect3DDevice9::SetLight 를 호출해 Direct3D 디바이스에 라이트를 할당합니다.

g_pd3dDevice->SetLight( 0, &light );

IDirect3DDevice9::SetLight 가 받아들인 최초의 파라메터는 라이트가 할당된 인덱스 입니다. 이미 라이트가 그 장소에 있는 경우는 새로운 라이트로 덮어씁니다. 2번째의 파라메터는 라이트를 정의하는 구조체로의 포인터입니다. Lights 샘플프로젝트는 이 라이트를 인덱스 0으로 둡니다.

다음 코드는 IDirect3DDevice9::LightEnable 를 호출해 라이트를 유효화 합니다.

g_pd3dDevice->LightEnable( 0, TRUE);

IDirect3DDevice9::LightEnable 가 받아들이는 최초의 파라메터는 유효하 라이트의 인덱스입니다. 부울 값인 두번째 파라메터는 라이트를 온(TRUE)할지 오프(FALSE)할지 결정합니다. 위 샘플 코드에서는 인덱스 0인 라이트는 온으로 되어있습니다.

다음 코드는 IDirect3DDevice9::SetRenderState 를 호출해 Direct3D 에 라이트를 렌더링 시킵니다.

g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

IDirect3DDevice9::SetRenderState 가 받아들이는 최초 두개의 파라메터는 변경할 디바이스 스테이트 변수와 그것에 설정할 값입니다. 이 코드 샘플은 D3DRS_LIGHTING 디바이스 변수를 TRUE 로 설정합니다. 이것에는 라이트의 렌더링을 유효화 하는 이펙트가 있습니니다.

이 코드 샘플의 마지막 순서는 다시 IDirect3DDevice9::SetRenderState 를 호출해 앰비언트 라이팅을 온으로 합니다.

g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );

위의 코드에서는 D3DRS_AMBIENT 디바이스 변수는 라이트 그레이 (0x00202020) 로 설정되어있습니다. 앰비언트 라이팅은 지정된 색으로 모든 오브젝트를 비춥니다.

라이팅과 매터리얼에 대해 자세한 것은「라이팅과 매터리얼 (Direct3D 9)」을 참조해 주세요.

이 튜토리얼에서는 라이팅과 매터리얼을 사용하는 방법을 나타냈습니다.「튜토리얼 5:텍스쳐 맵의 사용」에서 텍스쳐를 서페이스에 추가하는 방법을 다룹니다.

Creative Commons License
2011/07/12 18:50 2011/07/12 18:50

Direct3D 라이트로 3D 오브젝트가 보다 리얼하게 보일 수 있게 되었습니다. 신의 각 지오메트리 오브젝트는 사용된 장소와 라이트의 종류를 베이스로 해서 라이트가 조사됩니다. 이 튜토리얼의 샘플 코드에서는 라이트와 매터리얼에 대해서 설명합니다.

[DX9] 4.라이트의 작성과 사용 1 - 신 지오메트리 초기화


라이트를 사용하는 요건의 하나로 각 서피스에 법선이 포함되도록 할 필요가 있습니다. Lights 샘플 프로젝트에서는 새로운 커스텀 정점 타입을 사용합니다. 새로운 커스텀 정점형식에는 3D 위치와 서피스 법선을 포함합니다. 서피스 법선은 내부에서 Direct3D가 라이트의 계산을 하는데 사용됩니다.

struct CUSTOMVERTEX
{
    D3DXVECTOR3 position; // The 3D position for the vertex.
    D3DXVECTOR3 normal;   // The surface normal for the vertex.
};
// Custom flexible vertex format (FVF).
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

이것으로 바른 벡터 형식이 정의 되었습니다. Light 샘플 프로젝트에서는 원기둥을 작성하는 애플리케이션 정의 함수인 InitGeometry 를 호출합니다. 처음에는 원기둥의 포인트를 격남한 정점 버퍼를 작성합니다. 다음 샘플 코드에 그것을 표시했습니다.

// Create the vertex buffer.
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX),
                                           0 /*Usage*/, D3DFVF_CUSTOMVERTEX,
                                           D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
    return E_FAIL;

다음에는 정점 버퍼를 원기둥의 포인트로 묻습니다. 다음 샘플코드에서는 각 포인트가 위치와 법선으로 정의 되어있습니다.

CUSTOMVERTEX* pVertices;
if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) ) return E_FAIL;

for( DWORD i=0; i<50; i++ )
{
    FLOAT theta = (2*D3DX_PI*i)/(50-1);
    pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );
    pVertices[2*i+0].normal   = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );
    pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );
    pVertices[2*i+1].normal   = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );
}

http://ko.wikipedia.org/wiki/%EC%82%BC%EA%B0%81%ED%95%A8%EC%88%98

앞의 샘플코드를 사용해 정점 버퍼를 원기둥의 정점으로 묻으면 정점 버퍼는 렌더링 할 수 있게 됩니다.
다만, 이 신의 매터리얼과 라이트는 원기둥을 렌더링하기 전에 미리 설정해둘 필요가 있습니다.
이것에 대해서는「2 - 매터리얼과 라이트 설정」에서 설명합니다.

Creative Commons License
2011/07/12 18:44 2011/07/12 18:44

사영 트랜스폼 행렬은 지오메트리를 3D 뷰 공간으로부터 2D뷰포트 공간으로 변환하는 방법을 정의하고 있습니다.

다음 코드는 사영 트랜스폼 행렬을 작성해 Direct3D 디바이스에 대해 현재의 사영 트랜스폼을 설정합니다.

D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

첫번째로 D3DXMatrixPerspectiveFovLH 를 불러 사영 행렬을 셋업합니다. 첫번째 파라메터는 연산의 결과가 되는 D3DXMATRIX 구조체로의 포인터입니다. 두번째 파라메터는 시야를 정의하고 있습니다. 이것으로 먼곳에 있는 오브젝트일수로 작게 보이도록 됩니다. 일반적인 시야는 1/4pi 입니다. 샘플에서도 이것을 사용하고 있습니다. 세번째 파라메터는 아스펙트 비를 정의하고 있습니다. 샘플에서는 전형적인 아스펙트 비 값인 1을 사용하고 있습니다. 네번째와 다섯번째 파라메터는 전방 클립면과 후방 클립면을 정의합니다. 이것들에 의해 지오메트리가 렌더링 되지 않게 되는 거리를 정의합니다. Matrices 샘플 프로젝트에서는 전방 클립면을 1로 후방 클립면을 100으로 설정했습니다.

다음에는 IDirect3DDevice9::SetTransform 를 호출해 Direct3D 디바이스에 대한 트랜스폼을 적용합니다.IDirect3DDevice9::SetTransform 에 넘기는 첫번째 파라메터에 의해 설정된 트랜스폼을 Direct3D에 지시합니다. 이 샘플에서는 D3DTS_PROJECTION 플래그를 사용해서 설정할 필요가 있는 사영 트랜스폼을 지정합니다. 두번째 파라메터는 현재의 트랜스폼으로 설정된 행렬로의 포인터입니다.

사영 트랜스폼에 대한 자세한 것은 「사영 트랜스폼 (Direct3D 9)」을 참조해 주세요.

이 튜토리얼에서는 행렬을 사용하는 방법을 표시했습니다.「튜토리얼 4:라이트의 작성과 사용」에서는 리얼리티를 높여주기 위한 신에 라이트를 추가하는 방법을 다뤄 보겠습니다.

Creative Commons License
2011/07/12 14:14 2011/07/12 14:14

뷰 트랜스폼 행렬은 뷰의 위치와 회전을 정의합니다. 뷰 행렬은 신에 대해서 사용되는 카메라 입니다.

다음 코드는 뷰 트랜스폼 행렬을 작성해 Direct3D 디바이스에 대한 현재의 뷰 트랜스폼을 설정합니다.

D3DXVECTOR3 vEyePt   ( 0.0f, 3.0f,-5.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec   ( 0.0f, 1.0f, 0.0f );
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

처음에는 D3DXMatrixLookAtLH 를 호출해 뷰 행렬을 정의합니다. 첫번째 파라메터는 연산의 결과가 되는 D3DMATRIX 구조체로의 포인터입니다. 두번째, 세번째, 네번째 파라메터는 각각 시점(eye point), 주시점(look-at point), "위쪽(up)" 방향을 정의 합니다.  여기에서 시점은 z축에 따라 5단위(unit) 복귀, 3단위 상승하도록 설정되어있습니다. 주시점은 원점으로 설정되어있습니다. "위쪽" 방향은 y 방향으로 정의 되어있습니다.

다음에는 IDirect3DDevice9::SetTransform 를 호출해 Direct3D 디바이스에 대한 뷰 트랜스폼을 설정합니다. IDirect3DDevice9::SetTransform 에 넘긴 첫번째 파라메터에 의해 설정한 트랜스폼을 Direct3D에 지시합니다. 이 샘플에서는 D3DTS_VIEW 플래그를 사용해 설정할 필요가 있는 뷰 트랜스폼을 지정합니다. 두번째 파라메터는 현재의 트랜스폼으로 설정된 행렬로의 포인터입니다.

뷰 트랜스폼의 자세한 사항은 「뷰 트랜스폼 (Direct3D 9)」을 참조해 주세요.

신에 대한 월드 트랜스폼을 정의하면 사영 트랜스폼 행렬(projection transform matrix)을 사용할 수 있게 됩니다. 이 경우도 트랜스폼을 정의하는 순서는 중요하지 않습니다. 다만, Direct3D 는 다음 순서로 신에 행렬을 적용합니다.

  1. 월드(World) 
  2. 뷰 (View)
  3. 사영 (Projection)

사영 트랜스폼 행렬의 정의에 대해서는「 3 - 사영 트랜스폼 행렬 정의」를 참조해 주세요.

Creative Commons License
2011/07/06 17:55 2011/07/06 17:55

이 튜토리얼에서는 행렬의 개념을 소개하고, 행렬의 사용방법을 보여줍니다. Vertices 샘플 프로젝트에서는 2D의 정점을 렌더링하고 삼각형을 드로우했습니다. 그리고, 이 튜토리얼에서는 3D 정점의 트랜스폼을 처리합니다. 행렬은 카메라와 뷰포트의 셋업에도 사용됩니다.

Matrices 샘플 프로젝트에서는 지오메트리의 렌더링을 실행하기 전에 애플리케이션 정의의 SetupMatrices 함수를 호출해 3D 삼각형의 렌더링에 사용하는 행렬 트랜스폼의 작성과 정의를 실행합니다. 이들 타입의 트랜스폼은 통상 3D 신의 경우에 설정됩니다. 이들 일반적인 각각의 트랜스폼을 작성하는 것을 다루도록 하겠습니다.


==========================
[DX9] 3.행렬의 사용방법 1 - 월드 트랜스폼 행렬 정의

월드 트랜스폼 행렬에서는 3D모델 공간에서 지오메트리의 평행이동, 스케일링, 회전을 실행하는 방법을 정의합니다.

다음의 코드에서는 삼각형을 y축 회전으로 회전 시킨 뒤 Direct3D 디바이스에 대한 현재의 월드 트랜스폼을 설정합니다

D3DXMATRIX matWorld;
D3DXMatrixRotationY( &matWorld, timeGetTime()/150.0f );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

처음에는 D3DXMatrixRotationY 메소드를 호출해 삼각형을 y축 회전으로 회전시킵니다. 첫번째 파라메터는 연산의 결과가 되는 3DXMATRIX 구조체로의 포인터입니다. 두번째 파라메타는 회전의 각도(라디언 단위)입니다.

다음은, IDirect3DDevice9::SetTransform 을 호출해 Direct3D 디바이스에 대한 월드 트랜스폼을 정의합니다. IDirect3DDevice9::SetTransform 에 넘긴 첫번째 파라메터에 의해 설정한 트랜스폼을  Direct3D 에 지시합니다. 이 샘플에서는 D3DTS_WORLD 마크로를 사용해 월드 트랜스폼의 설정이 필요하다는 것을 지정합니다. 두번째 파라메터는 현재의 트랜스폼으로 설정된 행렬로의 포인터입니다.

월드 트랜스폼의 자세한 사항에 대해서는 「월드 트랜스폼 (Direct3D 9)」을 참조해 주세요.

신에 대한 월드 트랜스폼을 정의하면 뷰 트랜스폼 행렬을 사용할 수있게 됩니다. 이 경우도 트랜스폼을 정의하는 순서는 중요치 않습니다. 다만, Direct3D에서는 다음 순서로 신에 행렬을 적용합니다.

  1. 월드(World)
  2. 뷰(View) 
  3. 사영(Projection)

뷰 트랜스폼 행렬의 정의에 대해서는「2 - 뷰 트랜스폼 행렬의 정의」를 참조해 주십시오.

Creative Commons License
2011/07/06 17:28 2011/07/06 17:28

이것으로 정점 버퍼에 정점이 격납되었습니다. 다음은 표시를 렌더링합니다. 표시의 렌더링에서는 먼저 백 버퍼를 클리어 해 청색으로 하고 그 다음 BeginScene 을 호출합니다.

g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0L );
g_pd3dDevice->BeginScene();

정점 버퍼로부터 정점 데이터를 렌더링 하려면 몇 단계를 거칩니다. 우선 스트림 소스를 설정합니다. 이 때 스트림 0을 사용합니다. 스트림 소스는 IDirect3DDevice9::SetStreamSource 를 호출해서 지정합니다.

g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );

첫번째 파라메터는 스트림 번호, 두번째 파라메터는 정점 버퍼로의 포인터 입니다. 세번째 파라메터는 스트림의 선두로부터 정점 데이터의 선두까지의 오프셋입니다. 이 예에서는 0입니다. 마지막 파라메터는 정점 선언의 각요소의 바이트 수입니다.

다음은 IDirect3DDevice9::SetFVF 를 호출해 고정기능의 정점 쉐이더를 식별합니다. 완전한 커스텀 정점 쉐이더는 고도의 토픽입니다만 여기서의 정점 쉐이더는 간단한 플렉서블 정점 포맷(FVF) 코드에 불과합니다. 다음 샘플 코드는 FVF 코드를 설정하고있습니다.

g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );

SetFVF 의 유일한 파라메터가 정점 데이터 레이아웃을 정의하는 고정 정점 함수 코드입니다.

다음은 아래의 샘플 코드에 나오는 것처럼 IDirect3DDevice9::DrawPrimitive 를 사용해 정점 버퍼의 정점을 렌더링 합니다.

g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

DrawPrimitive 가 받아들이는 1번째의 파라메터는 Direct3D에 드로우하는 프리머티브의 종류를 지시하는 플래그입니다. 이 샘플에서는 D3DPT_TRIANGLELIST 플래그를 사용해 삼각형의 리스트를 지정합니다. 두번째 파라메터는 처음 로드할 정점의 인덱스입니다. 세번째 파라메터는 드로우할 프리머티브의 수를 나타냅니다. 이 샘플에서는 1개의 삼각형만 드로우하므로 이 값은 1이 설정됩니다.

각종 프리머티브의 자세한 내용에 대해서는 「프리머티브」를 참조해 주십시오.

마지막으로 신을 종료한 후 백 버퍼를 프론트 버퍼에 할당합니다. 이 예를 다음 코드에 나타냈습니다.

g_pd3dDevice->EndScene();
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

백 버퍼를 프론트 버퍼에 할당하면 클라이언트 윈도우에 3개의 다른 컬러의 포인터를 가진 삼각형이 표시됩니다.

이 튜토리얼에서는 정점을 사요해서 지오메트릭 쉐이프를 렌더링하는 방법을 다뤘습니다.「튜토리얼 3: 행렬의 사용방법」에서 행렬의 컨셉과 그 사용방법을 소개합니다.

Creative Commons License
2011/07/04 09:46 2011/07/04 09:46

커스텀 정점 포맷이 정의 되면 다음은 정점을 초기화 합니다. Vertices 샘플 프로젝트에서는 필요한 Direct3D 오브젝트를 작성한 후에 애플리케이션 정의 함수인 InitVB를 호출해 이것을 실행합니다. 다음 샘플 코드는 3개의 커스텀 정점의 값을 초기화 합니다.

CUSTOMVERTEX vertices[] =
{
    { 150.0f,  50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
    { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
    {  50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
};

상기 샘플 코드에서는 3개의 정점을 3각형의 포인트로 채우고 각 정점이 방사하는 컬러를 지정합니다. 제1포인트는  (150, 50)이고 컬러는 빨강(0xffff0000)입니다. 제2포인트는(250, 250)이고 컬러는 초록(0xff00ff00)입니다. 제3포인트는 (50, 250)이고 컬러는 청록(0xff00ffff)입니다. 이들 포인트는 각각 심도치는 0.5, RHW(Reciprocal of the W coordinate from the Homogeneous point;동차 좌표 w 성분의 역수)는 1.0입니다.

다음은 아래의 샘플코드에 나타낸 것처럼 IDirect3DDevice9::CreateVertexBuffer 를 호출해 정점 버퍼를 작성합니다.

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
         0 /*Usage*/, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
    return E_FAIL;

IDirect3DDevice9::CreateVertexBuffer 의 최초 두개의 파라메터는 Direct3D 에 새로운 정점 버퍼의 필요 사이즈와 용도를 지시합니다. 다음 2개의 파라메터는 새로운 버퍼의 벡터 포맷과 메모리 위치를 지정합니다. 여기서는 벡터 포맷은  D3DFVF_CUSTOMVERTEX 으로 샘플 코드가 이전에 지정한 플렉서블 정점 포맷 (FVF) 입니다. D3DPOOL_DEFAULT 플래그는 Direct3D 에 이 정점 버퍼에 최적의 메모리를 할당해 정점 버퍼를 작성하도록 지시합니다. 마지막 파라메터는 작성하는 버퍼의 어드레스입니다.

정점 버퍼의 작성 후 다음 샘플 코드에 나온 것처럼 커스텀 정점 데이터로 그것을 채웁니다.

VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
    return E_FAIL;

memcpy( pVertices, vertices, sizeof(vertices) );

g_pVB->Unlock();

우선 IDirect3DVertexBuffer9::Lock 을 호출해 정점 버퍼를 록합니다. 첫번째 파라메터는 록할 정점 데이터의 오프셋(바이트 단위)입니다. 두번째 파라메터는 록할 정점 데이터의 사이즈(바이트 단위)입니다. 세번째 파라메터는 BYTE 포인터의 어드레스로 정점 데이터로 포인터를 격납합니다. 4번째 파라메터는 정점 버퍼에 데이터의 록 방법을 지시합니다.

그 다음 memcpy 를 사용해 정점은 정점 버퍼에 복사됩니다. 정점 버퍼에 정점이 읽어들여지면  IDirect3DVertexBuffer9::Unlock 을 호출해 정점 버퍼의 록을 해제합니다. 정점 버퍼는 디바이스 메모리 내에 존재할 가능성이 있으므로 이 록, 그리고 록 해제의 메카니즘이 필요합니다.

이것으로 정점 버퍼에 정점이 격납됩니다. 다음은「 3 - 표시의 렌더링」에서 표시를 렌더링 하는 것을 다룹니다.

Creative Commons License
2011/07/04 09:27 2011/07/04 09:27

Direct3D로 기술된 애플리케이션에서는 정점을 사용해,지오메트리 쉐이프를 그립니다. 각 3차원(3D) 신에는 이들 지오메트리 쉐이프가 1개 이상 포함되어 있습니다. Vertices 샘플 프로젝트에서는 가장 단순한 쉐이프인 삼각형을 작성해 그것을 렌더링해 표시합니다.

이 튜토리얼에서는 다음 스텝에 따라 정점을 사용해 삼각형을 작성하는 방법을 보여줍니다.

=================
[DX9] 2.정점의 렌더링 1 - 커스텀 정점 타입의 정의

Vertices 샘플 프로젝트는 3개의 정점(vertex; vertices(복수형))을 사용해 2D 삼각형을 렌더링 합니다. 이것은 정점 버퍼(vertex buffer)의 개념, 다시말해 정점을 격납해 렌더링 하기위해 사용되는 Direct3D 오브젝트를 도입하고 있습니다. 정점의 정의하는 방법은 다양하며, 커스텀 정점 구조체와 대응하는 커스텀 플렉서블 정점 포맷(FVF)을 지정하는 등 다양한 방법이 있습니다. Vertices 샘플 프로젝트의 정점 포맷을 다음 샘플 코드에 나타냈습니다.

struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; // The transformed position for the vertex.
    DWORD color;        // The vertex color.
};

위의 구조체는 커스텀 타입의 포맷을 지정하고 있습니다. 다음은 버퍼 내의 정점 내용을 나타내는 FVF을 정의 하는 것입니다. 다음 샘플 코드는 위에서 작성된 커스텀 정점 타입에 대응하는 FVF를 정의하고 있습니다.

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

D3DFVF 는 어떤 커스텀 정점 타입이 사용됐나를 나타냅니다. 상기 샘플 코드에는 D3DFVF_XYZRHW 플래그와 D3DFVF_DIFFUSE 플래그를 사용하고 있습니다. 이 플래그들은, 커스텀 정점 타입이 트랜스폼된 포인트와 그에 따른 컬러 성분을 가졌다는 것을 정점 버퍼에 통지 합니다.

여기서 커스텀 벡터 포맷과 FVF가 지정됩니다. 다음은 「2 - 정점 버퍼의 설정」으로 정점 버퍼를 정점으로 채우는 것 입니다.

주의
Vertices 샘플 프로젝트의 정점은 트랜스폼 되어있습니다. 다시말해, 이미 2D 윈도우 좌표화 되어있습니다. 이것은 포인트 (0,0)이 좌상측 모서리에 위치하며 X축 방향으로 증가하는 것은 오른쪽으로 향하는 것, Y축 방향으로 증가하는 것은 아래로 향한다는 것을 의미합니다. 또, 이것들의 정점은 강조 표시(lit) 되어있습니다. 다시말해 Direct3D 라이팅은 사용하지 않습니다만, 각각 컬러가 지정되어있습니다.
Creative Commons License
2011/07/02 18:19 2011/07/02 18:19

실행중의 몇몇 포인트에서 애플리케이션을 셧 다운할 필요가 있습니다. DirectX 애플리케이션을 셧 다운하면 애플리케이션 윈도우가 파기될뿐 아니라 애플리케이션이 사용하고 있는 DirectX 오브젝트가 할당을 해제돼 그들로의 포인터는 무효화 됩니다. CreateDevice 샘플 프로젝트에서는 WM_DESTROY 메시지를 받으면 이 메시지를 처리하기 위해서 애플리케이션 정의 함수의 Cleanup을 호출합니다.
 

VOID Cleanup()
{
    if( g_pd3dDevice != NULL)
        g_pd3dDevice->Release();
    if( g_pD3D != NULL)
        g_pD3D->Release();
}

상기 함수는 오브젝트마다  IUnknown 메소드를 호출해 사용하고 있는 Direct3D 오브젝트의 할당을 해제합니다. 이 튜토리얼은 COM 룰을 따르므로 대부분의 오브젝트의 리퍼런스 카운트는 0이 되어 메모리로부터 자동적으로 소거됩니다.

셧다운 이외에도 데스크 톱의 해상도와 색상수를 변경할 경우 등 통상 실행중에 사용중의 Microsoft Direct3D 오브젝트를 파기해 다시 작성할 필요가 생길 수 있습니다.  그때문에 애플리케이션의 클린 업 코드는 필요에 따라 호출하도록 한 곳에 모아 유지할 것을 추천합니다.

이 튜토리얼에서는 디바이스를 작성하는 방법을 다뤘습니다.「튜토리얼2:정점의 렌더링」에서 정점을 사용해 지오메트릭 쉐이프를 그리는 방법을 알아봅니다.

Creative Commons License
2011/07/02 17:36 2011/07/02 17:36

신을 렌더링해 표시하기 위해 이번 샘플 코드에서는 백 버퍼를 청색으로 클리어해서 백 버퍼의 내용을 프론트 버퍼로 전송해 프론트 버퍼를 화면에 할당합니다.

신을 클리어하려면 IDirect3DDevice9::Clear 메소드를 호출합니다.

// Clear the back buffer to a blue color
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

IDirect3DDevice9::Clear 가 받아들인 최초 2개의 파라메터는 Direct3D에 클리어할 사각형(矩形;rect)의 배열의 사이즈와 어드레스를 통지합니다. 사각형의 배열은 클리어할 렌더 타겟 서페이스 상의 영역을 나타내고 있습니다.

일반적으로 렌더 타겟 전체를 커버하는 단일 사각형을 사용합니다. 이것을 실행하려면 첫번째의 파라메터를 0으로, 두번째의 파라메터를 NULL로 설정합니다. 세번째 파라메터는 메소드의 동작을 결정합니다. 렌더 타겟 서페이스(render-target suface), 관련지어진 심도 버퍼(associated depth buffer), 스텐실 버퍼(stencil buffer), 또는 3개의 임의의 조합을 클리어하기 위한 플래그를 지정할 수 있습니다. 이 튜토리얼에서는 심도 버퍼는 사용하지 않습니다. D3DCLEAR_TARGET 이 사용되고 있는 유일한 플래그입니다. 최초 3개의 파라메터는 렌더 타겟, 심도 버퍼, 그리고 스텐실 버퍼의 값의 클리어를 반영하도록 설정됩니다. CreateDevice 샘플 프로젝트에서는 렌더 타겟 서페이스의 클리어 컬러를 청(D3COLOR_XRGB(0,0,255))으로 설정합니다. 마지막 2개의 파라메터는 대응하는 플래그가 존재하지 않으므로 IDirect3DDevice9::Clear 메소드에서는 무시됩니다.

다음의 샘플 코드에 보이는 것처럼 CreateDevice 샘플 프로젝트는 뷰포트를 클리어한 후, Direct3D에 렌더링이 개시된 것을 통지하고 그 뒤 렌더링이 완료된 것을 통지합니다.

// Begin the scene
g_pd3dDevice->BeginScene();

// Rendering of scene objects happens here

// End the scene
g_pd3dDevice->EndScene();

IDirect3DDevice9::BeginScene 과 ID3DXRenderToSurface::EndScene 메소드는 렌더링의 개시 또는 완료를 통지합니다. 이들 메소드를 호출하는 사이에서만 렌더링 메소드를 호출 할 수있습니다. 렌더링 메소드가 실패한 경우에도, 다시 IDirect3DDevice9::BeginScene 를 호출하기 전에 ID3DXRenderToSurface::EndScene 를 호출할 필요가 있습니다.

신이 렌더링되면 IDirect3DDevice9::Present 메소드를 사용해 표시합니다.

g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

최초 2개의 파라메터는 복사할(source) 사각형과 복사될(destination) 사각형입니다. 이 샘플 코드에서는 이 2개의 파라메터를 NULL에 설정하는 것으로 백 버퍼 전체를 프론트 버퍼에 할당하고 있습니다. 3번째 파라메터는 이 프레젠테이션의 소스 윈도우를 설정합니다. 이 파라메터는 NULL에 설정되어있으므로 D3DPRESENT_PARAMETERS의 hWndDeviceWindow 멤버가 사용됩니다. 4번째의 파라메터는 DirtyRegion 파라메터로 일반적으로는 NULL에 설정됩니다.

이 튜토리얼의 마지막 단계로「5 - 셧 다운」에서 애플리케이션을 셧다운 해 봅시다.

Creative Commons License
2011/07/02 15:59 2011/07/02 15:59

애플리케이션 윈도우를 작성하고, Direct3D를 초기화 한 후는 언제라도 신을 렌더링 할 수 있습니다. 통상, Windows 애플리케이션은 각각의 메시지 루프 내에서 시스템 메시지를 모니터하고, 메시지가 큐에 존재하지 않으면 프레임을 렌더링 합니다. 다만, CreateDevice 샘플 프로젝트는 WM_PAINT 메시지가 큐에 들어올 때까지 대기해 애플리케이션에 그 윈도우 전체 또는 일부를 갱신할 필요가 있음을 통지합니다.

// The message loop.
MSG msg; 
while( GetMessage( &msg, NULL, 0, 0 ) )
{
    TranslateMessage( &msg );
    DispatchMessage( &msg );
}

루프가 실행될 때마다 DispatchMessage 는 큐 내의 메시지를 처리할 MsgProc를 호출합니다.
WM_PAINT 가 큐에 들어오면 애플리케이션은 윈도우를 갱신할 애플ㄹ리케이션 정의 함수인 Render를 호출합니다. 이어서 클라이언트 영역 전체를 검증하기위해서 Win32함수ValidateRect 가 불립니다.

메시지 처리 함수의 샘플 코드는 다음과 같습니다.

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

이것으로 애플리케이션은 시스템 메시지를 처리할 수 있습니다. 다음에는 「 4 - 신의 렌더링과 표시」에서 설명하는 것 처럼 표시를 렌더링 합니다.

© 2009 Microsoft Corporation. All rights reserved.
バージョン: 1734.00

Creative Commons License
2011/07/02 15:37 2011/07/02 15:37

CreateDevice 샘플 프로젝트는 윈도우 작성후에, WinMain 로부터 호출된  InitD3D 애플리케이션 정의함수 중에서 Direct3D 초기화를 실행합니다. 애플리케이션 윈도우의 적성후에는 언제라도, 신을 렌더링하기 위해 사용하는 Direct3D 오브젝트를 초기화 할 수 있습니다. 이 프로세스는 오브젝트를 작성하고 프레젠테이션 파라메터를 설정하고 마지막으로 Direct3D 디바이스를 작성합니다.

Direct3D 오브젝트의 작성 후 IDirect3D9::CreateDevice 메소드를 사용해 디바이스를 작성하고 디바이스, 타입, 모드 등의 열거 할 수 있습니다.

if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
	return E_FAIL;

Direct3DCreate9 에 넘겨지는 파라메터는 언제나 D3D_SDK_VERSION 뿐입니다. 이것은 바른 헤더 파일이 사용되고 있다는 것을 Direct3D에 통지합니다. 이 값은 헤더 또는 그 외의 변경에 의한 애플리케이션을 다시 빌드할 필요가 생길때마다 인클리멘트됩니다. 버전이 일치하지 않는 경우 Direct3DCreate9은 실패합니다.

D3DPRESENT_PARAMETERS 의 필드를 채워서 3D 애플리케이션의 동작방법을 지정할 수 있습니다. CreateDevice 샘플 프로젝트에서는 Windowed 가 TRUE, SwapEffect가 D3DSWAPEFFECT_DISCARD, BackBufferFormat가 D3DFMT_UNKONWN에 설정됩니다.

D3DPRESENT_PARAMETERS d3dpp; 
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

마지막 순서로 다음 코드의 예에 나타낸 것처럼 IDirect3D9::CreateDevice 메소드를 사용해 Direct3D 디바이스를 작성합니다.

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  &d3dpp, &g_pd3dDevice ) ) )

상기 샘플코드는 D3DADAPTER_DEFAULT 플래그를 사용해서 디폴트 어댑터를 가진 디바이스를 작성합니다. 통상, 시스템은 복수의 그래픽 하드웨어 카드가 인스톨 되어있지 않은 한, 단일 어댑터만을 가집니다. DeviceType 파라메터에 D3DDEVTYPE_HAL을 지정하면, 소프트웨어 디바이스에 의한 하드웨어 디바이스 쪽이 우선됩니다. 이 샘플코드에서는 D3DCREATE_SOFTWARE_VERTEXPROCESSING 를 사용해서, 시스템에 소프트웨어 정점처리를 사용하도록 지시하고 있습니다. D3DCREATE_HARDWARE_VERTEXPROCESSING 를 지정해, 시스템의 하드웨어 정점처리를 사용하도록 하는 경우에는 하드웨어 정점처리 퍼포먼스가 대폭 향상하는 점에 주의해 주십시오.

이것으로 Direct3D 오브젝터는 초기화 되었습니다. 다음에는 「3 - 시스템 메시지의 처리」에서 설명하고 있는 것처럼, 시스템 메시지를 처리하는 메카니즘의 확보를 수행합니다.

Creative Commons License
2011/07/01 23:37 2011/07/01 23:37

Windows 애플리케이션이 실행될 때에 최초로 처리되어야할 것은 유저에게 표시하는 애플리케이션 윈도우를 작성하는 것입니다. 이것을 실행하려면 CreateDevice 샘플 프로젝트의  WinMain 함수로 실행을 개시합니다. 다음의 샘플 코드는 윈도우의 초기화를 실행합니다.

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
	// Register the window class.
	WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
	GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
	"Direct3D Tutorial", NULL };

	RegisterClassEx( &wc );

	// Create the application's window.
	HWND hWnd = CreateWindow( "Direct3D Tutorial", "Direct3D Tutorial 01: CreateDevice", 
	WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
	GetDesktopWindow(), NULL, wc.hInstance, NULL );

상기의 샘플코드는 표준 Windows 프로그래밍입니다. 샘플에서는 최초로 "Direct3D Tutorial"이라는 윈도우 클래스를 정의해 등록하고 있습니다. 클래스를 등록한 뒤 샘플 코드는 폭 300픽셀, 높이 300픽셀의 클라이언트 영역을 가지고 등록한 클래스를 사용하는 기본적인 최상위 윈도우를 작성합니다. 이 윈도우에는 메뉴와 자식 윈도우는 없습니다. 샘플에서는 WS_OVERLAPPEDWINDOW 윈도우 스타일을 사용해 윈도우 애플리케이션에 공통의 [최소화], [최대화], 그리고 [닫기] 버튼을 가진 윈도우를 작성합니다.(샘플이 풀스크린 모드로 실행될 경우, 추천되는 윈도우 스타일은 WS_EX_TOPMOST입니다. 이것은 작성된 윈도우를 최상위가 아닌 모든 윈도우 위에 배치해 윈도우가 비 액티브인 경우에도 최상위에 남아있도록 지정합니다.) 윈도우가 작성되면 표준의 Win32함수를 호출해 윈도우 표시를 갱신합니다.

애플리케이션 윈도우가 준비되었으면 「2 - Direct3D의 초기화」에서 설명하는대로 필수 Direct3D 오브젝트의 셋업을 개시할 수 있습니다.

DirectX Software Development Kit / 튜토리얼/ Direct3D 튜토리얼/ 튜토리얼 1: 디바이스의 작성 도움말에서

Creative Commons License
2011/07/01 22:43 2011/07/01 22:43
과정
=====
1. 오거나이저의 repositories에서 추가(+)버튼을 누르고 Checkout 이나 Clone Repository를 고른다.
2. 파일의 패스나 URL을 입력한다.
3. "Host is reachable" 인디케이터가 녹색으로 바뀌면 Next버튼을 클릭한다.
4. Repository용 로컬 이름을 입력하고 Clone이나 Checkout으로 그것을 복사한다.
5. 위치를 고르고 선택된 Clone(또는 Checkout) 버튼을 클릭해 로컬 repository를 저장한다.


-----------------------------------------

로컬 시스템에 사본을 만들기 위해 Check out이나 clone을 수행한다.

일반적인 repository 작업의 추상화로  Xcode는 Git과 Subversion(SVN) 모두 싱글 또는 통합 GUI 및 작업수행과정의 저장소를 제공한다. 무엇을 선택하느냐에 따라 이 작업은 저장소를 check out(SVN용)하거나 clone(Git용)하며 프로젝트에 적용한다.

Xcode에서 Git 저장소를 클로닝하는 것은 로컬 시스템에 저장소를 세팅하고, 작업 공간에서 바로 쓸 수 있는 저장소로 만들어준다. 이 방법은 온라인이거나 오프라인이거나 상관없이 배포 버전 관리 및 코드 백업의 모든 권한을 관리할 수 있는 장점이 있다.

SVN 체크아웃 작업은 로컬 저장소를 만들지 않는다. 따라서 반드시 변화된 결과물을 저장할 수 있는 저장소 서버를 준비해야 한다.

SVN용으로 반드시 trunk, branches, tags 디렉토리로의 상대주소도 준비해야한다. 이렇게 하면, 저장소 오거나이저에서 새로운 저장소의 이름을 클릭해 간단히 필드를 채울 수 있다. 만약 SVN 서버가 인증을 필요로 한다면 유저명과 비번도 채워넣어야 한다.

이 비디오는 Sketch 샘플 코드 프로젝트가 Git 저장소를 클로닝 하는 과정을 보여준다.

Creative Commons License
2011/05/11 04:21 2011/05/11 04:21
과정
====
1. 진행할 프로젝트의 임시 사본을 보관하도록 mkdir 커맨드를 이용해서 branches, tags, trunk 이렇게 3개의 서브디렉토리를 생성한다.

2. trunk 서브 디렉토리에 진행할 Xcode 프로젝트를 복사해 넣는다.

3. 빈 Subversion repository를 만들기 위해 svnadmin create 명령을 사용한다.

4. 새로운 Subversion repository에 진행할 프로젝트를 임포트하기 위해서 svn import 명령을 사용한다.



-------------------------------------------------------------
Subversion repository를 설치하기 위해 커맨드라인 명령을 사용한다.

Subversion repository를 설치하려면, Shell을 이용해야만한다. 기본 제공하는 bash쉘인 Terminal을 이용한다.
(/Applications/Utilities/Terminal.app에 있다)

만약 진행중인 프로젝트가 없다면 Xcode를 이용해서 repository를 설치하기 전에 새로운 프로젝트를 생성한다.

스텝 1.
프로젝트의 사본을 임시로 보관할 디렉토리 구조를 생성한다. 예를 들어 Sketch_svn_tmp라는 디렉토리를 다음 명령을 이용해 생성해 본다.
  • mkdir /Repo_Master/Sketch_svn_tmp

mkdir 커맨드는 지정된 패스의 가장 마지막 패스만을 생성한다. 따라서 위의 예에서 /Repo_Master라는 디렉토리는 이미 존재해야한다.

==Tip== 현재 위치의 폴더를 터미널로 집어 던지면 풀 패스가 표시된다.

관례적으로 SVN repository 는 3개의 서브 디렉토리를 포함하며 그 이름은 다음과 같다. branches, tags, trunk.
다음 명령어는 이 세 서브 디렉토리를 Sketch_svn_tmp 디렉토리에 생성해줄 것이다.
  • mkdir /Repo_Master/Sketch_svn_tmp/trunk
  • mkdir /Repo_Master/Sketch_svn_tmp/branches
  • mkdir /Repo_Master/Sketch_svn_tmp/tags


스텝2.
임시 구조의 셋업이 끝났으면 이제 진행할 프로젝트를 trunk 서브 디렉토리에 넣는다. 예를 들자면 다음 커맨드를 이용해 /Developer/Examples 폴더에 있는 Sketch 프로젝트 폴더와 그 내용물을 복사해 넣을 것이다.
  • cp -R /Developer/Examples/Sketch /Repo_Master/Sketch_svn_tmp/trunk


스텝3.
빈 Subversion repository를 생성한다. 예를 들자면 /Repo_Master 폴더에 위치하는 Sketch_svn이라는 이름의 repository 를 원한다면 다음의 svnadmin 명령을 이용하면 된다.

svnadmin create /Repo_Master/Sketch_svn



위애서 설명한 대로 /Rempo_Master는 생성된 상태에서 해야 /Sketch_svn이 생성된다.

스텝4.
이제 임시 구조에서 새로운 repository로 import해서 Subversion 소스 관리 상태로 둔다. 다음 명령으로 수행할 수 있다.
  • svn import /Users/myUserName/Projects/Sketch_tmp \
  • file:///Users/myUserName/Repositories/Sketch_svn -m "Initial import"



주의 :
*위 첫번째 줄의 백슬래시(\)는 다음 줄과 이어진다는 의미다. 한 줄로 쓸 땐 생략할 수 있다. 백슬래시를 쓴다면 그 뒤에는 빈칸이 없는 상태에서 RETURN키를 누른다.
*다음 문자열의 /는 3개가 맞다. file:///
*한 줄로 입력할 때에는 file:/// 앞에 빈칸을 하나 넣는다.
*따옴표(")를 이용하면 커멘트를 넣을 수 있다. 그러나 누구나 알아볼 수 있는 문장을 쓰도록 한다.


만약 import명령이 제대로 끝나면 다음 그림처럼 임포트 된 프로젝트 파일들이 배열될 것이다.


사용자 삽입 이미지


그림은 Sketch_svn Subversion reository를 만들고 Sketch 프로젝트를 그 안에 넣은 걸 보여준다. 제대로 되었다면 그림처럼 보일 것이다.






















Creative Commons License
2011/05/11 04:06 2011/05/11 04:06

트랜지션

from 학습/iOS 2011/04/07 22:57
(1)트랜지션 애니메이션 설정
================
트랜지션 애니메이션을 하려면 UIView애니메이션 설정 개시 시 UIView클래스의 setAnimationTransition:forView:cashe:메소드를 부른다


(중략)

트랜지션 애니메이션의 종류는 다음과 같다. 단, 캐쉬를 NO로 하면 트랜지션 애니메이션 중에도 뷰의 화상이 갱신 되도록 된다.

(중략)

(2) 뷰의 갱신
========
UIView클래스의 setAnimationTransition:forView:cashe:메소드와 commitAnimation메소드의 사이에 뷰를 갱신한다. removeFromSuperview메소드로 현재 뷰를 새로운 뷰로부터 해제하고 addSubview:메소드로 서브뷰를 추가한다.


(중략)


뷰의 생성자체는 beginAnimation:context:메소드보다 먼저 한다. 그렇지 않으면 애니메이션 완료까지 다음 뷰가 표시되지 않는다.
Creative Commons License
2011/04/07 22:57 2011/04/07 22:57

LayerAnimation

from 학습/iOS 2011/04/07 17:44
(1)레이어 생성
========
레이어를 생성하려면 CALayer클래스의 layer메소드를 사용한다.

(중략)

주요 프로퍼티는 다음과 같다.

(중략)

또, UIImage오브젝트로부터 CGImageRef형의 이미지를 취득하려면 CGImage프로퍼티를 사용한다.

(중략)

(2) 뷰에 레이어 추가
============
뷰에 레이어 추가하려면 UIView클래스의 layer프로퍼티에서 뷰의 레이어를 취득해 addSublayer: 메소드로 레이어의 서브 레이어로 추가한다.

(중략)

(3) 레이어 애니메이션 생성
===============
레이어 애니메이션을 생성하려면 CABasicAnimation클래스의 animationWithKeyPath: 메소드를 사용한다.

(중략)

이번에는 3차원의 어파인 변환을 하는 transform 프로퍼티를 변경대상으로 하며 keyPath에는 "transform"을 지정한다. 주요 프로퍼티는 다음과 같다.

(중략)

CAAnimation 클래스의 CALayer클래스는 CAMediaTiming 프로토콜을 구현하고 있다.
애니메이션 개시시와 종료시의 값에는 프로퍼티에 지정하는 값을 대입한다. 형은 id 형으로 조작하는 프로퍼티가 CGPoint나 CGRect나 CATransform3d등의 구조체일때는 NSValue클래스 메소드를 사용해 오브젝트 형을 변환하면서 대입한다.

(중략)

이 프로그램에서는 transform프로퍼티에 대해 회전 없이 (CATransform3DIdentity)로부터 Y축으로 180도 회전((CATransform3DMakeRotation(M_PI,0,1,0))하도록 설정했다.


(4) 3차원 어파인 변환
============
3차원 어파인변환으로 이용하는 주요함수는 다음과 같다.

(중략)

또, 상수 CATransform3DIdentity는 동일 행렬이다. 평행이동, 회전, 확대 축소등의 변환을 하지 않는 행렬이 된다.

(5)레이어의 레이어 애니메이션 추가
====================
레이어로 레이어 애니메이션을 추가하려면 CALayer 클래스의 메소드를 사용한다.

(중략)

키를 이용해 레이어로부터 애니메이션을 취득할 수 있다.

(후략)

Creative Commons License
2011/04/07 17:44 2011/04/07 17:44

UIView애니메이션

from 학습/iOS 2011/04/07 02:37
UIVew애니메이션의 기능을 사용해 애니메이션 시키는 프로그램을 만든다. 버튼을 누를때마다 다음 4종류의 애니메이션을 수행한다.

1. 안에서부터 확대하며 출현
2.안에서부터 회전확대하며 출현
3. 화면 아래부터 출현
4. 보턴 위치로부터 확대되며 출현

iPhone/iPad에서 애니메이션을 구현하는 것은 "Core Animation"이라 불리는 프레임 워크를 이용한다. Core Animation의 주요 기능으로는 다음 3개가 있다.

*UIView 애니메이션
*레이어 애니메이션
*트랜직션

UIView 애니메이션은 버튼과 뷰등의 유저 인터페이스를 움직이는 애니메이션이다. UIView를 계승하고 있는 오브젝트가 대상이다. 유저 인터페이스의 애니메이션전의 위치, 회전 각도, 투명도와 애니메이션 후의 위치, 회전 각도, 투명도를 설정하는 것으로 그 도중의 상태를 보간해 애니메이션한다. 레이어 애니메이션과 트랜직션에 대해서는 다음장에서 다룬다.

(1) 유저 인터페시의의 어파인 변환과 투명도
=========================
유저 인터페이스에 대해 어파인 변환을 하려면 UIView클래스의 프로퍼티를 사용한다.
어파인 변환이란 도형에 대한 평행이동, 회전, 확대 축소등을 행하는 변환을 말한다.

(중략)

CGAffineTransform 클래스는 어파인 변환에 의해 어느정도, 평행 이동, 회전, 확대 축소하는가를 다루는 클래스다.
평행이동하는 CGAffineTransform 오브젝트를 생성하려면 CGAffineTransformMakeTranslation함수, 회전하는 CGAffineTransform 오브젝트를 생성하려면 CGAffineTransformMakeRotate함수, 확대축소하는 CGAffineTransform 오브젝트를 생성하려면 CGAffineTransformMakeScale함수를 이용한다.

(중략)

회전 후에 확대 축소를하는 등, 복수의 어파인 변환을 합성하고 싶을 떄는 다음 CGAffineTransformTranslate함수, CGAffineTransformRotate함수, CGAffineTransformScale함수를 이용한다.

(중략)

유저 인터페이스의 투명도를 지정하려면 UIView클래스의 alpha 프로퍼티를 사용한다. 10.이 완전히 보이는 상태, 0.0이 완전히 보이지 않는 상태다. 0.0일때는 터치 이벤트도 발생하지 않는다. 뷰가 가지고 있는 서브 뷰에 대해서도 투명도는 반영된다. 뷰의 색만을 투과하고 싶으면 backgroundColor프로퍼티에서 조정한다.

(중략)

이 프로그램에서는 애니메이션 1의 애니메이션 전 상태를 (0.5, 0.5) 축소, 투명도 0.8로 한다.

(중략)

또, 애니메이션 2의 애니메이션 전 상태를 180도 회전하고 (0.5, 0.5) 축소, 투명도 0.8로 한다.

(중략)

이하의 계산으로 도를 라디안으로 변환해 대입한다. M_PI는 파이의 값을 나타내는 상수다.

라디안=도*(M_PI/180)

거기에 애니메이션 3의 애니메이션 ㅓㄴ에 상태를 (0,400) 평행이동, 투명도 0.8)로 한다.

(중략)

(2)UIView애니메이션 설정 개시
===================
UIView 애니메이션을 행하려면 유저인터페이스의 애니메이션 전 위치, 회전 각도, 투명도를 지정한 다음 UIView클래스의 beginAnimations:contex:메소드를 부른다.

(중략)

애니메이션 ID와 파라메터는 애니메이션 개시 시에 불리는 메소드와 애니메이션완료 후 불리는 메소드에 건네지는 인수다. 통지 타겟의 setAnimationRepeatCount:메소드에서는 이것들의 정보를 기초로 어떤 처리를 할 것인지 정한다. 필요 없을 땐 nil을 지정한다.
UIView클래스의 setAnimationDuration:메소드에서 애니메이션 시간, setAnimationCurve:메소드에서 애니메이션 커브, setAnimationRepeatCount:메소드에서 리피트 횟수,  setAnimationRepeatAutoreversed:메소드에서 역방향의 애니메이션을 할지 말지를 지정한다. 애니메이션 커브에서는 점점 빠르게나 점점 느리게를 설정할 수 있다.

(중략)

애니메이션 커브에서는 이하의 상수를 지정한다.

(중략)

(중략)

(3)UIView애니메이션 델리게이트
====================
UIView 애니메이션 델리게이트를 지정하려면 UIView클래스의 setAnimationDelegate:메소드를 사용한다.

(중략)

setAnimationWillStartSelector:메소드에서 UIView애니메이션 개시시ㅇ 불리는 메소드를 지정한다.

(중략)

통지 타겟의 메소드의 서식은 다음과 같다. 인수의 형과 순서가 같은 메소드라면 메소드명은 자유롭게 지정할 수 있다.

(중략)

이 프로그램에서는 ViewAnimationEx오브젝트 자신의 someAnimationWillStart:메소드를 통지 타겟으로 지정했다.

(중략)

통지타겟의 메소드의 서식은 다음과 같다. 인수의 형과 순서가 같은 메소드라면 메소드명은 자유롭게 지정할 수 있다.

(중략)

이프로그램에서는 ViewAnimation오브젝트 자신의 someAnimationDidSto:finished:context:메소드를 통지 타겟으로 지정했다.

(중략)

(4)애니메이션 후의 위치, 회전각도, 투명도
=======================
UIView클래스의 beginAnimations:context:메소드와 commitAnimations메소드의 사이에 애니메이션 후 위치, 회전각도, 투명도를 지정한다. 위치, 회전각도, 투명도의 지정은 commitAnimation 메소드가 불릴때까지 반영되지 않는다.

(5)UIView애니메이션 실행
================
UIView애니메이션을 실행하려면 commitAnimations메소드를 호출한다.

(중략)

(6)프레임 지정에 의한 애니메이션
===================
어파인 변환이 아니라 프레임에 의한 (X좌표, Y좌표, 폭, 높이)의 지정으로 애니메이션 전의 위치와 애니메이션 후의 위치를 지정할 수도 있다.

(후략)

Creative Commons License
2011/04/07 02:37 2011/04/07 02:37

사운드 재생

from 학습/iOS 2011/04/06 17:33

(1)리소스 URL의 생성

============
읽어 올 타겟의 패스로 리소스의 URL을 생성할 때는 NSBundle 클래스의 mainBundle 메소드에서 NSBundle 오브젝트를 취득해 pathForResource:ofType:메소드에서 패스를 생성해 이용한다.

(중략)

pathForResource:ofType:메소드의 인수에는 파일명이 "bgm.wav"의 때는 파일명에 "bgm", 확장자에 "wav" 또는 파일명에 "bgm.wav"와 확장자에 ""를 지정한다.
마지막으로 NSURL클래스의 fileURLWithPath:메소드에서 패스를 URL로 변환한다.


(중략)


(2) 오디오 플래이어 생성
==============
사운드의 재생을 할 오디오 플레이어를 생성할 때는 AVAudioPlayer클래스를 사용한다 alloc으로 메모리를 확보후 initWihtContentsOfURL:error:메소드로 생성한다.

(중략)

====
[컬럼] 포인터의 포인터
====
포인터의 어드레스를 한번 더 포인터에 격납하는 것이 가능하며 이 포인터를 "포인터의 포인터"라 부른다. 포인터의 포인터를 선언할 때는 다음과 같은 서식으로 선언한다.

형** 변수명;

거기에 포인터의 포인터의 포인터를 만드는 것도 가능하나 통상 사용하진 않는다. 포인터의 포인터의 잇점은 참조형의 반환값을 함수의 반환값이 아닌 인수경유로 취득할 수 있다는 것이다.

AVAudioPlayer클래스의 initWithContentsOfURL:error:메소드의 인수 error도 에러 정보를 포인터의 포인터"(NSError**)"로 취득할 수 있다. NSError오브젝트를 선언 후 그 변수의 포인터의 포인터를 대응하는 메소드의 인수에 넘긴다. 임의의 변수의 포인터는 "&변수명"으로 나타낸다. 이것으로 에러시에는 error오브젝트에 NSError오브젝트를 대입되어 돌아온다.
initWithContentsOfURL:error:메소드의 에러 정보를 콘솔에 보내는 프로그램은 다음과 같다.

(중략)
----


(3) BGM의 재생과 정지
=============
오디오 플레어가 사운드를 재생중인가 어떤가 살펴보려면 AVAudioPlayer클래스의 playing프로퍼티를 사용한다. 이번에는 정지 중일 때는 사운드를 재생하고, 재생중일 때는 사운드를 정지한다.
사운드를 재생하려면 AVAudioPlayer클래스의 numberOfLoops프로퍼티에서 루프 회수를 지정해 currentTime프로퍼티에서 재생위츠를 지정하고 play메소드로 재생을 개시한다. 사운드를 정지하려면 stop메소드를 부른다.

(중략)

(4)SE 재생
=======
SE재생은 정지중일 때는 재생하고, 재생중일 때는 재생위치를 처음으로 돌린다.

(5) 오디오 플레이어의 볼륨 조작
===================
오디오 플레이어의 볼륨을 조작하려면 AVAuidoPlayer 클래스의 volume 프로퍼티를 사용한다. 오디오 플레이어의 볼륨의 최최값은 1.0으로 사운드 파일당의 볼륨의 조정에 이용한다. 단말의 볼ㄹㅁ 조작에 대해서는 다음장에서 다룬다.

(중략)

=======
[컬럼] 바이브레이션
========
iPHONE에서 바이브레이션을 하려면 AudioToolbox프레임 워크를 추가해 "Audio/AudioServices.h"를 임포트해 AudioServicePlayeSystemSound함수를 부른다

(후략)
Creative Commons License
2011/04/06 17:33 2011/04/06 17:33
6-3-1 가속도와 단말의 방향 취득 프로그램 구성
==========================

단말 내장의 가속도 센서를 이용해서 가속도와 단말이 향한 방향을 취득해 표시하는 프로그램을 만든다.
표시하는 정보는 다음과 같다.
가속도 센서는 모든 iOS단말에 이용 가능하다.

X축 가속도 (m/s)
Y축 가속도  (m/s)
Z축 가속도 (m/s)

단말 화면이 위를 향해 정지 한 상태에서는 X축 가속도와 Y축 가속도가 0.0, Z축 가속도가 -9.8이 된다. 이것은 지면을 향한 중력(9.8m/s)가 작용하기 때문이다.

(중략)

(1) 가속도 통지 개시
============
가속도의 통지를 개시하려면 UIAccelerometer 클래스를 이용한다. UIAccelerometer 클래스의 sharedAccelerometer클래스에서 UIAccelerometer 오브젝트를 취득한다.

(중략)

UIAccelerometer 클래스의 주요 프로퍼티는 다음과 같다. 이번에는 0.1초 마다 AccelerometerEx 클래스 자신에 가속도를 통지하도록 지정한다.

 (중략)

(2) 가속도 센서 델리게이트
===============
가속도 센서의 이벤트 통지 타겟에는  UIAccelerometerDelegate  프로토콜을 구현한 오브젝트를 지정한다. UIAccelerometerDelegate 프로토콜이 가진 메소드는 다음과 같다.

(중략)

가속도는 UIAcceleration 형의 값으로 UIAcceleration 클래스는 다음 4개의 프로퍼티를 가진다. UIAccelerationValue형과 NSTimeInterval형은 double형이다.

(중략)

(3) 가속도에 로우패스 필터 걸기
==================
acceleration.x, acceleration.y, acceleration.z 가 가속도 센서로부터 취득한 가속도의 값이다. 이 값을 그대로 이용해도 좋으나 그대로는 가속도 센서의 순간적인 데이터 변화의 영향을 받아 수치가 안정되어있지 않으므로, 일반적으로 로우패스필터를 통해 안정된 값을 이용한다.
구체적으로는 다음과 같은 "현재의 가속도*0.1+전회의 가속도*0.9"를 계산해 전회의 가속도로부터 스무드하게 현재의 가속도에 가까워지도록 한다.

(중략)

단말 흔들기등 순간적인 움직임을 계산하고 싶은 경우는 현재의 가속도로부터 로우패스 필터의 값을 뺀 값을 이용한다.

(중략)


(4)단말이 향한 방향의 통지 개시
==================
단말 회전시에 향한 방향을 취득하려면 UIDevice클래스와 NSNotificationCenter 클래스를 사용한다. UIDevice 크래스의 currentDevice메소드에서 UIDevice 오브젝트를 취득해 beginGeneratingDeviceOrientationNotification 메소드로 단말이 향한 방향의 통지를 시작한다.

(중략)

다음, NSNotificationCenter 클래스의 defaultCenter 메소드에서 NSNotificationCenter 오브젝트를 취득해 addObserver:selector:name:object:메소드로 단말이 향한 방향의 통지 타겟 오브젝트와 메소드를 지정한다.

(중략)

SEL은 메소드의 참조를 유지하는 형으로 "@selector(메소드명)"으로 통지 타겟의 메소드 명을 지정한다. 통지 타겟의 메소드 서식은 다음과 같다. 인수의 형과 순서가 같은 메소드라면 메소드 명은 자유롭게 지정할 수 있다.

(중략)

이 프로그램은 AcceleromaterEx 오브젝트 자신의 didRotate:메소드를 통지 타겟으로 지정하고 있다.

selector:@selector(didRotate:)

통지의 종류에는 단말이 향한 방향 변경의 통지를 의미하는 "UIDeviceOrientationDidChangeNotification"을 지정한다.


(5) 단말이 향한 방향 취득
==============
didRotate:메소드에 통지된 NSNotification 오브젝트로부터 단말이 향한 방향을 취득한다. NSNotification 클래스의 object 메소드로 통지의 발신원의 UIDevice 오브젝트를 취득해 orientation 프로퍼티로 단말의 방향을 받아들인다.

(중략)

단말이 향한 방향에는 다음과 같은 상수가 대입되어있다.


(중략)

UIViewController 클래스의 shouldAutorotateToInterfaceOrientation:메소드도 단말 회전시에 불리지만 이것은 화면이 회전하기 전에 불리는 메소드가 된다.




Creative Commons License
2011/04/02 15:04 2011/04/02 15:04
(1) 로케이션 매니저 생성
==============
위치정보 또는 방위정보를 취득하려면 우선 처음에 CLLocationManager 오브젝트를 생성한다. alloc으로 메모리를 확보후 init 메소드로 생성한다. 주요 프로퍼티는 다음과 같다.

(중략)

(2) 위치 정보 통지의 개시와 정지
==================
위치정보 통지가 가능한지 어떤지 조사하려면 CLLocationManager 오브젝트의 locationServicesEnabled 프로퍼티를 사용한다.

(중략)

위치 정보의 통지를 개시하려면 startUpdatingLocation 메소드를 사용한다.

(중략)

위치 정보 통지를 정지하려면 stopUpdatingLocation 메소드를 사용한다.

(중략)

(3) 방위 정보 취득의 개시와 정지
===================
방위 정보 통지가 가능한가 어떤가 조사하려면 CLLocationManager 오브젝트의 headingAvailable 메소드를 사용한다.

(중략)

방위 정보의 통지를 개시하려면 startUpdatingHeading메소드를 사용한다.
(중략)

방위 정보의 통지를 정지하려면 stopUpdatingHeading 메소드를 사용한다.

(중략)

(4) 로케이션 매니저의 델리게이트
===================
로케이션 매니저의 이벤트 통지 타겟은 CLLocationManagerDelegate 프로토콜을 구현한 오브젝트를 지정한다. CLLocationManagerDelegate프로토콜을 가진 메소드는 다음과 같다.

(중략)

CLLocation 오브젝트의 coordinate프로퍼티에서 CLLocationCoordinate2D형의 값을 취득한다. CLLocationCoordinate2D형의 구조체는 위도latitude와 경도longitude의 값을 유지한다. CLLocationDegrees형은 double형과 같다.

(중략)

단말 설정으로 위치정보의 취득이 불가능한 경우는 NSError 오브젝트의 code프로퍼티에 kCLErrorDenied가 들어간다.

(중략)

CLHeading 오브젝트의 trueHeading 프로퍼티가 진북의 방위를 나타내는 값(0.0~360.0)이다. CLLocationDerection형은 double과 같다.

========
컬럼 : 진북과 자북
========
진북은 지구 지축의 북, 자북은 방위 자석이 가리키는 북이다. 진북과 자북은 장소에 따라 어긋날 수 있다. 이 어긋남을 자기편각이라 부르고 동경에서는 약 7도 어긋난다.
진북이 아니라 자북의 방위를 알려면 magneticHeading 프로퍼티를 사용한다.

 CLLocationDerection magneticHeading : 자북을 나타내는 값(0.0~360.0)

Creative Commons License
2011/04/01 23:47 2011/04/01 23:47

과거 Frameworks 에서 오른클릭으로 Add하던 것에서
프로젝트 선택한 뒤 오른쪽 탭에서 Build Phases -> 오른쪽 바들 가운데 Link Binary with Libraries를 열고 +를 눌러 추가.
사용자 삽입 이미지
Creative Commons License
2011/04/01 16:11 2011/04/01 16:11

Xcode 4 업데이트

from 학습/iOS 2011/03/10 16:38
사용자 삽입 이미지


새벽에 iOS 4.3이 공개됐다. 업데이트 하고 보니 Xcode 4도 공개됐다.

그래서 업데이트

사용자 삽입 이미지


아. 이런 Xcode 3.x와 달라진 게 좀 있다. 공부할 땐 아무리 간단한 변경이라도 머리아픈 경우가 있을텐데..

뭐 잘 되겠지 ㅋ



으악... Instruments 연동 테스트하는 거 모르겠다 ;ㅁ;


찾았다.. 실행 버튼 누르고 나오는 메뉴에 숨겨져있군.

사용자 삽입 이미지

Creative Commons License
2011/03/10 16:38 2011/03/10 16:38

Xcode 4 UNIVERSAL...

from 학습/iOS 2011/03/10 16:03

샘플코드에선 각각 사이즈를 지정해줬는데, 걍 화면 크기 구해서 알아서 들어가게 해본 것.

게다가 Xcode 4로 가면서 기기별로 나눠져있던 부분이 하나로 합쳐져서 정리되어있으므로 각각 상속해서 오버라이드 각각 해주기 싫음 이렇게 해줄 필요가 있을지도. 너무나 당연(?)하지만.. 뭐 배울때 따로 배운걸 워쩌겠..ㅋㅋㅋㅋ


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    // Override point for customization after application launch.

    CGRect viewBound=[[UIScreen mainScreen]bounds]; //메인 화면 사이즈 구하기

    

    

    _viewCtl=[[LocationEx alloc] init];

    [_viewCtl.view setFrame:CGRectMake(0, 20, viewBound.size.width, viewBound.size.height)];

    [_window addSubview:_viewCtl.view];

    [_window makeKeyAndVisible];

    return YES;

}


틀림 할 수 없지 뭐. 케세라세라.

Creative Commons License
2011/03/10 16:03 2011/03/10 16:03

카메라와 앨범

from 학습/iOS 2011/02/28 15:56
(1)카메라와 포토 앨범의 이용가능 체크
===================================
카메라와 포토앨범에 액세스하기 전에 이용가능한가 어떤가를 체크한다. 체크하려면 UIImagePickerController클래스의 isSourceTypeAvailable:메소드를 사용한다.  또 포토 앨범은 현죠ㅗㄴ하는 모든 단말에서 이용가능하지만 카메라는 단말에 따라 다르다.

(중략)

소스 타입에는 다음 상수를 지정한다.

(중략)

(2) 이미지 피커의 생성
=====================
카메라 또는 포토 앨범으로 부터 화상을 읽어들이려면 UIIMagePickerCOntroller클래스를 사용한다. alloc으로 메모리를 확보후 init메소드로 생성한다. 주요 프로퍼티는 다음과 같다.
소스 타입은 표 6-1-1과 같다.

(중략)

델리게이트 형의 [id<UINavigationControllerDelegate, UIImagePickerControllerDelegate>]는 델리게이트로 지정한 오브젝트가 UINavigationControllerDelegate 프로토콜과 UIImagePickerControllerDelegate 프로토콜의 양방을 구현할 필요가 있음을 나타낸다. 구현 해야할 프로토콜이 2개 존재하는 것에는 이미지 피커가 네비게이션을 계승하고 있기 때문이다.


(3) 내비게이션의 델리게이트
===========================
내비게이션의 이벤트 통지 타겟에는 UINavigationControllerDelegate 프로토콜을 구현한 오브젝트를 지정한다.
UINaviationControllerDelegate 프로토콜을 가진 메소드는 다음과 같다.

(중략)

이번은 UINavigationControllerDelegate 프로토콜의 구현 선언만 한다. UINavigationControllerDelegate 프로토콜의 메소드는 모든 옵션 메소드로 이번에는 처리할 필요는 없으므로 메소드를 구현하진 않고 있다.

(4) 이미지 피커의 델리게이트
============================
이미지 피커의 이벤트 통지타겟에는 UIImagePickerControllerDelegate 프로토콜을 구현한 오브젝트를 지정한다. UIImagePickerControllerDelegate 프로토콜을 가진 메소드는 다음과 같다.

(중략)

미디어 정보로부터 이미지를 취득하려면 키[UIImagePickerControllerOriginalImage]의 값을 취득한다.

UIImage* image=[info objcetForKey:UIImagePickerControllerOriginalImage];

(중략)

(5) 뷰 콘트롤러의 뷰 열기
========================
뷰 콘트롤러의 뷰를 열기위해선 UIViewCOntroller 클래스의 presentModalViewController:aniated:메소드를 호출한다. 이번에는 이미지 피커를 열고있다.

(중략)

(6) 뷰 콘트롤러의 뷰 닫기
=======================
뷰 콘트롤러의 뷰를 닫기위해서는 UIViewController클래스의 dismissModalViewControllerAnimated:메소드를 호출한다. 이번에는 이미지 피커를 닫는다.

(중략)

(7) 이미지를 포토 앨범에 쓰기
===============================
이미지를 포토앨범에 써넣기를 실행하려면 UIImageWriteToSavedPhotosAlbum 함수를 이용한다.

(중략)

SEL은 메소드 참조를 가지는 형으로 [@selector(메소드명)]에 통지 타겟의 메소드명을 지정한다. 통지 타겟의 메소드의 서식은 다음과 같다. 인수의 형과 순서가 같은 메소드라면 메소드 명은 자유로이 지정할 수 있다.

(중략)

이 프로그램에서는 CameraEx오브젝트 자신의 finishExport:메소드를 통지 타겟으로서 지정하고 있다.

@selector(finishExport:didFinishSavignWithError:contextInfo:)

Creative Commons License
2011/02/28 15:56 2011/02/28 15:56

HTTP통신

from 학습/iOS 2011/02/24 16:30
(1) GET에 의한 HTTP통신
========================
HTTP통신을 하려면 처음 NSURLRequest오브젝트를 생성한다. 타임아웃(디폴트 4분)을 설정하지 않은 때는 RequestWithURL:메소드, 타임아웃을 설정한 때는 requestWithURL:cachePolicy:timeoutInterval:메소드를 사용한다.

(중략)

캐쉬 폴리시에는 NSURLRequestUseProtocolCachePolicy(프로토콜 폴리시를 이용)을 설정한다. 타임아웃 시간은 초단위로 설정한다.
URL에는 NSURL오브젝트를 넘긴다. NSURL오브젝트는 NSURL클래스의 URLWithString메소드를 생성한다.

(중략)

다음으로 NSURLConnection클래스의 connectionWithRequest:delegate:메소드로 HTTP통신을 개시한다.

(중략)
여기서 지정한 델리게이트에 대해서 수신 데이터와 통신 결과의 통지를 한다. 이 프로그램에서는 HttpEx 오브젝트 자신을 델리게이트로 지정한다.


(2) NSURLConnection 델리게이트
================================
NSURLConnection 델리게이트를 가진 메소드는 다음과 같다.

(중략)


이 프로그램에서는 HTTP통신의 개시시에 NSMutableData오브젝트를 생성해, 데이터 수신시에 NSMutableData 오브젝트에 데이터를 추가해 HTTP통신의 성공시에 수신 데이터를 문자열로 변환해 텍스트 필드에 대입한다. HTTP통신 실패시에는 "통신에러" 문자열을 텍스트 필드에 대입한다.

(3) 가변 길이 바이트 배열
=======================
NSMutableData클래스는 길이가 가변하는 바이트 배열 클래스다. 생성시에는 data메소드를 사용한다.

(중략)

바이트 배열을 추가할 때는 appendData:메소드를 사용한다.


(중략)


(4) 인디케이터
==============
현재 통신중인 것을 나타내기 위해 빙글빙글 도는 인디케이터를 표시한다. 4장[4-6 WEB뷰]에서는 타이틀 바에 표시했지만 이번에는 뷰 상에 배치한다.

(그림 생략)

인디케이터를 생성하려면 UIActivityIndicatorView 클래스를 사용한다. alloc으로 메모리 확부  후 init메소드로 생성한다. 인디케이터의 주요 프로퍼티는 다음과 같다.


(중략)

인디케이터 스타일에는 다음과 같은 상수를 지정한다. 이번에는 희고 큼을 지정했다.

(중략)

hidesWhenStopped 프로퍼티에 YES를 대입하는 것으로 인디케이터의 애니메이션 정지시에 표시하지 않게 된다.
인디케이터의 애니메이션을 개시시키려면 startAnimating메소드, 정지시키려면 stopAnimating 메소드를 사용한다.

(후략)



==============================
[컬럼] POST에 의한 HTTP 통신
==============================
POST에 의한 HTTP통신을 하려면 setHTTPMethod:메소드에서 "POST"를 지정해 setHTTPBody:메소드에 업로드 하는 송신데이터를 지정한다.

(중략)

구체적으로는 다음과 같이 기술한다.

//POST에 의한 HTTP통신
-(void)http2data:(NSString*)url delegate:(id)delegate body:(NSData*)body {
     NSMutableURLRequest* request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
     [request setHTTPMethod:@"POST"];
     [request setHTTPBody:body];
     [NSURLCOnnection connectionWithRequest:request delegate:delegate];
}

또, HTTPBody를 지정하면 타임아웃의 초수 지정이 반영되지 않고 4분이 됩니다. 타임아웃 하고 싶은 경우는 외부 타이머를 사용해 NSURLConnection오브젝트의 cancel메소드를 불러 명시적으로 정지할 필요가 있습니다.

(후략)



Creative Commons License
2011/02/24 16:30 2011/02/24 16:30

프리퍼런스 저장

from 학습/iOS 2011/02/22 16:22
(1) 프리퍼런스 저장
==================
프리퍼런스 저장을 하려면 NSUserDefaults오브젝트를 사용한다. NSUserDefaults클래스의 standardUserDefaults메소드에서 NSUserDefaults오브젝트를 취득한다.

(중략)

NSUserDefaults오브젝트에 키와 값의 조합으로 저장하는 정보를 지정한다. 값의 형에 따라 이용할 메소드가 달라진다.

(중략)

마지막에 synchronize메소드를 불러 지정한 값이 저장된다.

(중략)

이번에는 텍스트 필드의 텍스트를 저장한다. NSString형 등의 오브젝트형의 값은 setObject:메소드로 지정한다.

NSUserDefault* pref=[NSUderDefaults standardUserDefaults];
[pref setObject:_textField.text forKey:@"text"];
[pref syncronize];

(2)프리퍼런스 읽어오기
=====================
프리퍼런스의 읽어오기를 하려면 NSUserDefaults오브젝트를 이용한다. 취득 메소드의 인수에 키를 지정하는 것으로 값을 얻을 수 있다. 값의 형에 따라 이용할 메소드가 달라진다.

(중략)

이번에는 stringForKey:메소드로 문자열을 취득하고 있다. 보존하고있는 값이 없으면 nil이 반환된다.

NSUserDefaults* pref=[NSUserDefaults standardUserDefaults];
_textField.text=[pref stringForKey:@"text"];

Creative Commons License
2011/02/22 16:22 2011/02/22 16:22
(1) 문자열 바이트 배열 변환
=========================
문자열을 바이트 배열로 변환하려면 NSStirng 클래스의 dataUsingEncoding:메소드를 사용한다. NSData오브젝트는 byte배열을 가진 오브젝트다.

(중략)

인코딩에 지정한 주요 상수는 다음과 같다.

인코딩에 지정하는 주요 상수       의미
NSUTF8StringEncoding              UTF-8
NSShiftJISStringEncoding           Shift-JIS
NSJapaneseEUCStringEncoding EUC-JP
표 5.-1-1 인코딩에 지정하는 주요 상수


문자열의 바이트 배열 변환 메소드를 한데모으면 다음과 같이 된다.

-(NSData*)str2data:(NSStirng*)str{
     return [str dataUsingEncoding:NSUTF8StringEncoding];
}

(2) 바이트 배열 문자열 변환
=========================
바이트 배열을 문자열로 변환하려면 NSString 클래스의 initWithData:encoding:메소드를 사용한다.

(중략)

인코딩에 지정된 상수는 표 5-1-1과 같다. 바이트 배열의 문자열 변환을 메소드로 한데 모으면 다음과 같이 된다.

-(NSStirng*)data2str:(NSData*)data{
     return [[[NSStirng alloc] initWithData:data
          encoding:NSUTF8StringEncoding] autorelease];
}


(3) 바이트 배열의 저장
=====================
바이트 배열을 파일로 저장하려면 NSData클래스의 writeToFile:atomically:atomically:메소드를 사용한다.

(중략)

저장타겟의 패스를 생성하려면 NSHomeDiectiry 함수에서 iPhone/iPad 앱의 홈폴더를 취득해, stringByAppendingPathComponent:메소드에서 :Documents"와 파일명을 추가한다.
tmp폴더에 저장할 때는 "Documents" 대신 "tmp"를 지정한다.

(중략)

문자열 추가시에 stringByAppendigPathComponent:메소드를 쓰면 패스의 세퍼레이터"/"가 자동으로 부가된다.

path=[@"/tmp"  stringByAppendigPathComponent:@"test.txt"]; //->@"/tmp/test.txt"
path=[@"/tmp/" stringByAppendigPathComponent:@"test.txt"]; //->@"/tmp/test.txt"
path=[@"/"       stringByAppendigPathComponent:@"test.txt"]; //->@"/test.txt"
path=[@""         stringByAppendigPathComponent:@"test.txt"]; //->@"test.txt"

바이트 배열의 저장을 메소드에 모으면 다음과 같이 된다.

-(BOOL)data2file:(NSData*)data fileName:(NSString*)filename {
     NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
     path=[path stringByAppendigPathComponent:fileName];
     return [data writeToFile:path atomically:YES];
}


(4) 바이트 배열의 불러오기
========================
바이트 배열을 파일로부터 불러오려면 NSData 클래스 dataWithContentsOfFile: 메소드를 사용한다

(중략)

불러들일 타겟 패스를 생성하려면 NSHomeDirectory 함수로 iPhone/iPad 앱의 홈 폴더를 취득해 stringByAppendigPathComponent:메소드로 "Documents"와 파일명을 추가한다. tmp폴더로부터 불러올 때는 "Documents"대신 "tmp"를 지정한다.
바이트 배열 읽어오기를 메소드에 모으면 다음과 같이 된다.

-(NSData*)file2data:(NSString*)fileName {
    NSString* path=[NSHomeDirectory() stringByAppendigPathComponent:@"Documents"];
    path=[path stringByAppendignPathComponent:fileName];
    return [NSData dataWithContentsOfFile:path];
}






----------------------

Constants

NSASCIIStringEncoding

Strict 7-bit ASCII encoding within 8-bit chars; ASCII values 0…127 only.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSNEXTSTEPStringEncoding

8-bit ASCII encoding with NEXTSTEP extensions.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSJapaneseEUCStringEncoding

8-bit EUC encoding for Japanese text.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSUTF8StringEncoding

An 8-bit representation of Unicode characters, suitable for transmission or storage by ASCII-based systems.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSISOLatin1StringEncoding

8-bit ISO Latin 1 encoding.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSSymbolStringEncoding

8-bit Adobe Symbol encoding vector.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSNonLossyASCIIStringEncoding

7-bit verbose ASCII to represent all Unicode characters.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSShiftJISStringEncoding

8-bit Shift-JIS encoding for Japanese text.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSISOLatin2StringEncoding

8-bit ISO Latin 2 encoding.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSUnicodeStringEncoding

The canonical Unicode encoding for string objects.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSWindowsCP1251StringEncoding

Microsoft Windows codepage 1251, encoding Cyrillic characters; equivalent to AdobeStandardCyrillic font encoding.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSWindowsCP1252StringEncoding

Microsoft Windows codepage 1252; equivalent to WinLatin1.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSWindowsCP1253StringEncoding

Microsoft Windows codepage 1253, encoding Greek characters.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSWindowsCP1254StringEncoding

Microsoft Windows codepage 1254, encoding Turkish characters.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSWindowsCP1250StringEncoding

Microsoft Windows codepage 1250; equivalent to WinLatin2.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSISO2022JPStringEncoding

ISO 2022 Japanese encoding for email.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSMacOSRomanStringEncoding

Classic Macintosh Roman encoding.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSUTF16StringEncoding

An alias for NSUnicodeStringEncoding.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSUTF16BigEndianStringEncoding

NSUTF16StringEncoding encoding with explicit endianness specified.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSUTF16LittleEndianStringEncoding

NSUTF16StringEncoding encoding with explicit endianness specified.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSUTF32StringEncoding

32-bit UTF encoding.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSUTF32BigEndianStringEncoding

NSUTF32StringEncoding encoding with explicit endianness specified.

Available in iOS 2.0 and later.

Declared in NSString.h.

NSUTF32LittleEndianStringEncoding

NSUTF32StringEncoding encoding with explicit endianness specified.

Available in iOS 2.0 and later.

Declared in NSString.h.

====================================
[컬럼] 리소스로부터 바이트 배열 읽어오기
====================================

리소스로부터 이미지를 읽어오려면 UIImage의 imageNamed:메소드를 사용하지만, 바이트 배열을 읽어오려면 NSData클래스의 dataWithContentsOfFile:메소드를 사용한다.

(중략)


읽을 위치의 패스로 리소스의 패스를 지정할 때는 NSBundle클래스의 mainBundle메소드에서 NSBundle오브젝트를 취득해 pathForResource:ofType:메소드에서 패스를 생성해 이용한다


(중략)


pathForResource:ofType:메소드의 인수에는 파일명이 "test.txt"일 때의 파일명에 "test"와 확장자에 "txt", 아니면 파일명에 "test.txt"와 확장자에 ""를 지정한다. 리소스로부터 바이트 배열을 읽어오는 메소드로 정리하면 다음과 같다.

-(NSData*)res2data:(NSString*)res {
     NSString* file=[[NSBundle mainBundle] pathrForResource:res ofType:@""];
     return [NSData dataWithContentsOfFile:file];
}

Creative Commons License
2011/02/22 12:25 2011/02/22 12:25

폰트 패밀리 명 취득

from 학습/iOS 2011/02/21 14:04
(1) 폰트 패밀리명 취득
=======================
단말에서 사용가능한 폰트 패밀리명을 취득하려면 UIFont 클래스의 familyNames 메소드를 사용한다.

(중략)

(2) NSArray 오브젝트의 소트
==========================
NSArray 오브젝트의 소트를 하려면 NSArray 클래스의 sortedArrayUsingSelector:메소드를 사용한다.

(중략)

comparator에는 비교용 메소드를 지정한다. 이 프로그램에서는 NSString 클래스의 compare:메소드를 지정했다.

(중략)

반환값은 다음의 상수가 반환된다. 이것으로 ABC순으로 소트 된다.

compare:메소드 반환값       의미
NSOrderedAscending(-1)    전
NSOrderedSame(0)             같음
NSOrderedDescending(1)    후
표 4-9-1 compare:메소드의 반환값

(3) 폰트명의 취득
================
폰트 패밀리명으로부터 그 패밀리에 속한 폰트명을 취득하려면 UIFont클래스의 fontNamesForFamilyNmae:메소드를 사용한다.

(중략)

(4) 피커뷰의 생성
=================
피커뷰를 생성하려면 UIPickerView클래스를 사용한다. alloc으로 메모리를 확보 후 init메소드로 생성한다. 주요 프로퍼티는 다음과 같다.

(중략)

(5)피커뷰의 델리게이트
=====================
피커 뷰의 이벤트 통지 타겟에는 UIPickerViewDelegate 프로토콜을 구현한 오브젝트를 지정한다. UIPickerViewDelegate 프로토콜의 소유주인 메소드는 다음과 같다.

(중략)

이프로그램에서는 행의 높이로 30을 반환한다. 셀의 생성에서는 UIView오브젝트를 생성해 그것에 레이블을 추가해 반한한다. UIView오브젝트는 alloc으로 메모리 확보후 initWithFrame:메소드로 생성한다.

(후략)
Creative Commons License
2011/02/21 14:04 2011/02/21 14:04