2018년 3월 20일 화요일

화면의 일부분만 3D 영역으로 사용하기 위해 Frame Buffer Object 사용하기

2017. 9. 26. 23:46
COCOS 2D-X에서 3D 작업을 할때 전체 화면이 아닌 화면의 일부 구역에 3D Layer를 만들고 싶을때가 있다. 
아래 그림을 보자
화면 상단에는 3D그리기 영역을 두고 하단에는 UI를 배치한 화면이다.

Open GL에서 제공하는 Frame Buffer를 이용해서 새롭게 그리기평면을 만들어서 작업을 한것이다.Frame Buffer가 무엇인지 알고 싶으면 아래 URL의 내용을 보면 된다.cocos2dx를 사용하면 확실히 알고 있을 필요는 없지만 내용을 읽어보고 대략적 이해는 필요할것 같다.
코딩은 아래처럼 하면 된다.아래 소스는 위에 화면처럼 화면을 만드는것을 전반에 대한 것이 아니고 FrameBufferObjet를 만드는 것에 대해서만 포스트 하는것이다. 

다음의 소스는 전부 cocos 3.14 버전에서 작업이 되었다. ( framebuffer나 viewport 관련 내용이 전부 experimental::인것을 보면 추후 바뀔것으로 예상된다.)
일단 3D레이어를 간단하게 만들고 추가한다
m_layer3D = Layer::create(); // 3D 개체를 올릴 레이어 생성 addChild(m_layer3D);

다음은 카메라를 생성하고 Frame Buffer Object를 만들어서 해당 카메라에 붙이는 부분이다.
void HelloWorld::createCameraWithFrameBuffer2() { float width = 400, height = 300; // 화면을 작게 설정했다. _camera2 = Camera::createPerspective(95, width / height, 1, 10000); _camera2->setCameraFlag(CameraFlag::USER2); _camera2->setPosition3D(Vec3(0, 0, 0)); _camera2->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0)); _camera2->retain(); m_layer3D->addChild(_camera2); experimental::Viewport vp; vp._left = 0; vp._bottom = 0; vp._width = 1; vp._height = 1; _camera2->setViewport(vp); auto fbo = experimental::FrameBuffer::create(2, width, height); //render target experimental::RenderTarget* renderTarget = experimental::RenderTarget::create(width, height); fbo->attachRenderTarget(renderTarget); renderTarget->getTexture()->setAliasTexParameters(); //stencil depth auto depth = experimental::RenderTargetDepthStencil::create(width, height); fbo->attachDepthStencilTarget(depth); _camera2->setFrameBufferObject(fbo); // 그리기 평면 텍스쳐, 스프라이트를 만들어서 붙인다 Texture2D* texture = fbo->getRenderTarget()->getTexture(); auto pDraw = Sprite::createWithTexture(texture); pDraw->setFlippedY(true); // 화면이 뒤집혀 있기 때문에 pDraw->setAnchorPoint(Vec2::ZERO); pDraw->setPosition(Vec2(360, 100)); addChild(pDraw); }
순서는 아래와 같다1) 카메라를 생성2) viewport를 생성3) framebuffer 생성4) render target 생성5) stencil depth 생성6) 텍스쳐 생성 ( 위에서 만든 render target 을 가져와서 사용 )7) cocos sprite 개체 생성 및 화면에 붙이기
viewport는 left=0, top=0, width=1, height=1 값으로 생성을 했는데그 이유는 cocos2dx의 cccamera.cpp소스의 applyViewport() 함수를 보면 아래처럼 되어 있기 때문이다
void Camera::applyViewport() { glGetIntegerv(GL_VIEWPORT, _oldViewport); if(nullptr == _fbo) { glViewport(getDefaultViewport()._left, getDefaultViewport()._bottom, getDefaultViewport()._width, getDefaultViewport()._height); } else { // 아래처럼 처리를 하기때문에 glViewport(_viewport._left * _fbo->getWidth(), _viewport._bottom * _fbo->getHeight(), _viewport._width * _fbo->getWidth(), _viewport._height * _fbo->getHeight()); } }
fbo에서 설정한 width와 height를 곱해주고 있는데 viewport의 성격과는 조금 맞지 않게 소스 설계가 된것으로 보인다 사실 fbo에서 설정한 width, height의 적용 부분에서 조금 더 고민이 필요했을것으로 보임, cocos2dx의 framebuffer관련 소스들이 전부 experimental  되어 있는데 이것을 보면 아직 작업이 완료된것같지 않다. 3.20버전 (?)정도에서는 이것이 전부 정식으로 추가되지 않을까 기대해 본다

그리고 작성된 카메라를 보기 위해서  아래처럼 하면 된다.
m_layer3D->setCameraMask((int)CameraFlag::USER2);
만약 cocos2dx 에서 기본적인 3D에 대해 공부를 하려면 코코스설치폴더/tests/cpp-tests 에 있는 프로젝트를 돌려보면 된다. 


위작업을 위해 구글링을 통해서 아래 두개사이트의 내용을 참고했다

대우 MSX2 IQ-2000을 구하다

2017. 8. 9. 12:36

어렸을때 IQ-2000에 대한 환상이 있었다. 

초등학교 4학년때 컴퓨터라는 것이 있는것을 알았고,
6학년때 친구집에가서 Apple의 카라테를 보고 신세계를 알았고
또 다른 친구집에서 MSX(IQ-1000)을 보고 게임의 열망에 빠지게 되었다.
중학교 3학년때 친구집에가서 본 IQ-2000과 거기서 돌아가는 격돌 패넌트 레이스라는 야구 게임은
환상 그 자체 였다.  

물론 집안 사정상 컴퓨터는 고등학교 2학년이 되어서 살 수 있었지만
처음 본 애플 컴퓨터의 이미지로 인해 첫 PC는 MR-128 이었다. 

하지만 IQ2000의 이미지는 살아가는 동안 머리에 항상 남아 있었고 ,
결국 2017년 7월 나에게 IQ2000이 들어 왔다. 

 ( 스크래치도 있고 키보드도 안 눌리는 것이 있지만 86년도에 나온 모델이니 그래도 눈물겹다 ^^ )

기존에 X-II와 TurboR이 있어서 MSX 사용하는데는 문제가 없었지만 그래도 추억은 어쩔수 없는거다. 

서영만님이 만드신 MMCSD V3를 넣고 가동을 했다


 

이번에 IQ-2000을 구하면서 집에 있는 방모에 붙이기 위해서 케이블 만드는것을 해 보았다.

4년전인가 그때는 인두도 엉망이고 플럭스도 없어서 제대로 RGB 케이블을 만들지 못했는데 이번에는 비교적 쉽게 만들수 있었다. ( 심지어 두번째것은 거의 15분만에 완성 ^^ )
역시 플럭스와 인두가 좋아야 한다는것을 느꼈다. 

6학년때 나를 미치게 만들었던 팩맨을 실행시켜 보았다.


 
이 간단한 게임에 그때는 왜 그렇게 열광을 했던가.

다시 추억으로 돌아가서 내가 지금있는 곳에 대해서 생각해 보았다.

그때 만들고 싶었던 게임을 지금 만들었는가 ...

CPM용에서 사용하는 터보파스칼과 초간단 메뉴얼

2017. 8. 9. 12:06

이안님이 이번에 CPM카드를 제작하셨는데요.
제가 보기에는 CPM도 활용하고 , 간단한(?) 코딩을 하기에는 터보파스칼이 좋다는 생각이 듭니다.

어렸을때는(90년대)에 터보파스칼 5.x~6.0을 사용해서 여러가지 게임을 만들었었습니다.
당시 생각으로는 C언어보다 뭔가 부족하지만 교육용으로는 더 좋다고 생각해서 후배들에게도 가르치고 
추천하기도 했었죠 ^^  

이에 CPM카드에서 사용가능한 터보파스칼을 올려 봅니다.
파일은 3개 인데요. 필요한것 사용하시면 됩니다. 
TP2.dsk      : Turbo Pascal 2.0
TP3_56K,dsk : Turbo Pascal 3.01 56K버전
TP3_IIe.dsk  : Turbo Pascal 3.01 63K버전 , IIe 전용입니다. 
2.0과 3.0의 차이는 알겠지만 56K, 63K버전의 차이는 모르겠네요 ^^
 
간단하게 메뉴얼도 만들어 보았습니다.
IBM 버전으로 넘어가면 IDE 환경이 있지만 아직 애플일때는 그런 개념이 없습니다 ^^
어찌보면 IDE라고 부를수 있는 최초의 개발툴이 Turbo Pascal , Turbo C가 아니었나 생각해 봅니다. 
( Integrated Development Environment : 통합 개발 환경 )

일단 해당 dsk를 넣어서 부팅을 하면
a: 프롬프트로 부팅이 됩니다. 
아시는 분들을 알겠지만 cpm dos는 우리에게 익숙한 ms-dos와 기본 명령어가 비슷합니다. 
목록 보시려면 dir치면 되고 , 파스칼실행시키시려면 turbo를 치시면 됩니다. 
(참고로 tinst.com은 키보드 단축키등을 설정해 주는 프로그램입니다)  

turbo를 타이핑해서 실행시키면 
에러메시지를 포함할지 묻는데 , 포함하면 에러가날때 그 내용을 보여줍니다. 
이것에 Yes를 하면 메모리를 조금 더 먹는데 , 그래도 오류를 보여주는것이 편합니다.

다음에는 아래의 내용을 보여주는데 각각 번째 키를 누르면 해당 작업이 실행됩니다.
Work file : 현재 편집중인파일 
Main file : 여러개 파일을 열어 작업할때 메인 실행코드가 들어 있는 파일 지정 (c언어의 경우 main()이 들어 있는 파일 )
Edit : 파일을 지정해서 편집, 확장자 지정을 하지않으면 .pas로 자동 지정
Compile : 해당 파일을 컴파일 시켜본다. 오류가 있으면 표시됨
Run : 해당 파일을 실행, 오류 있으면 표시
Save : 파일 저장 
eXecute : 외부에 있는 파일 실행, .com 파일을 실행시킬때 사용
Dir  : dir 명령어 실행, 엔터를 치면 현재 드라이브 , b: 하고 엔터하면 b: 드라이브
Quit : 종료 
compiler Option : 현재는 메모리상에서 컴파일 하지만 , Com-file 로 바꿔주면 .com 으로 실행파일이 생성됩니다. 


편집 모드로 들어가면 아래 명령어를 이용해서 편집을 합니다.

제일 중요함 명령어는 Ctrl-K-D : 편집기에서 빠져 나와 메뉴로 이동 
 
상하좌우 커서이동 : Ctrl-E, Ctrl-X, Ctrl-S, Ctrl-D

페이지 업/다운 : Ctrl-R, Ctrl-C 

글자단위 좌/우 이동 : Ctrl-A, Ctrl-F

커서자리의 글자 삭제 : Ctrl-G

커서 오른쪽의 단어 삭제 : Ctrl-T 

커서 자리 라인 추가 : Ctrl-N

커서 자리 라인 삭제 : Ctrl-Y

볼랜드 계열 에디터와 초창기 Visual Studio 를 사용했던 분들은 위에서 몇개는 동일하다는 것을 알수 있을 겁니다.

블록 단위 키워드도 동일 한데 
블록 지정 시작 : Ctrl-K-B
블록 지정 끝 : Ctrl-K-K 
블록 카피 : Ctrl-K-C
블록 붙여 넣기 : Ctrl-K-V
블록 삭제 :Ctrl-K-Y 
추억이 방울 방울 이네요 ^^ 

찾기 : Ctrl-K-F

많이 쓰는것은 위와 같은데요. 추가내용은 아래 참고하세요.
bitsavers.informatik.uni-stuttgart.de


간단하게 Hello를 출력하는 소스는 아래와 같습니다.

BEGIN
Writeln('Hello');
END.

이렇게 치시고 Ctrl-K-D로 메뉴 화면으로 나와서 
R을 누르시면 화면에 Hello라고 표시되는 것을 볼수 있습니다. 

참고로 터보 파스칼은 대소문자 구별을 하지 않습니다. 
(나중에 ibm버전에서도 안했던것 같아요 ^^ )

ITMS-90037 The Info.plist file is missing or could not be parsed while app store submittion


2017. 4. 11. 23:10

XCode에서 제품을 앱스토어로 올릴때 다음과 같은 오류가 뜨는 경우

ITMS-90037 The Info.plist file is missing or could not be parsed while app store submittion ....

Info.plist 를 보면 utf-8 포맷이 아니라서 포맷 변경한 뒤에
CFBundleDisplayName 에 한글로 제품명을 적으면 적혀있지만 실제로 쓰레기 글자가 포함된 경우가 있다.


이때는 vi 에디터로 열어서 이상한 글자를 지우고 다시 저장 하면 제대로 빌드가 되고 앱스토어로 올라간다.

[cocos2dx] portrait 로 작업할때 화면 해상도가 작은 경우

2017. 3. 23. 21:03

Portrait로 작업을 할때 요즘은 해상도가 높아 모니터를 넘어가는 경우가 많다.

setFrameZoomFactor() 함수를 이용해서  적절히 조정하면 윈도우즈에서 작업할때 문제가 없다.

AppDelegate.cpp에 setDesignResolutionSize()호출한 뒤 아래처럼 셋팅하면 된다

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) 
    glview->setFrameZoomFactor(0.7f);
#endif

0.7f는 모니터의 크기에 따라 적정하게 셋팅하면 된다.

"APK에 보안 취약점이 있어 악의적 행위 정책을 위반함에 따라 거부되었습니다" 라는 메시지

2016. 8. 25. 14:42

16년 8월 어느날인가부터 구글에 APK를 올리려고하면 아래처럼 오류가 떴다

앱이 거부되었습니다.

APK에 보안 취약점이 있어 악의적 행위 정책을 위반함에 따라 거부되었습니다. 기존 앱의 업데이트를 제출한 경우 이전에 게시된 버전은 Google Play에서 계속 사용할 수 있습니다.

젠장,
나는 악의적행위를 한적도 없고 (악의적행위는 가끔 야동보거나, 애 엄마 몰래 애와 게임하거나 , 술값 내가 계산하는거 ?? ),
아무것도 바꾼것이 없는데, 그럼 뭔가 정책이 바뀐것이겠지.
그런데 사실 아무것도 바꾸지 않아서 이런 문제가 되는것일 거다. 

악의적행위가 어떤 것인지 링크를 보면 꽤 많은 이유가 있지만, 
나에게 해당되는 자세한 내용을 보려면 '출시 전 보고서'를 보면 된다. 

Developer Console의 '출시 전 보고서'를 보니 아래 두가지 내용이 문제 있는것으로 나온다.

가로채기가 가능한 인앱 결제 인텐트

APK 11, 10에서 탐지됨
앱이 잘못 구현된 인앱 결제를 사용하고 있습니다. 자세한 내용은 Google 고객센터의 이 도움말을 참고하세요.
취약한 클래스:
org.cocos2dx.cpp.CSDGoogleStore

OpenSSL

APK 11, 10에서 탐지됨
앱이 보안 취약성 문제를 포함하는 OpenSSL 버전을 사용하고 있습니다. 취약성 수정 마감일 등 자세한 내용은 Google 고객센터의 이 도움말을 참조하세요.

일단 첫번째  오류는 내가 만든 CSDGoogleStore 모듈이 사용하는 결제 모듈이 구버전이니 새버전으로 교체를 하라는 거다.
이 문제에 대해서는 https://github.com/googlesamples/android-play-billing/ 에서 최신 버전을 받아서 패치를 해 주었다. 

두번째는 역시 내가 사용하는 OpenSSL 버전이 구버전이라는 거다.
이부분은 내 시스템에 설치된 OpenSSL을 최신 버전으로 교체하고 
나는 Cocos2d-x를 사용하는데, curl에서 openssl을 참조하기 때문에 이것도 최근 버전으로 교체를 했다.

* cocos2d-x 3.10에서 사용하는 curl 라이브러리는 첨부파일로 올려 두었음. 각각 폴더에 맞게 복사를 할것 
  - include.zip 은 프로젝트 폴더의 \cocos2d\external\curl\include\android 에 넣으면 되고
  - prebuilt.zip 은프로젝트 폴더의 \cocos2d\external\curl\prebuilt\android 에 넣으면 된다

그리고 심사를 다시 넣으면 된다.