2015년 7월 11일 토요일

corona sdk 로 슈팅 게임 만들기(폭발 점수 처리)

* 해야할 것 *

배경스크롤
주인공 이동
무기발사
적 이동
스테이지
점수 처리
시작처리
종료처리
적유닛 생성
이미지 사용할 것:http://m484games.ucoz.com/index/shoot_39_em_up_gfx/0-38
참고 소스:http://www.tandgapps.co.uk/resources/tutorial-space-shooter-in-240-lines/


폭발 처리

폭발 장면 이미지를 구합니다. 당연히 애니메이션이 되어야 하기 때문에 이미지가 여러개 붙어있는 하나의 png파일로 만듭니다.

위와같은 이미지를 사용하겠습니다.

두개의 함수로 구성되어 있습니다. loadImgs를 미리 호출해주고 어디에서나 폭발 장면이 필요할때 쓰는 makeExp 라는 함수를 만들었습니다. 
expListener은 애니메이션이 끝나면 사라질때 사용합니다.
그리고 expGroup를 미리 만들어 합니다.
local expGroup = display.newGroup()
간략하게 설명하자면 애니메이션을 위해서는 sheet를 먼저 로드하고 newSprite로 이미지 장수 delay를 결정하게 됩니다.


local sheetExp

local function loadImgs()
  local sheetOptions =
  {
    width = 20,
    height = 20,
    numFrames = 6
  }
  sheetExp = graphics.newImageSheet( "exp_20_20_6.png", sheetOptions )
end

local function makeExp(x,y)
  local function expListener( event )
    local thisSprite = event.target  -- "event.target" references the sprite
    if ( event.phase == "ended" ) then  
      thisSprite:removeSelf(); thisSprite = nil
    end
  end

  local sequencesExp = {
      {
          name = "exp",
          start = 1,
          count = 6,
          time = 200,
          loopCount = 1,
          loopDirection = "forward"
      }
  }
  local exp = display.newSprite( sheetExp, sequencesExp )
  exp.x = x; exp.y = y
  exp:play()
  exp:addEventListener( "sprite", expListener )
  expGroup:insert( exp )
  print(expGroup.numChildren)
end


점수의 계산은 총알과 적이 충돌이 일어나면 score를 더해줍니다.
그리고 충돌날때 makeExp를 호출합니다.



local function onCollision(event)
  if event.phase == "began" then
    local obj1 = event.object1; 
    local obj2 = event.object2; 

    if obj1.name == "laser" and obj2.name == "enemy" or obj1.name == "enemy" and obj2.name == "laser" then
      if( obj2.name =="enemy") then 
        makeExp(obj2.x,obj2.y)
      else
        makeExp(obj1.x,obj1.y)
      end
      display.remove( obj1 ); obj1 = nil
      display.remove( obj2 ); obj2 = nil
      score = score + 100 --Yay points!

    elseif obj1.name == "ship" and obj2.name == "enemy" or obj2.name == "ship" and obj1.name == "enemy" then
      makeExp(obj2.x,obj2.y)
      makeExp(obj1.x,obj1.y)
      display.remove( obj1 ); obj1 = nil
      display.remove( obj2 ); obj2 = nil
      gameOver()--Weve died so call gameover...


텍스트를 미리 만들어 두고 주기적으로 텍스트 값을 바꾸면 화면에 변경된 값이 나타나게됩니다.


local function loadTexts()
 scoreText = display.newText("Score: "..score, 0,0,"Helvetica",18)
 scoreText:setTextColor(220, 0, 0)
 scoreText.x = _W*0.5; scoreText.y = 10
 fgGroup:insert(scoreText)
 levelText = display.newText("Level: "..wave, 0,0,"Helvetica",18)
 levelText:setTextColor(220, 0, 0)
 levelText.x = _W*0.5; levelText.y = scoreText.y + 20
 fgGroup:insert(levelText)
end

local function updateTexts()
 scoreText.text = "Score: "..score
 levelText.text = "Level: "..wave
end

local function gameLoop(event)
  checkNSpawnEnemy()
  moveStarField()
  moveEnemy()
  moveWeapon()
  updateTexts()
end


댓글 없음:

댓글 쓰기