System.out.println("Hello, World");

자바 기술군
- JavaMe(Micro Edition)-핸드폰, 카드 등
-JavaSE(Standard Edition)-데스크톱
-JavaEE(Enterprise Edition)-기업, 웹, 프레임워크

JRE(Java Runtime Enviorment) 자바 실행환경
┖── JVM(Java Virtual Machine) -소프트웨어적으로 O/S나 H/W를 구현, 자바 프로그램을 실행시키는 플랫폼
┖── API(Abstract Programming Interface)미리 만들어 놓은 코드(미리 만들어서 쓰기 쉽고 자주 사용된다.)

Java의 특징
1. 플랫폼(OS와 HW) 독립적 - WORA(Wirte Once Run Anywhere)
2. 객체지향언어 OOP (Object Orated Programming Language)
 


<인터프리터와 컴파일러 비교>
컴파일러의 경우, 프로그램을 컴파일 하기 위해서는 모든 프로그램 소스를 가지고 한꺼번에 번역을 해서 목적코드를 제작한다. 반면에 인터프리어의 경우 필요한 부분을 행(Line 보통 ;로 구분되는 단위)단위 구문으로 번역을 하여 바로 실행시킨다.

이와 같은 특징 때문에 컴파일러의 경우 한꺼번에 모든 부분을 번역해야 하기에 번역속도가 느린편이라 할 수 있다. 반면에 인터프리터는 필요한 부분만 컴파일(번역)을 하기 때문에 하나 하나를 컴파일 하는 속도가 빠르다고 할 수 있다.

대신에 프로그램을 실행하면서 컴파일을 동시에 수행하기에 프로그램을 구동하는 시간은 오래 걸리는 편이다.


[자바는 인터프리터 방식]
 SRC -사람    -> High leve 언어
  ┖──file명 : java  예)Helloworld.java
  │
  │
  │     컴파일 : javac  file명.java
  │     예)javac Helloworld.java
  │  
  │
  class file 생성 -> bvte code(기계어가 아니고, JVM이 이해하는 언어)
  실행 : java class파일명   예)java HelloWorld
  실행시점(RunTime)->JVM
  1. class loading->class파일을 메모리에 올리는 작업
  2. 실행-> 인터프리터 방식, 실행, 구문 단위로 기계어로 변경후 실행
 

Posted by 김마농
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    /// 윈도우 클래스 등록
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "D3D Tutorial", NULL };
    RegisterClassEx( &wc );

    /// 윈도우 생성
    HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice", 
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

    /// Direct3D 초기화
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    { 
        /// 윈도우 출력
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );

        /// 메시지 루프
        MSG msg; 
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }

    /// 등록된 클래스 소거
    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
}

 


1. RegisterClassEx()로 생성하고자 하는 윈도우의 클래스를 등록한다.
2. CreateWindow()로 윈도우를 생성한다.
3. InitD3D() 함수에서 Direct3D를 초기화한다.
4. ShowWindow(), UpdateWindow()로 윈도우를 화면에 표시한다.
5. GetMessage(), TranslateMessage(), DispatchMessage()로 이루어진 메시지 루프를 수행한다.
6. 메시지 루프를 빠져나올경우 초기화한 Direct3D를 메모리에서 해제한다.
7. 프로그램을 종료한다.

대부분의 DirectX인터페이스는 초기화 시점에서 윈도우의 핸들(HWND)을 필요로 한다. 그렇기 떄문에 CreateWindow()로 윈도우를 생성한 다음 InitD3D()를 호출하고 있다. 그리고 프로그램이 종료된 다음에 생성한 Direct3D 인터페이슬ㄹ 메모리에서 해제하기 위해 메시지 루프 이후에 CelanUp() 함수를 호출 하고 있다. 이 순서 역시 상당히 중요하다. WM_CLOSE나 WM_DESTORY 등의 메시지에서 Direct3D를 해제할 경우 메시지 루프에서 문제가 생길 수 있다. 


InitD3D()함수
 * Direct3D 초기화
 *------------------------------------------------------------------------------
 */
HRESULT InitD3D( HWND hWnd )
{
    /// 디바이스를 생성하기위한 D3D객체 생성
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp;                /// 디바이스 생성을 위한 구조체
    ZeroMemory( &d3dpp, sizeof(d3dpp) );        /// 반드시 ZeroMemory()함수로 미리 구조체를 깨끗이 지워야 한다.
    d3dpp.Windowed = TRUE;                      /// 창모드로 생성
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   /// 가장 효율적인 SWAP효과
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    /// 현재 바탕화면 모드에 맞춰서 후면버퍼를 생성

    /// 디바이스를 다음과 같은 설정으로 생성한다.
    /// 1. 디폴트 비디오카드를 사용(대부분은 비디오카드가 1개 이다.)
    /// 2. HAL디바이스를 생성한다.(HW가속장치를 사용하겠다는 의미)
    /// 3. 정점처리는 모든 카드에서 지원하는 SW처리로 생성한다.(HW로 생성할경우 더욱 높은 성능을 낸다.)
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    /// 디바이스 상태정보를 처리할경우 여기에서 한다.

    return S_OK;


그리기 함수(Render() 함수)
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    /// 후면버퍼를 파란색(0,0,255)으로 지운다.
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
    
    /// 렌더링 시작
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        /// 실제 렌더링 명령들이 나열될 곳
    
        /// 렌더링 종료
        g_pd3dDevice->EndScene();
    }

    /// 후면버퍼를 보이는 화면으로!
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

Render()함수의 알고리즘
1. 먼저 화면을 깨끗이 지운다(Clear())
2. 이제부터 폴리곤을 그리겠다고 D3D에게 알린다.(BeginScene())
3. 폴리곤을 다 그렸다고 D3D에게 알린다.(EndScene())
4. 화면에 나타나게 한다.(Present())

-인터페이스를 메모리에서 해제하기
VOID Cleanup()
{
    if( g_pd3dDevice != NULL) 
        g_pd3dDevice->Release();

    if( g_pD3D != NULL)
        g_pD3D->Release();
}
디바이스(g_pd3dDevice)는 D3D 인터페이스보다 나중에 생성되었다. 해제할때는 반드시 생성 순서의 역순으로 해제해줘야 한다. 그것만 주의하면 된다.

<생성화면>
 


Posted by 김마농
카드 뒷면과 3장의 카드들



카드게임을 시작하게 되면 카드는 모두 뒤집은 상태에서 시작하게 된다. 그리하여 뒤집힌 카드를 먼저 구현하기로 한다.

아까와 똑같이 카드뒷면을 변수로 추가해주고, 이미지 정보를 불러온다.


public class CardKingView extends View {

Bitmap m_BackGroundImage;

Bitmap m_Card_BackSide;


public CardKingView(Context context) {

super(context);

m_BackGroundImage = BitmapFactory.decodeResource(getResources(),R.drawable.background,null); m_Card_BackSide = BitmapFactory.decodeResource(getResources(), R.drawable.backside,null);

}

public void onDraw(Canvas canvas)

{

canvas.drawBitmap(m_BackGroundImage, 0,0,null);

}

}

이제 카드 이미지를 4x3으로 깔도록 한다. 

public void onDraw(Canvas canvas)

{

canvas.drawBitmap(m_BackGroundImage, 0,0,null);

for(int y=0; y<2; y++){

for(int x=0; x<3; x++)

{

canvas.drawBitmap(m_Card_BackSide, 60+x*120, 280+y*170,null);

}

}

}



만약 카드 이미지를 띄웠는데 해상도가 맞지않아 카드들이 서로 겹치게 출력된다면 60+x*120, 280+y*170
이부분에 있는 수식들을 조금씩 바꿔가면서 위치를 맞추도록 한다.

뒤집한 카드의 위치 표 

 Y값 X값 m_Card_BackSide를 그리는 위치 
0 (60+X*12, 280+Y*160) = (60 , 280) 
0 1 (60+X*12, 280+Y*160) = (72 , 280)    
0 2 (60+X*12, 280+Y*160) = (84 , 280) 
 1  0 (60+X*12, 280+Y*160) = (60 , 440) 
 1  1 (60+X*12, 280+Y*160) = (72 , 440) 
 1  2 (60+X*12, 280+Y*160) = (84 , 440)   

 

Posted by 김마농