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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형
Posted on . Written by



Sticky Projectiles


끈적한 포탄들을 코로나로 구현하는 방법은 아주 간단합니다. 이 장에서는 아래와 같은 내용들을 다룰 겁니다.



1. 포탄이 벽에 붙을 수 있는 충분한 속도가 됐는지 여부를 체크하기 위한 directional velocity 를 어떻게 detect 하는지에 대한 방법
2. weld joint 를 사용해서 포탄을 다른 객체에 붙이는 방법


포탄을 만들고 launching하는 것은 큰 주제 입니다. 그래서 그에 대해서는 깊게 들어가지 않겠습니다. 이 게임을 만들 때 생각해야 할 것은 위 두 경우를 다룰 collision handler 함수 입니다.


우리가 할 첫번째 일은 포탄의 방향과 속도를 감지하는 것입니다. 우선 피타고라스 이론(Pythagorean theorem)을 사용해서 속도를 계산해야 합니다. 그리고 나서 그 값으로 다음의 둘 중 하나를 구현할 수 있습니다.  만약 속도가 충분하다면 포탄과 벽에 weld joint 를 생성할 겁니다. 속도가 충분하지 않으면 아무 joint 도 만들지 않을 겁니다. 그러면 포탄은 땅에 떨어지겠죠.


Detect Directional Velocity


우선 포탄의 vx vy linear velocities 를 가져옵니다. 그리고나서 그 값을 공식에 대입시키죠. 그러면 우리가 원하는 속도를 얻을 수 있습니다.


local vx,vy = self:getLinearVelocity()
local dirVel = math.sqrt( (vx*vx)+(vy*vy) )


Make Joint — or Don’t!

포탄의 속도에 따라 위에서 언급한 둘 중 한가지를 적용하게 될 겁니다. 속도가 여러분이 원하는 만큼 충분하다면 포탄이 다른곳에 붙을 수 있도록 만듭니다.


if ( dirVel > 330 ) then
   self:setLinearVelocity( 0,0 )
   timer.performWithDelay( 10, resolveColl, 1 )
end


Box2D 에서는 어떤 action들은 같은 time step 에 한꺼번에 실행되지 않는 것들이 있습니다. 왜냐하면 Box2D 엔진이 내부적으로 계산을 하고 있는 상황이기 때문이죠. 우리는 10 밀리세컨드의 timer 가 작동된 후에 joint 를 생성할 겁니다.


function resolveColl()
   local weldJoint = physics.newJoint( "weld", self, event.other, self.x, self.y )
end


여기까지 하시면 sticky 포탄 시나리오의 아주 기본적인 사항들은 완료 된 겁니다. 예제에 있는 여러 setting 들을 바꿔가면서 이것저것 많이 시도해 보세요.

StickyProjectiles.zip


참고로 전체 소스는 아래와 같습니다.


local physics = require("physics") ; physics.start() ; physics.setGravity( 0.0,9.8 ) ; physics.setDrawMode( "normal" )
physics.setPositionIterations( 16 ) ; physics.setVelocityIterations( 6 )
display.setStatusBar( display.HiddenStatusBar )

--set up some references and other variables
local ox, oy = math.abs(display.screenOriginX), math.abs(display.screenOriginY)
local cw, ch = display.contentWidth, display.contentHeight
local stage = display.getCurrentStage()

--set up terrain and background
local back = display.newImageRect( "sky.jpg", 1024, 768 ) ; back.x = cw/2 ; back.y = ch/2
local wallL = display.newRect( -ox, -oy, 40, ch+oy+oy )
physics.addBody(wallL, "static", { bounce=0.6, friction=1.0 } )
local wallR = display.newRect( cw-40+ox, -oy, 40, ch+oy+oy )
physics.addBody(wallR, "static", { bounce=0.6, friction=1.0 } )
local wallB = display.newRect( -ox, ch-40+oy, cw+ox+ox, 40 )
physics.addBody(wallB, "static", { bounce=0.6, friction=1.0 } )
local wallT = display.newRect( -ox, -oy, cw+ox+ox, 40 )
physics.addBody(wallT, "static", { bounce=0.6, friction=1.0 } )
local text = display.newText( "Tap screen to launch projectiles", 0, 0, "Times", 44 ) ; text:setTextColor(0,0,0,160) ; text.y = 140 ; text.x = cw/2

--set up boolean for projectile firing
local projFiring = false

--set up projectile sheet
local proj
local options = { width=40, height=40, numFrames=2, sheetContentWidth=80, sheetContentHeight=40 }
local projSheet = graphics.newImageSheet( "projspike.png", options )
local seq = { name = "main", frames = {1,2} }

--function to create new projectiles
local function newProj()

    proj = display.newSprite( projSheet, seq ) ; proj.x = 150 ; proj.y = 600
    physics.addBody( proj, "dynamic", { density=15.0, friction=0.8, bounce=0.3, radius=16 } )
    proj.gravityScale = 0
    projFiring = false
    proj.isBodyActive = false
end

--collision handler
local function projCollide( self,event )

    if ( event.phase == "began" ) then

        --get world coordinates of projectile for joint reference   
        self:removeEventListener( "collision", self ) ; self.collision = nil
       
        --delay function to resolve collision
        local function resolveColl( timerRef )
            if ( timerRef.source.action == "makeJoint" ) then
                local weldJoint = physics.newJoint( "weld", self, event.other, self.x, self.y )
            end
            newProj()
        end

        --check if velocity of projectile is sufficient to "stick"
        local vx,vy = self:getLinearVelocity()
        local dirVel = math.sqrt( (vx*vx)+(vy*vy) )

        if ( dirVel > 330 ) then  --if sufficient, stop velocity and trigger joint creation
            self:setLinearVelocity( 0,0 )
            local t = timer.performWithDelay( 10, resolveColl, 1 ) ; t.action = "makeJoint"
        else  --if not sufficient, "break" projectile and create new
            self:setFrame(2)
            local t = timer.performWithDelay( 10, resolveColl, 1 ) ; t.action = "none"
        end

    end
end

--screen touch handler
local function touchAction(event)

    if ( event.phase == "began" and projFiring == false ) then
       
        projFiring = true
        proj.isBodyActive = true
        local px,py = event.x-proj.x, event.y-proj.y

        proj:applyLinearImpulse( px/2, py/2, proj.x, proj.y )
        proj:applyTorque( 1200 )
        proj.gravityScale = 1.0
        proj.collision = projCollide ; proj:addEventListener( "collision", proj )
    end
end
stage:addEventListener( "touch", touchAction )

newProj()



반응형


반응형

오늘 일찍 출근해서 인터넷 서핑 좀 하다가 발견한 기사 몇개 입니다.

가벼운 마음으로 하루 일 시작할 수 있을 것 같네요.. :)




[뉴스 플러스]이명박 전 대통령 사법처리 카운트 다운중


이명박 전 대통령은 새 대통령 취임식 전날인 24일 오후 청와대 일정을 마치고 강남 논현동 사저로 돌아갔습니다. 이번에 신축한 논현동 사저를 보니, 완전히 ‘명박산성’이더군요. 붉은 벽돌의 담 높이가 3m가 훨씬 넘고, 출입구도 좁고 굽어지게 만들어져 있더군요. 보통 집 대문이라고 볼 수 없는, 외부 침투를 막는 중세 난공불락의 성벽 구조입니다.

왜 그렇게 만들었을까요? 노무현 전 대통령이 봉하마을 사저 담 너머에서 주민들과 소통하던 것과는 전혀 딴판입니다.

이명박 대통령이 지난 24일 논현동 사저로 들어가기에 앞서 소감을 말하고 있다. 그러나 논현동 사저의 붉은 벽돌 담이 매우 높아 밖에서 안을 들여다볼 수가 없게 설계돼 있다. 경향신문 자료사진



이 렇게 높은 담장과 복잡한 출입구 구조를 가진 사저에서 이 전 대통령, 잘 생활하고 계시겠지요. 5년동안 북악산 밑 청와대 숙소에서 살았으니 청와대 잠자리에 익숙졌을 텐데 5년 만에 바뀐 잠자리로 숙면을 취했는지 모르겠습니다. 나이가 들면 잠도 없어진다는데 아마 만감이 교차해 쉽게 잠자리에 들지 못했을 것입니다.

권불십년 화무십일홍(權不十年 花無十日紅)이라 했는데 권불십년이 아니라 ‘권불오년’이네요. 사실 우리 현대 정치사에서 최고 권력자는 비참한 말로로 점철됐습니다. 초대~3대 대통령의 해외망명, 4대 대통령 쿠데타로 사임, 5~9대 대통령 암살, 10대 대통령 쿠데타로 사임, 11~13대 대통령 내란 등으로 사법처리. 이것은 그리 오래 전 사실도 아닌, 바로 최근 일입니다.

한 나라의 민주주의가 제도화됐느냐를 따지는 여러 잣대가 있지만 전임 대통령이 얼마나 안정적으로 사회활동을 하느냐가 매우 중요하다고 생각합니다. 여러명의 전임 대통령이 사회 각 분야에서 나름의 전문성을 가지고 국가·사회에 기여하는 것, 바로 그것이 민주정치가 제도화됐다는 증거입니다.

군정 종식이라는 국민적 여망으로 김영삼 대통령이 두 전임 대통령을 법정에 세우는 것을 끝으로 대통령에 대한 비극은 끝나는가 했습니다. 김대중 정부도 환란특검을 했지만 전임 대통령에 대한 사법적 보복은 하지 않았습니다. 노무현 대통령도 전임 정부에서 이른바 ‘국정원 X파일’이란 엄청난 민간인 도청사건이 벌어졌고, 대북특검을 했지만 전임 대통령을 사법처리하지 않았습니다.

그러나 이명박 정부는 출범하자마자 대통령 기록물 시비를 시작으로 전임 대통령에 대한 비리를 들췄습니다. 노무현 대통령은 검찰 소환을 받는 수모를 당했고, 결국 부엉이 바위에서 뛰어내려 자살했습니다. 물론 대통령도 죄가 있으면 처벌되고 특히 퇴임 이후에는 말할 것도 없습니다. 그런데 대통령 부인이 돈을 받았는데 대통령을 포토라인에 세워 망신을 줬지요. 이것은 우리 정치사에서 고질적 폐악이던 정치보복의 재연이고, 민주주의의 후퇴였습니다.

이후 이명박 정부 5년은 양심의 자유, 표현의 자유, 결사의 자유 등 국민의 기본권을 제한하는 민주주의의 후퇴시기였다는 평가가 많습니다. 이것 말고도 시민단체가 지목한 위법 실정 사건은 청와대-국무총리실 민간인 불법 사찰, 제주 해군기지 건설 타당성, 천안함 침몰사건 등 여럿이 있습니다. 특히 BBK 의혹, 다스 등의 문제는 여진히 진행 중인 사건입니다. 재임 중 또다른 사건이 드러날 수도 있겠지요.

이제 이명박 대통령이 퇴임했습니다. 그를 보호하던 면책특 권, 불체포 특권은 이제 더이상 없습니다. 불행하게도 이 전 대통령은 이미 재임 중 실정법 위반으로 형사소추가 예정된 유일무이한 대통령입니다. 그가 법정에 서는 것은 시간문제라는 것입니다. 이미 참여연대 등 시민단체는 그를 형사고발하기로 결정했습니다. ‘째깍째깍’ 그의 사법처리가 카운트 다운에 들어간 것입니다.

그중에는 국정원 대선개입 사건과 같은 고도의 정치적 사안도 있습니다. 이것은 현 박근혜 대통령과도 관련된 것이니, 이 전 대통령을 법정에 세우는 것은 쉽지 않겠지요. 하지만 내곡동 사저 구입과 관련된 불법행위는 통치행위가 아닌, 저급한 예산 횡령입니다. 박근혜 대통령이 이것까지 막아줄 수 있을까요. 아마 박 대통령이 막아주고 싶어도 그럴 수 없을 겁니다.

이미 4대강 사업은 감사원도, 문제점을 지적하며 발을 빼고, 박근혜 정부의 새로운 환경부 장관도 문제점을 지적하고 있습니다. 이명박 정부와 거리두기를 시작한 것이지요. 22조원이 넘는 거액의 예산이 들어간 4대강 사업은 ‘업무상 배임’이 될지, 아니면 ‘통치행위’가 될지는 모르겠습니다. 하지만 인과관계가 분명한 과학(토목)을 애매한 통치행위로 결정내리기까지 많은 웃음과 비상식이 동원될 것입니다.

이래저래 이명박 전 대통령은 아마 잠을 잘 못 이룰 것입니다. 비록 높은 담과 복잡한 출입문을 가진 사저이지만 불안할 것입니다. 언제 검찰에서 소환장이 날아올지 모르니까요. 국민에게는 불행입니다. 또 통치행위라고 하기에 너무 ‘창피한’ 사안으로 전직 대통령이 법정에 선다면 국격은 얼마나 떨어지겠습니까. 하지만 어쩔 수 없습니다. 이명박 전 대통령이 뿌린 씨는 스스로 거둬야 합니다.



환경부 장관 후보 “MB 4대강 졸속, 비판 못 면해”
정환보 기자 botox@kyunghyang.com


윤성규 환경부 장관 후보자가 이명박 정부의 최대 국책 사업이었던 4대강 사업을 사실상 정면 비판했다.

26일 윤 후보자가 국회 환경노동위원회 장하나 의원(민주통합당)에게 제출한 인사청문회 서면 답변 자료를 살펴보면 그는 “(이명박 정부가) 4대강 사업을 전국적으로 일시에 시행함으로써 환경 파괴 논란과 함께 졸속 시행했다는 비판을 면치 못하고 있다”고 밝혔다. 윤 후보자는 이어 “수질이 오염된 영산강 등 어느 한 곳을 골라 사업을 시행한 뒤 그 성과를 봐가며 나머지 강으로 확대할지 여부를 결정하는 것이 옳았다”고 밝혔다.

윤 후보자는 “4대강 사업은 이명박 정부가 남긴 숙제”라고 명확히 규정했다. 그는 “이 숙제에 대한 중간 평가를 엄정하게 실시해 후속 대책을 마련할 것”이라고 말했다. 박근혜 정부의 첫 환경부 장관 후보자가 이처럼 밝힘에 따라 정부가 올해부터 본격적으로 보 해체 작업에 나설 가능성도 제기된다.



MB 딱걸렸네! 4대강·한식 세계화, 감사대상에


‘4대강 수질개선·한식세계화 사업’
국회, MB 퇴임하자마자 감사 의결


4대강 사업 등 이명박 정부가 추진했던 핵심 국가사업이 새 정부가 출범하자마자 감사원의 감사를 받게 됐다.

국회는 26일 본회의를 열어 ‘4대강 수질개선을 위한 총인처리시설 입찰 관련 감사요구안’과 ‘한식 세계화 사업에 대한 감사요구안’을 각각 의결했다. 4대강 사업의 경우 2010년부터 지방자치단체와 한국환경공단이 턴키 방식으로 발주한 36개의 총인처리시설 설치 사업에서 평균 낙찰률이 97.5%에 이르러 통상 80%대인 다른 공사 낙찰률과 비교해 월등히 높았던 것으로 드러났다. 총인(TP) 사업은 조류 발생의 원인이 되는 총인의 유입을 줄이기 위해 하수처리장의 처리시설을 보강하는 사업이다. 4대강 사업 전반에 대한 감사는 아니지만 핵심적인 수질개선 사업에 대한 감사가 이뤄질 경우 업체간 부정·비리 의혹이 드러날지 주목된다. 앞서 감사원은 지난달 4대강 사업 과정 중 설치한 보가 설계 부실로 내구성이 약하고, 수질 예측을 잘못해 수질이 악화될 우려가 크다는 감사 결과를 공개한 바 있다.

또 국회는 ‘이명박 정부’에서 역점적으로 추진한 한식 세계화 사업에 대한 감사요구안도 처리했다. 감사안은 ‘뉴욕 플래그십 한식당’ 개설비 50억원을 애초 계획대로 사용하지 않고 49억6000만원을 다른 용도로 변경, 사용한 의혹 등을 조사하도록 했다. 이명박 전 대통령의 부인 김윤옥 여사는 민관합동기구인 ‘한식세계화추진단’의 명예회장을 맡을 만큼 이 사업에 애착이 강했던 것으로 알려졌다.

송채경화 기자 khsong@hani.co.kr


==========================================================


전직 대통령이 사법처리 되는 불행이 다시는 없어야 되겠지만....


딱 MB 까지만 사법처리 해 버리고 그 다음부터 이런 불행을 되풀이하지 말았으면 합니다.


MB는 역사를 되돌리는 너무 큰 악을 저질렀고 또 국가 권력을 사익추구의 도구로 사용했을 뿐만 아니라 전두환,노태우 이후에는 없었던 전직 대통령에 대한 사법처리 협박을 사용하다 결국엔 전대통령을 자살로 이르게 한 나쁜 놈이니까요.


민주주의에서는 다른 모든 의견을 인정하고 존중하는 의견만이 존중 됩니다. 그래서 어떤 정치적인 입장도 정당을 만들 수 있지만 다른 정치적 입장을 부정하는 나찌나 일당독재를 주장하는 공산당 같은 정당들은 합법화 될 수 없을 뿐 아니라 법에 의해 처벌을 받아야 합니다.


그러니 어느 정도만 되면 전직 대통령은 보호되고 그 역량을 국가적으로 잘 활용해야 되겠지만 전직 대통령을 보호하지 않고 악랄하게 격하시킨 전직 대통령 만큼은 제대로 법의 잣대를 들이대서 위법한 사항들에 대해서는 처벌해야 합니다.


우리 MB 까지만 처벌 합시다... 꼬옥......  :)


반응형


반응형

이번에 다룰 튜토리얼은 아주 유용한 예제 3개 입니다.

이 3개를 따로 따로 정리해서 글을 올릴 계획입니다.


Posted on . Written by



오늘의 튜토리얼에서는 몇가지 유용한 physics methods 를 소개해 드리겠습니다. 이 튜토리얼에서 우리는 "내가 점프할 수 있을까" 를 2D side-view 게임으로 만드는 과제를 풀어갈 겁니다. 그리고 sticky projectiles와 기본 wind tunnel befavior 를 다루는 방법도 다룰께요.

이 모든 method들은 다운로드 받을 수 있는 프로젝트 안에 포함돼 있습니다. 이 튜토리얼 마지막 부분에 있는 링크를 클릭해서 다운받아 보실 수 있습니다.


Can I Jump?


등장 캐릭터가 점프할 수 있는 2D 게임을 만들 때 아마 어떤 물체가 점프를 할 경우 ground 에서 점프해서 ground 로 떨어지도록 만들어야 할 겁니다. 이걸 구현하라고 하면 아마 개발자마다 자기만의 방법으로 구현할 수 있을 겁니다. 방법은 여러가지가 있을 수 있지만 두가지 정도는 지켜야 합니다. 일단 물체가 ground 에 있을 때는 verticla 속도는 없을 겁니다. 그리고 점프를 한 다음에는 짧은 timer를 사용하고 또 boolean flag를 사용해서 그 물체가 땅에 떨어지기 전에는 다시 점프를 할 수 없도록 해야 할 겁니다. 이것을 구현해 놓으면 그 다음에 또 다른 구현해야할 기능들이 눈에 보이겠죠.


일단 이 물체의 physics body 에 두번째 element로 “foot sensor”를 달면 쉽게 접근할 수 있습니다. 이 센서는 그 물체의 base에서 약간 의 곤간을 차지하게 될 겁니다. 이 센서가 ground와 겹쳐지면 우리는 이 물체가 ground 위에 붙어 있다고 가정할 수 있습니다. 그러면 jump를 할 수 있는 상태가 되는 거죠. 그리고 이 센서는 그 물체의 width 보다 약간 좁게 만들겁니다. 화면 끝에 가서 부딪힌 다음 다시 돌아와야 되는데 그 물체보다 넓으면 벽에 부딪히기도 전에 튀어나올 수 있으니까요.




Constructing Terrain


코로나에서 지형을 만드는 방법은 아주 간단합니다. 아래에 우리는 모든 ground 객체들에 objType 프로퍼티를 추가할 겁니다. 그래서 물체가 이 ground에서만 반응해서 점프할 수 있도록 할 겁니다. 


local cw, ch = display.contentWidth, display.contentHeight local ground = display.newRect( 0, ch-64, cw, 64 ) ground.objType = "ground" physics.addBody( ground, "static", { bounce=0.0, friction=0.3 } )


Declaring Character Body


이 물체는 두개의 body elements로 구성될 수 있습니다. 두번째 body element 는 sensor 라는 것을 기억해 두세요. 이것은 polygonal shape 를 사용해서 정의 될 겁니다. 그리고 센서는 두번째에 정의 된다는 것도 기억해 두시구요. 이 센서가 ground 에 닺았는지의 여부를 체크할 때 두번째 element를 사용해서 체크할 거거든요.

그리고 이 물체가 점프할 수 있는 상황인지를 알기 위해 canJump counter 도 추가합니다. 이 counter 는 다음과 같은 이유에서 아주 유용합니다. : 두개의 ground 객체가 있고 이 두 ground 사이를 이 물체가 지나갈 때 이 foot sensor 는 두 ground 객체에 모두 닿아있게 됩니다. counter 대신에 true/false boolean 프로퍼티를 사용한다면 자칫 원하지 않는 상황이 연출 될 수 있습니다. 그래서 센서가 ground 객체에 접촉할 때 이 counter 를 사용해서 숫자를 증감시켜서 현재의 상태를 보다 정확하게 파악할 수 있도록 합니다.


local character = display.newRect( 100, 300, 120, 120 ) ; character:setFillColor(0)
physics.addBody( character, "dynamic",
 { density=1.0, friction=0.0, bounce=0.0 },
 { shape={20,0,20,65,-20,65,-20,0}, isSensor=true }
 )
character.isFixedRotation = true
character.canJump = 0


Jump Handler

점프하도록 만드는 것도 아주 간단합니다. 그냥 canJump counter를 체크해서 0보다 크면 점프 시키면 됩니다.


function touchAction(event)
   if ( event.phase == "began" and character.canJump > 0 ) then
      --jump procedure here
   end
end
stage:addEventListener( "touch", touchAction )


Collision Handler


마지막으로 다룰 것은 collision 핸들러 입니다. 이 핸들러를 구현하기 위해 아래 사항들을 체크해야 합니다.

    1. colliding body element index 가 2 이다 - 이것으로 그 물체가 아니라 foot sensor 가 collid 된 것을 알 수 있습니다.
    2. ground 객체의 지형 element - 만약 지형 element이면 이 물체는 안전하게 점프할 수 있습니다.


이 conditional clause 안에서 우리는 아래 둘 중 하나를 실행시키게 됩니다.


    1. began phase 에서 (foot sensor 가 ground 객체에 들어 섰을때), canJump counter를 증가시킨다.
    2. ended phase 에서 (foot sensor 가 ground object 를 나갔을 때), canJump counter 를 감소시킨다.


function charCollide( self,event )

   if ( event.selfElement == 2 and event.other.objType == "ground" ) then
      if ( event.phase == "began" ) then
         self.canJump = self.canJump+1
      elseif ( event.phase == "ended" ) then
         self.canJump = self.canJump-1
      end
   end
end
character.collision = charCollide ; character:addEventListener( "collision", character )


여기까지가 jump를 구현하기 위해 가장 기본적으로 필요한 것들 입니다.


전체 소스와 이미지들은 아래 파일을 다운 받아서 사용하세요.

canJump.zip



반응형