用Swift做個(gè)游戲Lecture04 —— 仙人掌的狙擊

系列:用Swift作個(gè)游戲
作者:pmst(1345614869)
微博:PPPPPPMST

本節(jié)任務(wù):

  • 隨機(jī)生成障礙物裹唆,且一對障礙物上下相距距離固定贸街,但位置隨機(jī)。

幾種情況:

y position = 0的情況:

y position = playableStart的情況:

y position = playableStart - 障礙物.size.height/2的情況:

推導(dǎo)一般情況下的公式:y position = playableStart - 障礙物.size.height/2 + (10%~60%)playgroundHeight:

上下兩個(gè)障礙物之間距離固定為3.5倍的Player尺寸的高度:

注意推導(dǎo)公式:y position = playableStart - 障礙物.size.height/2此時(shí)障礙物的頂部剛好與地面齊平,而(10%~60%)playgroundHeight是一個(gè)浮動(dòng)范圍框仔,表明障礙物超出地面的高度。顯然我們的障礙物的層級關(guān)系是在背景上面但是在Foreground的下面啃炸,因此修改早前的Layer:

enum Layer: CGFloat {
    case Background
    case Obstacle   //添加障礙物層級關(guān)系
    case Foreground
    case Player
}

01.產(chǎn)生障礙物的構(gòu)造方法

我們需要增添一個(gè)方法用于實(shí)例化一個(gè)紋理(圖片)為仙人掌的精靈(SpriteNode),設(shè)置其zPositionObstacle,請?jiān)?code>flapPlayer()方法上方新增如下方法:

func createObstacle()->SKSpriteNode{
    let sprite = SKSpriteNode(imageNamed: "Cactus")
    sprite.zPosition = Layer.Obstacle.rawValue
    return sprite
}

注意到實(shí)例方法生成一個(gè)紋理為Cactus的精靈并返回畦娄,這是之后源源不斷生成障礙物的基礎(chǔ)。

緊接著我們要有一個(gè)實(shí)例方法熟尉,作用是隨機(jī)產(chǎn)生成對的障礙物到場景中归露,步驟如下:

  1. 使用createObstacle()得到下方障礙物的實(shí)例,并將其放置緊貼右側(cè)屏幕邊線斤儿。
  2. 障礙物y軸上的放置位置范圍為10%~60%,分別計(jì)算最小與最大的y軸點(diǎn)位剧包,通過隨機(jī)函數(shù)得到兩者之間的一個(gè)數(shù)作為y值,設(shè)置障礙物的position,最后添加到worldNode節(jié)點(diǎn)中雇毫。
  3. 同理實(shí)例化上方障礙物玄捕,將其旋轉(zhuǎn)180°后放置距離下方障礙物3.5倍Player尺寸的地方,添加到worldNode節(jié)點(diǎn)中棚放。
  4. 給上下障礙物增添一個(gè)移動(dòng)Action,已一定速度自右向左移動(dòng)枚粘,倘若超出屏幕,則從父節(jié)點(diǎn)中移除飘蚯。
//新增三個(gè)常量
let kBottomObstacleMinFraction: CGFloat = 0.1
let kBottomObstacleMaxFraction: CGFloat = 0.6
let kGapMultiplier: CGFloat = 3.5

// 在createObstacle()實(shí)例方法下方增添新方法
func spawnObstacle(){
   //1
   let bottomObstacle = createObstacle()    //實(shí)例化一個(gè)精靈
   let startX = size.width + bottomObstacle.size.width/2//x軸位置為屏幕最右側(cè)
   //2
   let bottomObstacleMin = (playableStart - bottomObstacle.size.height/2) + playableHeight * kBottomObstacleMinFraction //計(jì)算障礙物超出地表的最小距離
   let bottomObstacleMax = (playableStart - bottomObstacle.size.height/2) + playableHeight * kBottomObstacleMaxFraction //計(jì)算障礙物超出地表的最大距離
   bottomObstacle.position = CGPointMake(startX, CGFloat.random(min: bottomObstacleMin, max: bottomObstacleMax))    // 隨機(jī)生成10%~60%的一個(gè)距離賦值給position
   worldNode.addChild(bottomObstacle)   //添加到世界節(jié)點(diǎn)中
   //3
   let topObstacle = createObstacle()   //實(shí)例化一個(gè)精靈
   topObstacle.zRotation = CGFloat(180).degreesToRadians()//翻轉(zhuǎn)180°
   topObstacle.position = CGPoint(x: startX, y: bottomObstacle.position.y + bottomObstacle.size.height/2 + topObstacle.size.height/2 + player.size.height * kGapMultiplier)//設(shè)置y位置 相距3.5倍的Player尺寸距離
   worldNode.addChild(topObstacle)//添加至世界節(jié)點(diǎn)中
   //4 給障礙物添加動(dòng)作
   let moveX = size.width + topObstacle.size.width
   let moveDuration = moveX / kGroundSpeed
   let sequence = SKAction.sequence([
       SKAction.moveByX(-moveX, y: 0, duration: NSTimeInterval(moveDuration)),
       SKAction.removeFromParent()
       ])
   topObstacle.runAction(sequence)
   bottomObstacle.runAction(sequence)
}

倘若你迫不及待想看看成果馍迄,將spawnObstacle方法添加至didMoveToView()最下方,點(diǎn)擊運(yùn)行局骤。一對障礙物“呼嘯而過”攀圈,然后就沒有然后了...確實(shí)目前這個(gè)方法僅僅只是產(chǎn)生一對罷了,為此我們還需要新增一個(gè)方法用于源源不斷的產(chǎn)生障礙物峦甩。請?zhí)砑尤缦聝?nèi)容到spawnObstacle()方法下方

func startSpawning(){
    //1
    let firstDelay = SKAction.waitForDuration(1.75)
    //2
    let spawn = SKAction.runBlock(spawnObstacle)
    //3
    let everyDelay = SKAction.waitForDuration(1.5)
    //4
    let spawnSequence = SKAction.sequence([
            spawn,everyDelay
        ])
    //5
    let foreverSpawn = SKAction.repeatActionForever(spawnSequence)
    //6
    let overallSequence = SKAction.sequence([firstDelay,foreverSpawn])
    runAction(overallSequence)
}
  1. 第一個(gè)障礙物生成延遲1.75秒
  2. 生成障礙物的動(dòng)作赘来,用到了先前的實(shí)例方法spawnObstacle.
  3. 之后生成障礙物的間隔時(shí)間為1.5秒
  4. 之后障礙物的生成順序是:產(chǎn)生障礙物,延遲1.5秒;產(chǎn)生障礙物凯傲,延遲1.5秒;產(chǎn)生障礙物犬辰,延遲1.5秒...可以看出[產(chǎn)生障礙物,延遲1.5秒]為一組重復(fù)動(dòng)作冰单。
  5. 使用SKAction.repeatActionForever重復(fù)4中的動(dòng)作幌缝。
  6. 將延遲1.75秒和重復(fù)動(dòng)作整合成一個(gè)SKAction的數(shù)組,然后讓場景來執(zhí)行該動(dòng)作組诫欠。

請將didMoveToView()方法中的spawnObstacle替換成startSpawning(),點(diǎn)擊運(yùn)行涵卵。

倘若覺得不錯(cuò)浴栽,請點(diǎn)擊喜歡并關(guān)注我吧..

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轿偎,隨后出現(xiàn)的幾起案子典鸡,更是在濱河造成了極大的恐慌,老刑警劉巖坏晦,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椿每,死亡現(xiàn)場離奇詭異,居然都是意外死亡英遭,警方通過查閱死者的電腦和手機(jī)间护,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挖诸,“玉大人汁尺,你說我怎么就攤上這事《嗦桑” “怎么了痴突?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狼荞。 經(jīng)常有香客問我辽装,道長,這世上最難降的妖魔是什么相味? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任拾积,我火速辦了婚禮,結(jié)果婚禮上丰涉,老公的妹妹穿的比我還像新娘拓巧。我一直安慰自己,他們只是感情好一死,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布肛度。 她就那樣靜靜地躺著,像睡著了一般投慈。 火紅的嫁衣襯著肌膚如雪承耿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天伪煤,我揣著相機(jī)與錄音加袋,去河邊找鬼。 笑死带族,一個(gè)胖子當(dāng)著我的面吹牛锁荔,可吹牛的內(nèi)容都是我干的蟀给。 我是一名探鬼主播蝙砌,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼阳堕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了择克?” 一聲冷哼從身側(cè)響起恬总,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肚邢,沒想到半個(gè)月后壹堰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骡湖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年贱纠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响蕴。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谆焊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浦夷,到底是詐尸還是另有隱情辖试,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布劈狐,位于F島的核電站罐孝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肥缔。R本人自食惡果不足惜莲兢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望续膳。 院中可真熱鬧怒见,春花似錦、人聲如沸姑宽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炮车。三九已至舵变,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瘦穆,已是汗流浹背纪隙。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扛或,地道東北人绵咱。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像熙兔,于是被迫代替她去往敵國和親悲伶。 傳聞我的和親對象是個(gè)殘疾皇子艾恼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一、實(shí)驗(yàn)?zāi)康?學(xué)習(xí)使用 weka 中的常用分類器麸锉,完成數(shù)據(jù)分類任務(wù)钠绍。 二、實(shí)驗(yàn)內(nèi)容 了解 weka 中 explo...
    yigoh閱讀 8,494評論 5 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理花沉,服務(wù)發(fā)現(xiàn)柳爽,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,736評論 25 707
  • 昨天是小籠包三周歲的生日碱屁,一大早起床就問我他的蛋糕磷脯、許愿蠟燭在哪?他告訴我他三歲了娩脾,是大人了争拐。 ...
    88d4cc69d1be閱讀 209評論 0 0
  • 寒假來了架曹。 你從遠(yuǎn)方回到家鄉(xiāng),家鄉(xiāng)可能沒有你夢想所在的城市那么繁華闹瞧,只是這里有他绑雄。 假象總是使人快樂,你擅于營造種...
    鹮妖閱讀 225評論 0 1