반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

$.mobile object



오늘은 단순히 JQM을만이 아니라 Javascript로 동적으로 프로그래밍 하는 부분을 간단히 공부해 보겠습니다.


우선 기본 <html> 소스부터 봅니다.


<!DOCTYPE html>
<html>
<head>
  <meta name=viewport content="user-scalable=no,width=device-width" />
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.css" />
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script src="http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.js"></script>
  <style type=text/css>
    p {
      font-style : italic;
      margin-bottom : 0px;
      text-align : center;
      text-transform : uppercase;
    }
  </style>
</head>

<body>
<div data-role=page id=home>
  <div data-role=header>
    <h1>Home</h1>
  </div>
  <div data-role=content>
  </div>
</div>
</body>

</html>


보면 헤더에 Home 이라는 글자가 있고 content는 있는데 그 안에는 아무런 내용이 없죠.

그리고 body 안에 보면 <p> 태그는 하나도 없는데 위에 <p> 태그에 적용되는 스타일링이 정의 돼 있습니다.


딱 보면 content 부분에 뭘 넣을 건데 거기에 <p> 태그가 들어가나 보네요.

하여간 위의 소스로 html을 만들어서 실행시키면 아래 화면을 보실 수 있습니다.




그럼 이제 자바 스크립트 부분을 볼까요?

이 JavaScript 는  </html> 다음에 붙여 넣습니다.


<script>

var $content = $("[data-role=content]");
var obj = $.mobile;

$content.append ("<p> Properties </p>");
for (var prop in obj)
  if (!$.isFunction (obj[prop])) $content.append (
          "<b>" + prop + "</b>  = " + obj[prop] + "<br />");

$content.append ("<p> Methods </p>");
for (var prop in obj)
  if ($.isFunction (obj[prop])) $content.append (
          "<b>" + prop + "</b>  () " + "<br />");

</script>


불까요? 변수 $content에 data-role=content를 넣었습니다.

그리고 obj라는 변수에는 $.mobile; JQM 함수를 넣었습니다.


그 다음을 보면 $content 에 문자를 append 하죠?

즉 data-role=content에 문자를 append 하는 겁니다.


그리고 $.mobile 에 있는 prop 들을 화면에 출력하는 for 문이 있습니다.


그 다음에는 $content에 Methods 라는 문자를 추가 합니다.


그리고 $.mobile에 있는 메소드들을 출력합니다.


그러면 아래와 같은 화면을 보실 수 있을 겁니다.



화면에 보시는 것들이 바로 $.mobile object에 세팅돼 있는 프로퍼티들 입니다.


저 프로퍼티들과 메소드들을 다 알 필요는 없지만 그래도 자주 쓰이는 것들은 눈에 익어야 될 텐데요.


꾸준히 그리고 많이 Practice를 하는 방법밖에는 없겠죠?



convention01.html


반응형

가끔 시를 보내오는 선배

2012. 9. 22. 22:40 | Posted by 솔웅


반응형

가끔 시를 보내오는 선배가 있어서 너무 좋다......


============= o ============= o =============== o ==============


바람이 몹시도 불던 날

바닷가에 홀로 서 있었다네.

 

누군가 쉼 없이 몰아치는 파도도 실상은

바다 속 깊은 고요 속에서 잉태되었다고 말하지.

 

그럼에도 난 항상 흔들리는 파도에만 시선이 머물고

바다 속 깊이에서 울리는 침묵의 소리에 귀 기울이지 못하고

살아온 날들이 많았음을 새삼 고백하며...

 

그렇게 내 삶을 허락한 곳에 들어가 깊이 잠기면

새 삶을 시작하는 또 다른 나를 만날 수 있을까...

 

오늘은 그 아이를 만나러 다시

바다에 가고 싶다.

 

 


 

바다에 가고 싶다

 

 

바람이 분다

흔들리는 파도처럼

내 부푼 설렘과

두려움 펼쳐놓았던

그리운

나의 바다

 

두 눈 감는다

내 어릴 적 꿈을 잉태하고

삶의 근원 일러주던

그 태초의 고요 속으로

내려가

깊이 잠긴다

 

웃음 짖던 한 아이

나를 바라본다.


반응형

FAQ Wednesday: iPhone 5 와 iOS 6

2012. 9. 21. 11:28 | Posted by 솔웅


반응형
Posted on . Written by


FAQ 시간인 수요일입니다. iOS 6 가 오늘 릴리즈 됐고 아이폰 5 는 금요일에 릴리즈 될 겁니다. 요즘 이슈가 되는 이 두가지의 릴리즈와 관련되서 많이 질문되는 것들을 오늘 다루겠습니다. 아직 Walter가 올린 iPhone 5와 iOS 6를 지원하는 것과 관련된 글을 보지 못하신 분들은 여기를 들러서 먼저 봐 주세요.


1. Will my existing apps working on the new iPhone 5?


예 여러분의 기존 앱은 iPhone 5나 iOS 6로 업데이트 된 디바이스에서도 지금처럼 작동될 겁니다. iPhone 5와 관련된 이슈는 여러분의 unmodified app 이 Retina device (640 X 960) 에서 작동되는 걸로 생각할 거라는 겁니다. iPhone 5는 640 X 1136 입니다. 여러분의 기존 앱은 iPhone 5에서 아래 위가 검정색으로 나타나는 letterbox 모드로 표시 될 겁니다. (아래 위로 길 경우)





2. Do I have to resubmit my app for iPhone 5?


위에서 얘기한 것처럼 여러분의 기존 앱이 iPhone에서 아래위로 검은처리 된 상태로 작동되는게 문제가 없으시다면 굳이 여러분 앱을 iPhone 5로 업그레이드 하실 필요는 없을 겁니다. 여러분이 iPhone 5를 가지고 있지 않더라도 iOS Simulator에서 확인하실 수 있으니 한번 확인해 보세요. 이 iOS 시뮬레이터를 이용하시려면 Xcode 4.5를 다운 받으셔야 한다는 것 알고 계시죠? 만약 여러분의 기존 앱을 iPhone 5용으로 업그레이드 하고 싶으시다면 iOS 6에 맞게 다시 빌드 하셔야 됩니다.


한가지 유념하실 부분이 있는데요. 만약 여러분의 앱이 애플의 GameCenter를 사용한다면 아래 Question #4 를 꼭 읽어 보세요.



3. How can I make my app use the full iPhone 5 screen?


기존의 여러분 앱이 iPhone 5에서 좀 더 잘 보이게 하는 방법이 몇가지 있습니다.


첫번째는 new splash 파일을 여러분의 프로젝트에 추가하는 겁니다 : Default–568@2x.png. 이것은 640 X1136  크기의 이미지 입니다. 이 이미지는 여러분 앱이 iPhone 5 device에서 로딩이 시작될 때 보여질 이미지 입니다. 이 파일은 iOS6에게 여러분의 앱이 full iPhone 5 screen을 지원한다고 통보할 겁니다. ("tall" mode). 그래도 여러분 앱은 letterbox로 보일겁니다. 하지만 status bar는 맨 위에 제위치로 가게 될 겁니다.


display.pixelWidth and display.pixelHeight. 이 API들은 스크린의 실제 가로 세로 값을 보여줄 텐데요. 이 new splash screen을 사용한 후의 화면을 보세요. iOS 6가 Corona에게 이것은 640 X 1136 디바이스라고 얘기합니다. 이 splash screen 이 없으면 그 값은 640 X 960 (iPhone 4 mode)가 표시 될 겁니다.




이 새로운 디폴트 splash file을 추가한 후에 여러분은 display.setDefault API를 사용하실 수 있습니다. 배경색을 넣을 수 있는 겁니다. 이 API로 시꺼먼 letterbox area를 다른 색으로 채우실 수 있습니다.


display.setDefault( "background", 200 )





또 다른 옵션은 배경 이미지를 로드 하는 방법입니다. 이 이미지는 letterbox area 까지 extend 될 겁니다. 여러분 앱이 iPhone 과 iPhone 5만을 타게팅 한다면 이 이미지는 320 X 568 이 될 겁니다. 이 이미지의 y 포지션을 offset 하셔야 이 이미지가 스크린의 맨 위에서부터 시작할 겁니다. y 포지션을 지정하실 때는 display.screenOriginY를 사용하셔야 합니다.


display.newImage( "background568.png", 0, display.screenOriginY )




(저는 스크린에 가득차게 보이도록 이미지 둘레에 yellow/green border를 추가했습니다.)

config.lua file 에서 zoomEven scaling mode를 사용해 보세요. 이 zoomEven은 여러분 앱의 크기를 가로 세로 똑 같은 비율로 화면에 꽉 찰 때까지 늘릴겁니다. iPhone 5의 portrait 모드에서는 여러분 앱이 아래위로 늘어나는 만큼 좌우도 늘어나기 때문에 일부가 화면 밖으로 사라질 겁니다. (아래 screen shot을 보세요.)





위 예제는 dynamic scaling 이 320 X 480 이고 target을 iPhone, iPhone4, iPhone 5 디바이스로 했을 경우를 가정해서 얘기한 겁니다. 만약 안드로이드도 지원할 필요가 있다면 안드로이드 디바이스의 크기도 같이 고려해서 이러한 것들을 정해야 할 겁니다. (최신 CoronaSDK builds는 여러분의 content 가 제대로 표시되도록 도와주는 새로운 시뮬레이터 스크린 사이즈를 제공하고 있습니다.)


4. Why does my GameCenter crash when running on iOS 6?


만약 여러분 앱이 Apple’s GameCenter를 사용한다면 그리고 그 앱이 오직 landscape mode로만 작동이 된다면 그 상황에서 발생하는 bug 가 있습니다. 뭐냐하면 여러분 앱은 landscape 인데 GameCenter의 Sign-on Screen 은 portrait mode로 표시하려고 하기 때문에 충돌이 일어납니다. 이 상황은 여러분 앱을 iOS 6 용으로 빌드하고 그 앱을 iOS 6 device에서 작동할 때 발생합니다.


한 유저가 그 해결책을 Corona의 Forums에 올리셨는데요. content를 landscape로 세팅하고 앱은 landscape와 Portrait 모두를 지원한다고 세팅 해 놓는게 그 해결방법 입니다. 이렇게 하면 GameCenter sign-on 화면은 portrait으로 뜨고 여러분 앱은 landscape 모두에서 작동하도록 할 겁니다. 폰이 rotate 될 때 status bar 도 자동으로 rotate 될 텐데요. 대부분의 게임에서 status bar를 표시하지 않으니까 이 부분은 그리 크게 신경쓰지 않으셔도 될 것 같습니다.

아래 처럼 build.settings 파일에 코딩을 해 넣으시면 됩니다.


orientation =
{
default = "landscapeRight",
content = "landscapeRight",
supported = { "landscapeLeft", "landscapeRight", "portrait" },
},



Note: 이 이슈가 iOS 6에서 빌드하고 iOS6 device에서 앱을 구동시킬때 발생하는 유일한 이슈 입니다. 만약 여러분의 기존 앱이 iOS 5.1용으로 만들었다면 이 부분은 신경 안 쓰셔도 됩니다.


5. Why don’t I see any of my print messages in the Xcode Console?


iOS 6에서 애플은 Lua print message가 보여지지 않거나 internal Corona runtime 에러가 표시되도록 바꾸었습니다. iOS 6 에서는 Xcode Console과 맥 콘솔 앱에 여러분의 iOS 6나 iOS 6 시뮬레이터로부터 더이상 메세지를 받지 않습니다.


build 915에서 코로나 런타임 에러를 메세지로 restore 하도록 바꾸었습니다. 하지만 Lua print API 관련해서는 아직 해결책을 마련하지 못했습니다. 지금으로서는 런타임 에러 메세지는 보일것이지만 print로 출력하는 디버그 메세지는 표시되지 않을 겁니다. print 함수를 임시파일에 저장하도록 redirect 해서 나중에 확인하실 수 있을 겁니다. 이게 좋은 solution은 못 되지만 여러분이 현재로서는 여러분이 device에서 테스팅하면서 디버깅할 때 사용할 수 있는 방법중의 하나입니다.

iOS 6의 변화로 인해서 저희도 맥 시뮬레이터에 에러와 메세지를 표시하는 방법을 바꾸어야 했습니다. 메세지 앞에 date/time 을 추가하는 메세지를 표시하기 위해 지금은 NSLog를 사용합니다. 이 방법이나 혹은 다른 방법으로 iOS 6 print issue를 해결해야만 합니다. 또한 맥 시뮬레이터 콘솔에 어떻게 정보를 출력할 것인지도 영향을 받을것입니다.  또한 우리의 콘솔과 에러메세지를 이용하는 3rd party 코로나 프로그램도 영향을 받을 겁니다. 이 변화의 잇점으로는 이제 맥 콘솔 앱이 코로나 시뮬레이터와 iOS 시뮬레이터 모두로부터 Corona runtime data를 받는다는 것입니다. (조만간 print 도 가능할 겁니다.) 코로나 시뮬레이터와 빌드 메세지를 보기 위해 터미널 윈도우를 ipen 해야 하는 수고를 안해도 되게 됐죠.



That’s it for today’s questions. I hope you enjoyed it and even learned a few things.

반응형

Corona: iOS 6 and Xcode 4.5 are GM!

2012. 9. 21. 05:15 | Posted by 솔웅


반응형
Posted on . Written by



오늘 애플이 공식적으로 iOS 6와 Xcode 4.5를 릴리즈 했습니다.

iOS 6, by default


iOS 6 가 beta 버전이었을 때 특별히 iOS 6에 맞춰코로나를 빌드하는 법에 대해 말씀 드렸었습니다.

daily build 919 부터 모든 디바이스 빌드들은 자동적으로 iOS 6 에 맞게 빌드 됩니다. 더 이상 target iOS SDK를 select 할 필요가 없습니다. 그 선택기능은 단지 iOS 가 beta 일 경우에만 제공하는 한시적인 기능이었습니다.

iOS 6 용으로 빌드하기 위해서는 여러분의 Xcode를 4.5 GM으로 업그레이드 해야 합니다. (4.5 GM seed 와 혼동하지 마세요.) 오늘부터 애플에서 4.5 GM 을 다운받아서 설치하실 수 있습니다.






Fate of iOS 4.3


당분간은 여러분이 빌드하는 앱들이 iOS 4.3 까지 지원이 되겠지만 곧 iOS 5.1 버전까지로 제한이 될 겁니다. 그 이유로는 두 가지가 있습니다.

우선 이전에 제가 설명드린 적이 있는데요. 애플은 iOS의 오래된 버전에 대한 support는 하지 않습니다. 그러니까 굳이 애플이 지원하지 않는 버전까지 우리들이 고민할 필요는 없습니다.


두번째로는 iOS 4.3 을 사용하는 디바이스들은 iOS 5.1 로 업그레이드 할 수 있습니다.


CoronaBuilder


만약 여러분들 중 자동적으로 최신 build가 적용되는 CoronaBuilder를 사용하시는 분들은 다음 daily build 에 몇가지 조정을 하셔야 합니다.


첫번째로 물론 Xcode 4.5GM 으로 우선 업그레이드 하셔야 합니다.


다음으로는 ‘sdkPath’ param 을 수정하셔야 합니다. 새로운 SDK location으로 point 하도록 말이죠. 이전 버전의 Xcode에는 ‘/Developer’에 인스톨 돼 있었을 겁니다. 새로운 버전의 Xcode 는 일반적으로 ‘/Applications/Xcode.app/Contents/Developer’에 위치해 있을 겁니다.


마지막으로 CoronaBuilder 최신버전을 가지고 있으시다면 아마 iOS 6 Beta seeds 에 맞게 빌드해 보셨을 겁니다. 그런 경우 daily build 919를 시작할 때  ‘platformVersion’ key를 먼저 지우셔야 합니다.


Enterprise, armv7s


Corona Enterprise devs도 마찬가지로 우선 Xcode 4.5 GM 으로 업그레이드 된 상황이라야 되구요. 그 다음에 daily build 919를 사용하시면 됩니다.

기존에 존재하는 Xcode project를 빌드하려고 하시면 아마 linker 에러를 보시게 될 겁니다.


ld: file is universal (2 slices) but does not contain a(n) armv7s slice

그 이유는 Xcode는 애플의 새로운 A6 Soc를 사용하는 iPhone 5를 지원해야 하기 때문입니다.

이 chip 은 modern ARM cores에 의해 사용되는 old 'armv7'을 지우ㅝㄴ합니다. 또한 armv7s를 지원하고 VFPv4와 a.k.a vector floating point를 지원합니다.


현재 Corona는 armv7s를 지원하고 있지 않습니다. 조만간 지원할 예정입니다. 그동안 여러분의 Xcode project에 약간의 adjustment를 해 주셔야 합니다. 아니면 여러분의 프로젝트를 CoronaSampleApp Xcode project 를 사용해서 처음부터 다시 빌드하셔도 됩니다.


Xcode 4.5 에서 여러분의 Xcode project를 open 하면 아래와 같은 화면을 보실 겁니다.

armv7과 armv7s 두개가 현재 standard 인것이 보일 겁니다.





여러분이 하셔야 할 일 중 가장 핵심적인 일은 디바이스를 위한 build는 오직 armv7 이라는 겁니다. (armv7s 는 없애 주세요.) 그 작업을 하고 난 후 보이는 화면은 아래와 같을 겁니다.






이 셋업의 의미는 여러분이 Xcode에게 디폴트로 계속 standard instruction set를 사용하고 싶다고 얘기하신 겁니다. 하지만 iOS에는 armv7용으로만 build 하라고 하는 behavior를 override 한 것을 추가 한 것이구요. delete키를 누르면 쉽게 제거할 수 있고 또 추가도 쉽습니다.


여러분의 Xcode project 에 직접 adjustment 한다면 왼쪽 pane에서 Tartget 대신 Project를 선택하시는 것을 잊지 마세요.

반응형

코로나 Enterprise

2012. 9. 20. 04:44 | Posted by 솔웅


반응형

지난 8월 2일 코로나 Enterprise 버전이 발표 됐었습니다.

그동안 제목만 보고 그냥 지나쳤는데 이 Enterprise 버전이 어떤건지 한번 살펴 보겠습니다.


Unlock unlimited mobile development possibilities.


Corona Enterprise builds 는 개발 기간을 혁신적으로 줄여주고 을 다양한  mobile development platform에서 작동할 수 있을 뿐만 아니라 native Object-C 나 java library를 call 하는 기능이 추가 됐습니다. 독립 개발자와 스튜디오 운영자들 그리고 게임이나 앱을 만드는 agences 에게 훨씬 효율적이고 질 높은 서비스를 제공합니다.

optional component인 Corona Builder는 자동으로 빌드하는 기능을 제공해 여러분 팀이 apps and games 쪽에 집중해서 질 좋은 제품을 만들 수 있도록 도와 줍니다.




Enjoy native library access


Corona SDK mobile development의 power 와 speed를 모두 활용하면서 다른 native-C based나 Java library 까지 이용하실 수 있습니다.

특정 기능을 처리하기 위해 여러분만의 코드를 write 하셔야 되나요? 문제 없습니다. 3rd party service를 활용하고 싶으신가요? 아주 간단합니다. build 시 그 라이브러리들을 그냥 include 하시면 됩니다. 필요한 Lua bindings 만 사용하시면 되요.

Corona Enterprise의 architecture를 알고 이것이 어떻게 작동되는지 자세히 살펴보고 싶으시면 documentation를 보세요.




Build on mobile industry standards


Corona Enterprise는 CoronaSDK에서 사용하는 같은 core engine을 사용하고 있습니다. 코로나의 모든 기능들을 활용하실 수 있습니다. 또한 OpenGL, OpenAL, Box2D physics and third party services 그리고 Facebook Connect, Game Center, Google Maps 같은 것들을 활용하는 기능을 추가로 사용하실 수 있습니다.

Corona Enterprise builds는 수시로 업데이트 되는 코로나의 Daily Build와 동기화 되어 있습니다. 그러니까 언제든지 Corona SDK의 최신 버전 및 최신 기능을 모두 활용하실 수 있습니다.



Facilitate effective teamwork


Corona Enterprise의 Hosted Templates는 여러분 팀이 최대한 효율적으로 일할 수 있도록 도와줍니다.

Objective-C 나 Java developer를 여러분의 native library들과 같이 사용하실 수 있고 그것들을 우리의 cloud에 host 할 수 있습니다. 그럼으로서 Lua 개발자들과 디자이너들은 핵심기능과 gameplay 부분에서 Objective-C나 Java 라이브러리와 함께 작업한 사항들을 코로나 시뮬레이터를 통해서 확인하면서 작업하실 수 있습니다.




Automate your builds

Corona Builder는 자동 빌드를 가능하게 해 개발의 효율성을 높였습니다. 그럼으로서 팀원들이 다른 주요한 기능들에 좀 더 집중할 수 있도록 만들었습니다.



반응형


반응형

Corona Guidelines: iPhone 5 and iOS6 (Preliminary)


Posted on . Written by



iPhone 5 (아이폰 5) 는 아마 가장 빨리 많은 양이 팔리는 기기가 될 것 같습니다. 이제 iPhone 5 와 iOS 6 를 대비해서 여러분이 만드는 코로나 앱을 어떻게 준비해야 되는지 알아 봅시다. 가장 큰 부분은 여러분의 코로나 앱을 16:9 의 화면 비율에 맞게 만드셔야 한다는 겁니다. 저희들은 이것을 tall app 이라고 부릅니다. (아이폰 4나 아이폰 4의 전통적인 앱의 화면 비율이 더 짧은 것과 비교해서 그렇게 부릅니다.)



Preparation


첫번째로 해야 될 것은 XCode 4.5 SDK GM seed를 인스톨 해야 됩니다. 애플은 지난 수요일 이것을 공개 했었습니다. 이전 버전의 XCode가 있다면 이 새 버전을 다운 받으세요. 이것이 있어야 IOS App Store에 iOS 6 앱을 submit 할 수 있도록 해 줍니다. 또한 이 Xcode를 깔아야 “iPhone (Retina 4-inch)”, a.k.a. iPhone 5 에 맞는 XCode 시뮬레이터에서 여러분의 앱을 미리 보실 수 있습니다.






Updates to Corona



저희들은 iOS6와 iPhone 5 를 타겟으로 해서 앱을 만들 수 있도록 하는 몇가지 주요한 업데이트를 했습니다. 유료 구매자분들은 이 업데이트 버전을 다운받으실 수 있는데요. daily build 912 버전을 다운 받으시면 됩니다.


daily build 911 부터 디바이스 빌드시 ‘XCode 4.5 GM seed’를 사용할 수 있도록 했습니다. 아래 화면에서와 같이 Build dialog 박스에서 iOS SDK 를 5.1이 아니라 “6.0 GM seed”를 선택하는 것을 잊지 마세요.




다음주초에 애플은 final GM을 릴리즈 할 계획입니다. 그 때 iOS 5 용을 없앨 겁니다. 그 이후의 빌드들은 모두 iOS 6를 타겟으로 하게 될 겁니다.



또한 코로나 시뮬레이터에 iPhone 5 스킨을 추가했습니다. 맥이나 Win 유저 모두 이 스킨을 사용하실 수 있습니다. 여러분이 이 tall app을 만드신다면 이 스킨을 사용하셔야 합니다. 만약에 traditional app을 만드신다면 iPhone 4 스킨을 사용하셔야 되구요.


(Entreprise customers : 엔터프라이즈 데일리 빌드는 다음주 애플이 iOS 6 GM 최종버전을 발표한 이후 업데이트 할 예정입니다.)



iPhone 5, Duck Typing, and the Black Bars



여러분 중 애플의 keynote를 보신분이 계시다면 현재 만든 앱들은 iPhone 5에서 letterboxed 되서 보여질 거라는 걸 보셨을 겁니다. i.e. the “black bars”.


이게 정확히 어떻게 보야진다는 걸까요?


저희들이 살펴본 바에 따르면 iPhone 앱이 iPad 에서 작동될때와는 다른현상이 나타납니다. iOS5에 맞게 작업된 현재의 iOS 앱들은 iPhone 에서는 traditional app으로 취급 될 겁니다.






무슨 의미냐 하면 iPhone 5는 그 화면 비율을 320X480 포인트 (640X960 pixels)로 생각할 겁니다. 그러면 어떻게 나타나냐 하면요. status bar 가 black bar 밑에 나타나게 됩니다. 그리고 black bar 지역에서는 rendering이나 touch 등이 먹히지 않을 겁니다.




It’s similar to duck typing:if it walks like a duck, talks like a duck, and acts like a duck, well then by golly it is a duck! This is the sleight of hand, Apple is playing on apps to make it easy on developers. If you want your app to think it’s on the same ol’ traditional iOS device, then just go merrily along.



Supporting “tall” apps



좋습니다. 이제 여러분 앱이  iPhone 5 에 맞게 좀 더 긴 비율의 기기를 지원하려면 어떻게 해야 할까요? 포럼에서 이미 읽으셨듯이 여러분의 project에 특별한 file을 추가하셔야 합니다. 이렇게 하면 iPhone 5의 tall mode에서 작동될 수 있을 겁니다. “Default-568h@2x.png” 라고 하는 tall splash image가 있어야 합니다.



아래에 주의하셔야 할 몇가지 사항을 정리했습니다.


  • 반드시 iOS 6.0 GM 로 빌드하셔야 합니다. 애플은 iPhone 5를 iOS5가 아니라 iOS6로 테스트 했습니다.  만약 여러분이 iOS 5로 tall mode를 만드는데 성공을 한다면 아주 운이 좋은 케이스이긴 하지만 애플은 그것을 지원하지 않을 겁니다.  코로나에서 iOS 6를 타겟으로 빌드를 하시면 그 이전 버전의 iOS에도 자동적으로 지원이 되는 앱이 만들어 질 겁니다.

  • XCode simulator 는 tall mode로 play를 시작하면 조금 까다로와 집니다. tall splash image를 없애도 그런 현상이 일어날 겁니다 예를 들어 여러분이 traditional mode로 run 하기를 원해도 그대로 tall mode로 보여질 겁니다. 만약에 tall 모드와 traditional 모드를 바꿔서 보고 싶으시다면 그 앱을 uninstall 하셔야 합니다. 혹은 “Reset Content and Settings…” menu 를 사용해서 시뮬레이터를 reset 하셔야 됩니다. 그리고 clean builds를 할 필요가 있을 겁니다. 예를 들어 여러분의 Mac에 있는 .app bundle의 이전 빌드를 delete 해야 합니다.

  • dispatch 되지 않은 iPhone 5 의 bottom 부분에서 일어나는 began과 ended touch 관련 이슈들을 해결했습니다.





Coexistence of tall and traditional apps



애플은 애플입니다. 애플은 여러분의 iOS 앱이 iPhone 5에서만이 아니라 모든 iOS 디바이스들을 지원하기를 원할겁니다. 그렇게 하기 위해 여러분에게는 두가지 choice 가 있습니다.


  1. Easy:  오직 traditional 스크린만 지원하는 겁니다.이게 가장 손 쉬운 방법이죠. 지금까지 해 왔던 방법이니까요. 그냥 해 왔던 대로 하시면 됩니다.
  2. Harder: tall과 traditional 스크린 모두를 지원하는 겁니다. 약간 트릭을 사용하셔야 합니다. iPhone 5와 기존의 아이폰 스크린 모두에서 작동하는 앱을 만들려면 거기에 맞는 각각의 UI를 만드셔야 하죠.  기존의 아이폰에서 작동할 때에 표시될 UI를 따로 만드셔야 할 겁니다.


Scenario #1 은 쉽습니다, 거기에 따로 설명을 덧붙일 필요는 없을 겁니다.  Scenario #2 은 조금 더 작업을 해야 하죠. 왜냐하면 extra screen 공간에 맞는 디자인을 더 해야 하니까요.

Scenario #2를 따르려면 코로나의 기능을 제대로 알아야 그 기능을 활용해서 좀 더 쉽고 정확하게 작업을 하실 수 있을 겁니다. 저희는 여러분의 앱이 taller screen에서 작동하는지 여부에 대해 감지할 수 있는 새로운 API들을 추가했습니다.


가장 쉽게 체크하는 방법은 아래와 같이 하는 겁니다.


local isTall = ( "iPhone" == system.getInfo( "model" ) )
and ( display.pixelHeight > 960 )
 

이렇게 스크린이 tall 인지 traditional인지 알아낸 다음 거기에 맞게 display 하도록 코딩을 하시면 됩니다. 운이 좋으시다면 이미 여러분이 만든 앱이 긴 화면의 안드로이드 기기에서 제대로 보이도록 만든 이미지가 있을 테고 그러면 그 이미지를 그냥 활용하시면 됩니다. 그렇지 않으면 여러분의 앱을 tall 모드에 맞게 업그레이드하는데 들이는 노력이 필요한지 아닌지를 먼저 생각하실 필요가 있습니다.


* * *


여러분이 보시다시피 저희들은 여러 부분에 대해 디테일 하게 분석을 하고 대처를 하고 있습니다.

저희 개발자중 한명이 이쪽 바닥을 이렇게 표현을 하더군요. “It’s never a dull moment.”


Amen to that!




반응형


반응형

FAQ Wednesday: native.newTextField and native.newTextBox Events


Posted on . Written by


It’s Wednesday and time for another FAQ session. Here are five frequently asked questions (FAQ).


1. Why is the “submitted” event phase missing for native.newTextField on devices but it’s working on the Mac Simulator?


“submitted” phase는 유저가 키보드의 “return” or “done” key 를 눌렀을 때 보내 집니다. 이것은 유저가 텍스트 입력 작업을 끝마치고 해당 정보를 “submitted” 했다는 것을 가리키는 것이죠. 유저가 다른 필드를 클릭해서 포커스가 바뀔 경우는 보내지지 않을 겁니다. build 904 버전 이전에는 맥 시뮬레이터는 항상 “submitted” and “ended” phases 가 같이 보내졌습니다. (submitted key 가 클릭되지 않았을 때도요). build 904 부터 맥 시뮬레이터는 iOS와 Android가 작동되는 것과 비슷하게 작동하게 됐습니다.




2. I’m confused about the “ended” and “submitted” phases for native.newTextFields.


TextField events가 작동하는 과정을 요약해 보겠습니다. 유저가 textfield를 클릭(터치)하면 “began” phase가 보내지고 키보드가 보여집니다. 타이핑이 일어나면 “editing” phase가 발생하죠. return/done button 이 클릭되면 ended” phase 가 보내진 다음에 “submitted” phase가 보내집니다. 만약 유저가 다른 Textfield나 다른 TextBox를 터치했다면 “submitted” phase는 보내지지 않고 “ended” phase만 보내지겠죠.


iOS에서는 number 를 넣을 TextField를 생성했을 경우 return key 가 없는 키보드가 나올 겁니다. 그러니까 유저가 일을 마쳤을 때 누를 버튼을 제공해 줘야 합니다. 키보드를 감추려면 native.setKeyboardFocus를 nil 로 하셔야 됩니다. 이렇게 키보드를 숨길 때 TextField 객체에 대한 “ended” phase 가 생성됩니다.

Note: 위의 상황은 build 904 버전 이후의 맥 시뮬레이터에서만 작동됩니다.



3. What happened to the “submitted” event phase on native.newTextBox?


newTextBox에는 submitted event phase가 없습니다. 이유는 return 키를 누르면 입력한 값이 submit 되는 것이 아니라 다음 줄로 가기 때문이죠. 이전 질문에서 언급됐듯이 유저가 작업이 끝났을 때 누를 수 있는 버튼을 생성하셔야 합니다.



4. When using native.newTextField, how do I hide the keyboard?


native.newTextField or native.newTextBox에서 키보드를 숨기려면 native.setKeyboardFocus 를 nil 로 하시면 됩니다. 역으로 native.setKeyboardFocus를 이용해서 포커스를 줄 수도 있습니다.



5. How can I edit text in the native.newTextBox?


디폴트로 native.newTextBox 는 editable이 아닙니다. object.isEditable = true를 하셔서 edit mode를 enable로 바꾸실 수 있습니다.


That’s it for today’s questions. I hope you enjoyed it and even learned a few things.



반응형

Database Authentication

2012. 9. 12. 21:01 | Posted by 솔웅


반응형

Database Authentication


DatabaseAuthentication 클래스는 열결된 데이터베이스에 있는 authentication과 user/group 정보를 제공합니다. 데이터베이스는 main configuration file에 셋업된 디폴트 데이터베이스를 사용할 수도 있고 그 자체의 credential과 세팅을 가지고 있는 별도의 시스템을 사용할 수도 있습니다. 여러분은 이 authentication data를 찾는데 사용되는 테이블을 customize 할 수 있습니다. 그리고 비밀전호 hash를 위한 알고리즘을 지정할 수도 있습니다. authority도 최소한의 configuration으로 새로운 series of table들을 쉽게 셋업할 수 있도록 디폴트 세팅 세트를 제공합니다.


Note : 현재 이 authority에서는 유저나 그룹을 생성하거나 관리하는 기능을 제공하지는 않습니다. 이 글은 여러분이 이미 만들어진 시스템에 연결하는 상황 그리고 여러분이 유저와 그룹을 관리하는 상황을 가정하고 작성되었습니다.




Configuration


DatabaseAuthentication authority는 여러 configuration value들을 가지고 있습니다. 모두 optional 입니다. 아래 value들이 데이터베이스에 연결하는데 영향을 미치는 것들입니다.

  • DB_TYPE - database system은 PDO를 통해 mysql과 sqlite를 지원합니다. 
  • DB_HOST - used by db systems that are hosted on a server
  • DB_USER - used by db systems that require a user to authenticate
  • DB_PASS - used by db systems that require a password
  • DB_DBNAME - used by db systems that require a database
  • DB_FILE - used by db systems the use a file (i.e. sqlite).


위 값들 중 빠진 값들은 SITE_DIR/config/site.ini에서 connectivity settings 을 가져와서 디폴트로 사용할 겁니다. 데이터베이스에 query를 어떻게 할지에 대한 여러 옵션들이 있습니다. 이 때 유저와 그룹 모두를 사용할 필요는 없습니다. 한가지만 필요하면 그걸 사용하시면 됩니다.


아래 값들은 데이터가 위치한 데이터베이스 테이블의 authority를 나타냅니다 :


  • DB_USER_TABLE - (users) The name of the table that stores the user records. This table should at least have fields for userID, password and email. It can also have fields for first/last name or full name. Each row should contain a single user entry
  • DB_GROUP_TABLE (groups) The name of the table that stores group information. It should have fields for shortname and group id. Each row should contain a single group entry.
  • DB_GROUPMEMBERS_TABLE - (groupmembers) The name of the table that stores the members of each group, it should have a field for the group name/id and the userID of the user. Each row should contain an entry that contains the group name and userID. The system will search for members that match the group name.


아래 값들은 어떤 필드들을 사용할지에 대해 authority에 알려 줍니다. :


  • DB_USER_USERID_FIELD (userID)- stores the userID in the user table. For systems that use the email address as the key, you should include the email field
  • DB_USER_PASSWORD_FIELD (password) -stores a hashed value of the user’s password. See DB_USER_PASSWORD_HASH for possible hashing algorithms (Default is md5)
  • DB_USER_EMAIL_FIELD (email) - stores the email in the user table
  • DB_USER_FIRSTNAME_FIELD (empty) - stores the first name of user. Won’t be used unless it is specified
  • DB_USER_LASTNAME_FIELD (empty) - stores the last name of user. Won’t be used unless it is specified
  • DB_USER_FULLNAME_FIELD (empty) - stores the full name of user. Won’t be used unless it is specified
  • DB_GROUP_GROUPNAME_FIELD (group) - stores the short name of the group in the group table
  • DB_GROUP_GID_FIELD - (gid) - stores the group id of the group in the group table. Should be numerical
  • DB_GROUPMEMBER_GROUP_FIELD (gid) - which field to use when looking up groups in the group member table. This is typically the same value as the group name or gid field
  • DB_GROUPMEMBER_USER_FIELD (userID) - which field to use when looking up user in the group member table. This is typically either the userID or the email
  • DB_GROUPMEMBER_AUTHORITY_FIELD - If present you can store the authority index in this field. This allows the system to map group members to other authorities.


다른 값들은 어떻게 그룹 멤버쉽이 키가 되는지를 알려줍니다.


  • DB_GROUP_GROUPMEMBER_PROPERTY - (gid) - This is not stored in the database, but refers to which field will be used to look up group information in the group member table. Valid values are gid or group (i.e. the shortname) gid is the default.


암호 해싱 방법과 관련한 값들도 있습니다.


  • DB_USER_PASSWORD_HASH (md5) - This is a string that represents a valid hashing function. It indicates what

    hashing algorithm is used to store the password. See hash_algos() for a list of valid hashing algorithms. Keep in mind that available algorithms may differ by PHP version and platform. You can also use the hmac_ prefix to use the hmac signing method (i.e. hmac_sha1). This requires setting the DB_USER_PASSWORD_KEY value.

  • DB_USER_PASSWORD_KEY (empty) - Necessary if you use the more secure hmac variant hashing algorithms. This uses a shared key to sign the value using hash_hmac

  • DB_USER_PASSWORD_SALT_BEFORE (empty) - If present this string will be prepended to any string as a salt value before hashing. This is useful if you are using fixed salts.

  • DB_USER_PASSWORD_SALT_AFTER (empty) - If present this string will be appended to any string as a salt value before hashing. This is useful if you are using fixed salts.

  • DB_USER_PASSWORD_SALT_FIELD_BEFORE (empty) - If present the value of this field for the user will be prepended to any string as a salt value before hashing. This is useful if you are using variable salts.

  • DB_USER_PASSWORD_SALT_FIELD_AFTER (empty) - If present the value of this field for the user will be appended to any string as a salt value before hashing. This is useful if you are using variable salts.


How it Works


User Authentication


USER_LOGIN을 FORM으로 해서 user authentication 을 지원한다면 authority는 USER_TABLE을 볼겁니다. 그리고 타입된 값과 맞는 DB_USER_USERID_FIELDDB_USER_EMAIL_FIELD 의 레코드 값을 찾을 겁니다. 해당 record를 찾으면 DB_USER_USERID_FIELD에 있는 값이 type 된 패스워드의 hashed 값과 매치 되는 지를 볼 거구요. (이때 DB_USER_PASSWORD_HASH algorithm을 사용합니다.) 데이터베이스에서 사용한 해쉬 알고리즘과 configuration에서 지정한 해쉬 알고리즘이 동일해야 합니다.


User Lookup


Users는 DB_USER_TABLE를 살피고 요청된 값과 DB_USER_USERID_FIELD or DB_USER_EMAIL_FIELD의 record 가 맞는지  봅니다. 만약에 맞는것을 찾으면 user object는 생성됩니다. 생성되는 것들은 값이 있는 경우 다음의 내용이 포함됩니다. B_USER_USERID_FIELD, DB_USER_EMAIL_FIELD and DB_USER_FIRSTNAME_FIELD,*DB_USER_LASTNAME_FIELD* and DB_USER_FULLNAME_FIELD


Group Lookup


Groups은 을 살피고 요청된 값과 DB_GROUP_GROUPNAME_FIELD or DB_GROUP_GID_FIELD의 record가 맞는지 봅니다. 만약에 맞는 것을 찾으면 group object가 생성됩니다. 생성되는 것들은 DB_GROUP_GROUPNAME_FIELD and DB_GROUP_GID_FIELD 값입니다.


Group Membership Lookup


Group membership은 DB_GROUPMEMBERS_TABLE안에서 query 됩니다. getMembers() 메소드는 DB_GROUPMEMBER_USER_FIELD를 사용해서 유저 객체 배열을 만듭니다.  DB_GROUPMEMBER_GROUP_FIELD 와 매치되는 모든 users는 return 됩니다. (DB_GROUP_GROUPMEMBER_PROPERTY,를 사용해서 리턴됩니다. 예:gid,short name) 그 user 객체들은 DB_GROUPMEMBER_AUTHORITY_FIELD에 의해 authority reference 되서 생성됩니다. 만약에 authority field 가 없으면 그룹과 같은 authority를 사용합니다. (예: DB_USER_TABLE를 사용할 겁니다.) 테이블의 다른 authority를 참조할 수 있습니다. (예: ldap users, google users 등)


Using Default Values


여러분의 reference database를 include 하고 싶으시면 아래와 같이 정의된 테이블의 모든 디폴트 값을 사용할 수 있습니다.



CREATE TABLE users (userID varchar(64), password varchar(32), email varchar(64),

firstname varchar(50), lastname varchar(50)); CREATE TABLE groups (`group` varchar(16), gid int); CREATE TABLE groupmembers (gid int, authority varchar(32), userID varchar(64));


이것은 디폴트 값들과 호환되는 테이블 구조입니다.


반응형

선그리기 기초 부터

2012. 9. 9. 22:01 | Posted by 솔웅


반응형

웹앱 프로젝트를 하느라고 오랫동안 코로나 개발에서 손 뗐었는데요.

너무 오래 안하다 보니까 그립네요.


써핑하다가 코로나 팁을 공유한 파일이 있어서 정리해 봅니다.


가장 기초적인 기능인 선 그리기 입니다.


일단 코드부터 볼까요?


display.setStatusBar( display.HiddenStatusBar ) -- Hide the status bar
 
local bx, by=0, 0
local lines={}
local p=1
 
local function drawALine(event)
    if "began"==event.phase then
        bx, by=event.x, event.y
       
    elseif "moved"==event.phase then
        lines[p]=display.newLine(bx, by, event.x, event.y)
       
        --Width
        lines[p].width=12

        --Alpha
        lines[p].alpha=1
       
        --Color
        lines[p]:setColor(255,255,255) -- White       
       
        bx, by=event.x, event.y
        p=p+1
       
        print(p);
       
    end    
end
 
Runtime:addEventListener("touch", drawALine)


맨 첫번째 줄은 아이폰에서 status bar를 없애는 코드입니다.

그리고 무엇인가를 그리려면 좌표가 필요하니까 x,y 좌표를 담을 변수를 만들었구요.

그 다음에 line 이라는 배열을 만들었습니다.


여기서 선 그리기는 시작점과 끝점을 찍어서 그 두 점을 연결하는 직선을 만드는게 아니라

손가락이 움직이는대로 따라서 선이 그어지도록 하는거거든요.


그러면 손가락을 따라 계속 선을 그어서 그 촘촘하게 그려진 선들이 결국에는 하나의 선처럼 보이게 하는 겁니다.


그래서 lines[] 라는 배열 만들었습니다.

그리고  p 는 변수에 차례대로 선들을 담기 위한 숫자로 쓰일 변수이구요.


이렇게 변수 선언 한 다음에는 drawALine 이라는 함수가 있는데요.


이 함수 건너뛰고 이벤트 리스너 부터 보겠습니다.

touch 에 반응하도록 했고 drawALine을 call 합니다.

그리고 어떤 객체에 이벤트 리스너를 단 것이 아니라 Runtime에 달았으니까 앱이 시작하면서 끝날 때까지 계속 활성화 되 있게 됩니다.


이제 핵심 부분인 함수를 볼까요?


우선 매개변수로 이벤트를 받습니다.


touch 이벤트에는 began, moved, ended 같은 phase들이 있습니다.


여기서는 began과 moved 라는 phase를 이용합니다.


우선 began 일 때는 그 이벤트가 일어난 지점 즉 손가락으로 터치한 지점의 x,y 좌표를 위에 선언했던 변수에 담습니다.


그리고 손가락이 조금이라도 움직일 때 발생하는 moved 일 때 drawLine을 사용해서 선을 긋죠.

began에서 저장했던 x,y 좌표에서 현재 움직인 지점의 x,y 까지 선을 긋습니다.

이 첫번째 line은 lines[] 배열 첫번째에 담기겠죠.

아마 코로나는 배열이 1부터 시작할 겁니다. PHP나 JAVA는 0부터 시작을 하죠.


그 다음은 이 그려진 선을 꾸미는 부분 입니다.

첫 부분은 width 를 사용해서 선의 두께를 정하구요. 그 다음은 투명도(alpha)를 정합니다.

그리고 setColor로 색을 정하구요.


이렇게 처음에 그려진 선을 다 꾸몄으면 다음 선을 준비하기 위한 작업을 합니다.

뭐냐하면 bx,by 값을 현재의 x,y 값으로 바꾸는거죠.


그러면 현재의 위치가 다음 moved 가 발생했을 때 시작점이 되는겁니다.

(이걸 하지 않으면 처음 touch 했던 부분부터 계속 선이 그어질 겁니다. 한번 해 보세요.)


그 다음에는 첫번째 선이 지정된 배열의 다음에 두번째선을 넣기 위해서 p에 1을 더합니다.

그 밑에는 제가 그냥 p 를 콘솔에 print 한 겁니다.


이렇게 하면 선긋기는 간단하게 끝납니다.


아래는 quinc 라는 친구가 공개한 선에 여러 효과를 줄수 있는 코드들입니다.


우선 width 부터 볼까요?


        lines[p].width=math.random(1, 30) -- Makes for an interesting "backbone" effect
        lines[p].width=12 -- Just a boring old set width
        lines[p].width=-3 -- I've heard of a line with a width of -3!
        lines[p].width=math.abs(event.y/20) -- 3D-ish horizon look


width 부분에 위 예제들을 하나하나 넣어가면서 실행해 보세요.

첫번째는 width가 1에서 30까지 랜덤하게 설정되는 겁니다. quinc 는 이것을 척추 모양을 내는 효과라고 했네요.

12는 일반적인 효과고 -3도 있네요. 이건 어떨까요?

그리고 y 좌표를 20으로 나눠서 그 절대값을 width 로 하는 것도 있네요.

이것도 효과가 어떨지 궁금한데요.


이렇게 수학 공식을 사용하다 보면 아주 좋은 효과들이 나옵니다.

프로그래밍을 하면 할 수록 수학을 배우고 싶은 마음이 마구 생겨납니다.


누가 수학은 배워봤자 사회에서 써 먹을 일이 없다고 그러는지...

이글 보시는 학생분들 계시면 그런 얘기 믿지 마세요.

수학 진짜 필요합니다.


다음은 투명도 효과를 볼까요?


    lines[p].alpha=1 -- Another boring one
    lines[p].alpha=0.5 -- Half strength line
    lines[p].alpha=math.abs((event.y-(1000-event.y))/1000) -- Darker area near the center
    lines[p].alpha=math.abs(event.y/1000) -- Foggy day
    lines[p].alpha=math.abs(event.x/1000) -- Foggy day...to the side?
    lines[p].alpha=(math.random(100, 1000))/1000 -- Random


여러 효과들이 있는데요. 처음에 알파를 1로 설정한 것은 그냥 투명도 없이 진하게 표시하는 겁니다.

0.5는 반쯤 투명하게 하는 거구요. 다음엔 수학공식을 사용해서 여러 효과를 주었네요.

세번째는 호면 중앙으로 올 수록 진해 지는 건가 봅니다.

그 다음은 아래 윗부분으로 갈 수록 연해지는 효과고 그 다음은 좌우로 갈수록 연해지는 효과 입니다.

그 다음은 그냥 랜덤하게 투명도를 주는거네요.

해 봤는데 별 효과는 없습니다. 그냥 무책임한 랜덤일 뿐이네요.


다음은 색 지정부분 입니다.


        --Flat color
        --lines[p]:setColor(255,255,255) -- White
        --lines[p]:setColor(255,255,0) -- Yellow
        --lines[p]:setColor(255,0,0) -- Red
        --lines[p]:setColor(0,255,0) -- Green
        --lines[p]:setColor(0,0,255) -- Blue
        --lines[p]:setColor(255,0,255) -- Purple
       
        --Interesting color effects
        --lines[p]:setColor(math.random(255)) -- Grayscale
        --lines[p]:setColor(math.random(255), math.random(255), math.random(255)) -- Rainbow
        --lines[p]:setColor(event.x/5, event.x-20/5, event.x+20/5) -- Really odd effect...
        --lines[p]:setColor(event.x-event.y, 0, event.x-event.y) -- Pretty cool, works best with slow movement


첫 부분은 그냥 단색으로 흰색,노랑,빨강,초록,파랑,보라 이렇게 선 색이 주어집니다.

그 다음엔 수학 공식을 사용한 효과로 처음엔 흑백화면처럼 라인 색이 나오면서 진해지고 옅어지고의 변화만 있습니다.

그 다음은 랜덤하게 색을 표시하는 거구요. 그 다음엔 진짜 이상한 효과라고 하네요. 한번 해 보세요.

그 다음엔 천천히 움직이면 아주 좋은 효과가 나온다고 합니다.


그 다음에는 아래 for 문도 하나 예제로 주었습니다.


        for i=1, p do
                lines[i].xScale=lines[i].xScale-0.12; lines[i].yScale=lines[i].yScale-0.12
        end


분석해 보니까 선을 그을 때마다 lines[] 배열에 담겨있는 선들의 크기를 조금씩 크게 만드는 거네요.


이것도 괜찮은 효과 입니다.


이 width, alpha, setColor 효과들을 다양하게 조합해 보면 재밌을 거예요.




위 이미지가 그 중 하나입니다.


아래 quinc 가 올린 파일 원본 소개 합니다.



main.lua


반응형


반응형

Posted on . Written by


수요일 FAQ 시간이 다시 돌아 왔습니다. 아래 자주 반복되는 질문 5가지가 있습니다. 오늘은 Event Listeners와 Display Objects를 어떻게 remove 하는지에 대해 알아보겠습니다.


1. I’m confused about when I need to call removeEventListener?


대표적인 경우는 Runtime:addEventListener를 사용해서 이벤트 리스너를 생성했다면 Runtime:removeEventListener를 call 하셔야 합니다. 만약 object event listener를 생성했다면 그 object를 remove 할 때 object event listener도 remove 해야 합니다.


--------------------------
-- Runtime Listener
--------------------------

function myFrame( event )
    print( "enterFrame", event.time )
end

Runtime:addEventListener( "enterFrame", myFrame )

-- Some time later ...
Runtime:removeEventListener( "enterFrame", myFrame )

--------------------------
-- Object Listener
--------------------------

local rect = display.newRect(10, 40, 100, 50)

function rect:touch( event )
    if event.phase == "began" then
        print( "Rect touched", event.target )
    end
end

rect:addEventListener( "touch" )

-- Some time later ...
rect:removeSelf()
rect = nil


 



2. I see code using “self”. What is that?


self 는 루아 메소드의 hidden 파라미터 입니다. 함수를 call 할 때 그 object에 접근하기 위해 사용하죠. 아래에 그 예제가 있습니다.


local rect1 = display.newRect(10, 100, 100, 50)
function rect1.touch( self, event )
    if event.phase == "began" then
        print( "Rect1 touched", event.target, self )
    end
end

rect1:addEventListener( "touch" )


local rect2 = display.newRect(10, 160, 100, 50)
function rect2:touch( event )
    if event.phase == "began" then
print( "Rect2 touched", event.target, self )
    end
end

rect2:addEventListener( "touch" )
 

두 예제의 메소드 모두 제대로 작동합니다. 그런데 하나는 "." 를 사용했고
다른 하나는 ":"를 사용했습니다.

콜른(:)을 사용하면 메소드에 hidden self 파라미터를 전달합니다.
그리고 점(.) 을 사용한 것은 이 self를 전달하지 않습니다.
그러니까 점을 사용하면 반드시 첫번째 파라미터로 self를 전달해야 합니다.

코로나는 다른 많은 Display Object API들에 (e.g., object:removeSelf, object:setFillColor, etc.) 이 Lua 기능을 사용하고 있습니다.


이벤트 리스너와 self 를 사용하는 것은 그렇게 유용하지 않을 겁니다. 왜냐하면 대부분의 object listener들은 객체의 handle을 지원하기 위해  event.target 파라미터를 제공하기 때문이죠. 이 파라미터는 self와 같습니다. 여러분이 만든 메소드에는 이 self를 사용할 수 있을 겁니다. 여러 객체에서 같은 메소드를 call 할 때 아주 유용하겠죠.


3. Do I really need to set display objects to nil after I remove them?


그 객체와 관계된 Lua 메모리를  clean up 하기 위해 사용하지 않는 객체에 nil을 할당해야 합니다. display object를 remove 할 때마다 (object:removeSelf) 그 객체의 texture 메모리와 관련된 메소드 그리고 그 객체와 관련된 이벤트 핸들러들은 remove 될 겁니다.  그렇게 되면 그 객체는 일반적인 Lua 테이블로 됩니다. 여기에 nil을 할당함으로서 그 테이블에 대한 reference 까지 remove 하게 됩니다. 그리고 나서 Lua Garbage Collector에 의해 그 테이블이 사용했던 메모리가 free 됩니다.


4. What is the best way to remove display objects from a Display Group?


display group에서 removeSelf 를 하면 그 그룹의 모든 display object들을 remove 할 겁니다. 그 그룹의 각 객체별로 따로따로 removeSelf  할 필요는 없습니다. group에 있는 객체들을 따로 nil 처리할 필요는 없습니다. 그룹 안에 있는 객체가 다른 변수에 의해 reference 된다면 그 variable을 nil로 세팅해야 합니다.


5. How can I tell if a display object was removed?


display object는 table입니다. 그리고 그것과 연관된 texture memory와 메소드들이 있죠. 그러니까 어떤 display object 메소드가 그 object와 아직까지 연관이 돼 있는지 여부를 체크함으로서 해당 display object가 아직까지 존재하는지를 알아 낼 수가 있습니다.


local rect1 = display.newRect(10, 100, 100, 50)
if type( rect1.setFillColor ) == "function" then
print( "rect is still a display object" )
end


위 예제는 rect1 객체에 setFillColor 메소드를 적용할 수 있는지 여부를 체크하고 있습니다.
어떤 객체에 removeSelf 를 call 하면 그 객체로부터 모든 메소드가 removed 된다는 것을 기억해 두세요.

여기까지가 이번주 QNA 내용이었습니다.

즐거운 주말 되세요.



반응형