tinyxml 문제점??

Programing/etc 2013. 1. 8. 19:33 |

tinyxml을 이용해서 안드로이드 게임 개발 중인데

 

윈도우 환경에서는 xml로딩 문제가 전혀 없었다

 

하지만 안드로이드 환경에서는 가끔씩 파일을 로드 할수 없는 경우가 생겼다.

 

그래서 찾아보니 좋은 글이 있어서 적용 해봤는데 결과는 지켜보면 알듯!!

 

xml데이터 자체가 딱 <?로 시작하지 않고 \r이나 \n이 포함 되는 경우가 생겨서 문제가 생길수 있다는 글이였다.

 

std::string temp = (char*)pData;

 int startidx = temp.find("<?");
 temp = temp.substr(startidx, temp.length());

 Parse( temp.c_str() );

 

제발 문제 발생 안했음 좋겠다.

 

참고 블로그 : http://blog.naver.com/superchangho?Redirect=Log&logNo=70130447378

'Programing > etc' 카테고리의 다른 글

$'\r': command not found  (0) 2014.04.02
addr2line 사용법  (0) 2014.03.25
킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
Posted by 부우산사나이
:

정리하기 귀찮아 나중에 다시 ㅎㅎ

Posted by 부우산사나이
:

코코스 투디에서 자바랑 jni통신을 해야 할 경우가 많다.

 

모 코코스엔진이 편의성을 잘 지원 하니 그냥 쉽게 통신할 수 있다.

 

우선

 

JniHelper.h 헤더 파일을 인쿠르드 하면 된다.

 

그러고 나면 jni.h 파일을 찾을 수 없다고 뜨는데 그때는

 

Program Files\Java\jdk1.7.0_05\include 을 포함 디렉토리에 추가 시켜주면 해결이 된다.

 

아래 소스는 ccimage에 있는 내용

 

JniMethodInfo methodInfo;
        if (! JniHelper::getStaticMethodInfo(methodInfo, "org/cocos2dx/lib/Cocos2dxBitmap", "createTextBitmap"
            "(Ljava/lang/String;Ljava/lang/String;IIII)V"))
        {
            CCLOG("%s %d: error to get methodInfo", __FILE__, __LINE__);
            return false;
        }
  
        jstring jstrText =javaNewStringChar(methodInfo.env,text);
  //jstring jstrText = new
        jstring jstrFont = methodInfo.env->NewStringUTF(pFontName);

        methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, jstrText,
            jstrFont, (int)fontSize, eAlignMask, nWidth, nHeight);

        methodInfo.env->DeleteLocalRef(jstrText);
        methodInfo.env->DeleteLocalRef(jstrFont);
        methodInfo.env->DeleteLocalRef(methodInfo.classID);

 

"org/cocos2dx/lib/Cocos2dxBitmap" 해당 클래스의 경로를 지정한다

"createTextBitmap" 실행 시킬 함수명을 지정 해준다.

"(Ljava/lang/String;Ljava/lang/String;IIII)V" 함수의 인자값을 지정해준다.

인자값 지정해주는 형식은 인터넷 검색을 하면 자세히 나오니 일단 설명은 생략

모 간단하게 이야기하면 c언어로 변환하면 string,string,int,int,int,int  이정도가 된다.

 

CallStaticVoidMethod(클래스,함수명,string,string,int,int,int,int )이 함수를 사용해서 자바에 있는 함수를 실행 할수 있다.

 

 

Posted by 부우산사나이
:

스크롤바 구현하다가 다른 페이지 화면을 현재 페이지에 띄우게 됐는데

 

다른 페이지부분을 현재 페이지 일정 영역에만 그리기 위해서 다른 페이지 부분을 클리핑 해야 겠다고 생각하고

 

찾아보니 역시나 있다.!!

 

해당 클래스에서  ccNode을 상속 받고 visit()함수를 오버라이딩해주고 아래와 같이 셋팅해주면 클리핑이 된다.

 

 

void 해당클래스네임::visit()
{
glPushMatrix();
glEnable(GL_SCISSOR_TEST);
CCEGLView::sharedOpenGLView().setScissorInPoints( x, y , width, height);
CCNode::visit();
glDisable(GL_SCISSOR_TEST);
glPopMatrix();
}
Posted by 부우산사나이
:

 

출처 :  http://tatis3.springnote.com/pages/4160233

Wrapping을 이용해 C#에서 Native C++ 프로젝트 사용하기

Lib 프로젝트 생성

Native C++에 해당하며, 실제 프로그램 로직등은 이곳에 속해있다.

간단하게 Framework 클래스를 만들어보자.

  1. class CFramework
    {
    public:
    void Create( HWND hwnd )
    {
    // 핸들을 받아 D3D 디바이스 생성
    }
    };

DLL 프로젝트 생성

프로젝트 속성에서 공용 언어 런타임 지원을(/clr) 설정해준다.

위에 작성한 프로젝트를 빌드 후 나오는 Lib 파일을 불러오고, 헤더를 추가해준다.

랩핑 클래스를 작성하고, 랩핑할 클래스의 객체를 선언 후 사용하면 된다.

밑의 코드에서 CFramework의 Create함수를 랩핑하고 있다.

  1. // 엔진의 정적 라이브러리
    #ifdef _DEBUG
    #pragma comment ( lib, "Engine_d.lib" )
    #else
    #pragma comment ( lib, "Engine.lib")
    #endif

    // 랩핑 클래스 구현
    #pragma once
    #include "Framework.h" // 랩핑할 Native C++ 클래스 헤더를 참조

    using namespace System;
    namespace CWrapper {

    public ref class CFrameworkWrapper
    {
    public:
    CFrameworkWrapper();
    ~CFrameworkWrapper();

    public:
    void Create( IntPtr hWnd )
    {
    m_hHwnd = (HWND)hWnd.ToInt32();

    m_pFrameWork = new CFramework();
    m_pFrameWork->Run( m_hHwnd );
    }

    protected:
    HWND m_hHwnd;
    CFramework* m_pFrameWork;
    };
    }

C# 프로젝트 생성

C#의 Windows 응용프로그램 프로젝트를 생성해준다.

폼 디자이너에서 적당히 폼을 만들어주고 PictureBox 컨트롤을 배치해준다. 이 컨트롤에 실제 화면이 그려지게 된다.

그 다음 솔루션 탐색기에서 참조 추가를 이용해 위에 작성한 프로젝트의 DLL ( 미리 빌드 해놓자 )을 찾아서 추가해준다.

ref.jpg

ref2.jpg

DLL이 성공적으로 추가 되면, 랩핑 클래스를 사용할수 있게 된다.

랩핑 클래스에서 선언한 네임 스페이스를 선언한 후 랩핑 클래스 객체를 생성하자.

그 다음 Create 함수에 PictureBox 핸들을 인자로 넘겨주면, Native C++쪽의 CFramework에서 이 핸들을 쓸수 있게된다.

정상적으로 작업이 수행되면, Native C++쪽에서 만들어지는 화면이 C#의 PitureBox에 그려지게 된다

  1. using CWrapper;
  2. public partial class Mainform : Form
    {
    private CFrameworkWrapper m_Frameowrk;

    public Mainform()
    {
    InitializeComponent();
    }

    public void InitializeFramework()
    {
    m_Frameowrk = new CFrameworkWrapper();
    m_Frameowrk.Create(pictureBox1.Handle);
    }
    }

 

Posted by 부우산사나이
:

출처 : http://crynut84.tistory.com/42

 

안녕하세요? 맨날맑음 입니다.

WPF나 Silverlight 와는 다르게 Windows Form에는 '로드 완료' 이벤트가 없습니다. Load 이벤트가 제공 되고 있기는 하지만 MSDN에 나온 의미는 '폼이 처음으로 표시되기 전에 발생합니다.' 입니다. 즉 로드 완료가 아니라는 것입니다.

이것이 왜 문제일까?
로드 완료가 아닌 로드중 이벤트만 제공하여 생기는 문제가 있습니다.
예를 들어 프로그램을 시작할 때 폼을 숨기려고 한다고 하면, Hide() 메서드를 호출 해야합니다.
실행 할때 숨기려 했으니 당연히 폼의 생성자에 Hide()를 넣어보지만 전혀 동작 하지 않습니다.
두번째 방법으로 폼의 Load 이벤트 핸들러 안에 Hide()를 넣어봅니다. 역시 동작하지 않네요;
정확하지 는 않지만, MSDN의 설명대로 폼이 아직 표시되기 전이라 Hide()가 먹히지 않는 것 같습니다.
이밖에 Focus()나 몇몇 다른 메서드도 동작하지 않습니다.

어떻게 해결할까?
위의 문제를 해결하려면 '로드완료' 이벤트를 찾아야 하는데 아무리 뒤져보아도 로드완료는 존재하지 않았습니다.
그래서 임시 방편으로 Application.Idle 이벤트를 사용하여 해결 하였습니다. Application.Idle 이벤트는 말그대로 프로그램이 아이들 상태(쉬고 있을때) 발생합니다. 이걸 응용하면, 생성자에서 이벤트를 걸어주고, 이벤트 핸들러에서 이벤트를 빼주는 방법으로 로드 완료된 시점을 잡을 수 있습니다. 물론 엄밀히 말하면 프로그램이 더이상 할 일이 없어 쉬고 있을 시점을 잡아내는 것입니다.

using System;

using System.Windows.Forms;

namespace Sample

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

//Idle이벤트를 걸어준다.

Application.Idle += Application_Idle;

}

void Application_Idle(object sender, EventArgs e)

{

//Idle이벤트를 없앤다.

Application.Idle -= Application_Idle;

this.Hide();

}

}

}


위의 코드에서 Idle 이벤트 핸들러에서 Application.Idle -= Application_Idle; 이벤트를 빼주는 방법으로 프로그램이 처음으로 쉴때(로드완료)를 잡아내는 것입니다. 이렇게 임시 방편이나마 로드 완료 시점을 잡아서 hide() 메서드를 동작시킬 수 있습니다.

'Programing > C#' 카테고리의 다른 글

c#에서 특수문자 또는 공백 걸러내기  (0) 2016.02.16
Posted by 부우산사나이
:

http://www.cocos2d-iphone.org/forum/topic/18522

Posted by 부우산사나이
:

http://soripche.blog.me/30129306355

Posted by 부우산사나이
:

http://blueasa.tistory.com/465

'Programing > etc' 카테고리의 다른 글

addr2line 사용법  (0) 2014.03.25
tinyxml 문제점??  (0) 2013.01.08
obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
xml 장점 단점  (0) 2012.05.21
Posted by 부우산사나이
:

template <class T>

class List

{

class Node

{

public:

Node* after;

Node* before;

T _data;

Node( T data = 0 )

{

after = NULL;

before = NULL;

_data = data;

}

};


Node* top;

Node* bottum;

int size;


public:

class Iter

{

Node* _pos;

friend class List;


public:

Iter( Node* pNode = NULL )

{

_pos = pNode;

}


Iter(const Iter &it)

{

_pos = it._pos;

}


void operator=( Iter it )

{

_pos = it._pos;

}


T operator*()

{

return _pos->_data;

}


T* operator->()

{

return &_pos->_data;

}


const bool operator==(Iter pIter)

{

return _pos == pIter._pos;

}


const bool operator!=(Iter pIter)

{

return _pos != pIter._pos;

}


void operator++(int)

{

if (_pos != NULL)

{

_pos = _pos->after;

}

}


void operator++()

{

if (_pos != NULL)

{

_pos = _pos->after;

}

}

};


List()

{

top = new Node();

bottum = new Node();

size = 0;

top->after = bottum;

bottum->before = top;

}


~List()

{

clean();

delete top;

delete bottum;

}


void clean()

{

Iter iter( begin() ); 

for ( iter; iter != end(); )

{

iter = eraser(iter);

}

}


Iter eraser( Iter pIter )

{

if (size > 0)

{

Node* pPos = pIter._pos;

if ( pPos->before )

pPos->before->after = pPos->after;

if ( pPos->after )

pPos->after->before = pPos->before;


Node* pCurrnet = pPos->after;

delete pPos;

pIter = pCurrnet;

size--;

}

return pIter;

}


Iter end()

{

return Iter(bottum);

}


Iter begin()

{

return Iter(top->after);

}


void push_back( T pData )

{

insert( end(), pData );

}


void insert( Iter pIter, T pData )

{

Node* pNewNode = new Node( pData );

pNewNode->before = pIter._pos->before;

pIter._pos->before->after = pNewNode;

pIter._pos->before = pNewNode;

pNewNode->after = pIter._pos;

size++;

}

};


class jaeho

{

public:

jaeho(int _k =0, float _j = 0.f)

{

k= _k;

j = _j;

}

int k;

float j;

};


void main()

{

List<int> test;


test.push_back(10);

test.push_back(40);

test.push_back(20);

test.push_back(240);


List<int>::Iter iter = test.begin();

  iter++;

test.insert(iter,333);

for (List<int>::Iter iter = test.begin(); iter != test.end(); iter++ )

{

printf("%d\n", *iter );

}


printf("\n");

iter = test.begin();

test.eraser(iter);

for (List<int>::Iter iter = test.begin(); iter != test.end(); ++iter )

{

printf("%d\n", *iter );

}


List<jaeho> test2;


test2.push_back(jaeho(20,41.4f));

test2.push_back(jaeho(220,211.6f));

test2.push_back(jaeho(120,52.4f));


for (List<jaeho>::Iter iter = test2.begin(); iter != test2.end(); iter++ )

{

printf("%d     %f\n", iter->k , iter->j );

}

}


자료구조 다시 환기할 겸 만들어 봤음 


stl에 list의 기능은 다 구현 안했음


기본적인것만 구현


시간 날 때 마다 하나 씩 구현 해봐야 겠다.

'Programing > 자료구조' 카테고리의 다른 글

STL Vector와 List 차이점  (0) 2012.05.21
Big - O 표기법  (0) 2012.05.18
Posted by 부우산사나이
: