cocos creator 做乙個塗鴉跳躍

2021-08-28 07:30:59 字數 4510 閱讀 6987

cocos creator 做乙個塗鴉跳躍

問題1:如何實現主角跟隨

問題2:如何實現向上跳動時,所有跳板都能穿透,向下掉落時,所有跳板都能彈起

問題3:如果實現不同跳板有不同的彈跳高度

問題4:如何實現背景滾動

問題5:新增怪物

問題6:新增子彈

實現主角跟隨

cocos 有乙個攝像機的概念,在攝像機裡面的東西,就能看到,在這之外 的就看不到,所以,只需要把攝像機一直跟著主角,就能實現主角跟隨的效果了

**其實就一點點:

cc.class 

lateupdate: (dt) ->

targetpos = this.player.converttoworldspacear(cc.vec2.zero)

pos = this.node.parent.converttonodespacear(targetpos)

this.node.position = cc.v2(this.node.position.x, pos.y)

return

}

因為主角在遊戲過程中,一直在移動,所以要先獲取主角的世界座標

之後為了讓攝像機和跟隨主角,需要把攝像機的座標設定成主角的座標

主角的世界座標算出來後,再把它換算成攝像機的模型座標,這樣就可以直接 setposition了

跳躍過程彈板狀態

嘗試過程很複雜,嘗試過上公升過程設定所有彈板為sensor,發現無效,嘗試過隱藏collider,也無效,最後把rigidbody隱藏就好了

於是,有了下面的步驟:

1、根據角色當前位置和上一次位置的正負,判斷角色是在上公升還是在下落

_getplayerdir: ->

@_lastplayery ?= 0

playerpos = this.player.converttoworldspacear(cc.vec2.zero)

dir = "up"

if playerpos.y > @_lastplayery

dir = "up"

else

dir = "down"

@_lastplayery = playerpos.y

return dir

2、上公升時隱藏所有彈板的rigidbody

3、下降時顯示所有彈板的rigidbody

_changerigidbodyactive: (dt) ->

return unless @_istimeok()

playerdir = @_getplayerdir()

for platform, index in @_platformlist

rigidbody = platform.getcomponent(cc.rigidbody)

rigidbody.active = playerdir is "down"

return

實現不同跳板有不同的彈跳高度

先生成三個預製體,每個預製體掛同乙個指令碼檔案

然後在指令碼屬性裡,設定不同的引數即可

cc.class 

onload: ->

this.node.getcomponent(cc.physicsboxcollider).name = "impulse_platform"

@_createaction() if math.random() > 0.8

_createaction: ->

ac1 = cc.moveby(1, 200, 0)

ac2 = cc.moveby(1, -200, 0)

this.node.runaction(cc.repeatforever(cc.sequence(ac1, ac2)))

onbegincontact: (contact, selfcollider, othercollider) ->

manifold = contact.getworldmanifold()

return if manifold.normal.y isnt 1

body = othercollider.body

body.linearvelocity = cc.v2()

return

}

實現背景滾動

遊戲中攝像機是跟隨角色移動的,所以很多書上講的那種背景移動,即迴圈減乙個數,減到小於一定值後,再重置回去的方法,就無效了。因為這種方法是要保證攝像機不動的情況下才有用的。所以,得想另一種方法來滿足這個背景滾動

之前做過乙個動態scrollview的外掛程式,其實這個就和背景滾動的原理是一樣的。當角色往上移動時,如果最高的背景到當前位置的距離小於一定值,則把最低位置的背景移動到最高背景的上方,當角色往下降落時,如果最低位置的背景與當前位置的距離小於一定值時,則把最高位置的背景移動下最低背影的下方。

步驟為:

1、將所有layer放在乙個陣列中,這個遊戲中用到了4個

2、在update中呼叫

3、對layer按y座標按從小到大排序

4、如果要比較最遠距離的,則取陣列中最大索引值對應的layer,反之取0

cc.class 

onload: ->

@speed = 5

_filluplayer: ->

playerpos = @player.converttoworldspacear(cc.vec2.zero)

maxy = @bglayertable[@bglayertable.length - 1].getboundingbox().ymax

if maxy - playerpos.y < cc.winsize.height

@bglayertable[0].setposition(cc.v2(0, maxy + cc.winsize.height / 2))

return

_filldownlayer: ->

playerpos = @player.converttoworldspacear(cc.vec2.zero)

miny = @bglayertable[0].getboundingbox().ymin

if playerpos.y - miny < cc.winsize.height

pos = cc.v2(0, miny - cc.winsize.height / 2)

@bglayertable[@bglayertable.length - 1].setposition(pos)

return

_updatebackgroundlayer: (dt) ->

@_orderlayertable()

@_filluplayer()

@_filldownlayer()

_orderlayertable: ->

this.bglayertable.sort( (a, b) -> a.y - b.y)

update: (dt) ->

@_updatebackgroundlayer(dt)

}

新增怪物

1、建立預製體

2、寫乙個指令碼

cc.class 

onload: ->

this.node.getcomponent(cc.physicsboxcollider).name = "monster"

@_createaction()

_createaction: ->

ac1 = cc.moveby(1, 200, 0)

ac2 = cc.moveby(1, -200, 0)

this.node.runaction(cc.repeatforever(cc.sequence(ac1, ac2)))

update: (dt) ->

# do your update here

onbegincontact: (contact, selfcollider, othercollider) ->

if othercollider.name is "player"

cc.director.emit("game_over")

return

}

新增子彈

_createbullet: ->

bullet = cc.instantiate(this.bulletprefab)

this.platformrootnode.addchild(bullet)

bullet.setposition(this.player.x, this.player.y + this.player.height * 1.5)

body = bullet.getcomponent(cc.rigidbody)

body.linearvelocity = cc.v2()

speedy = this.player.getcomponent(cc.rigidbody).linearvelocity.y / 3

@_bulletlist.push bullet

做乙個programmer,而不做乙個coder

programmer是程式的思考者,而coder只是乙個執行者 勞心者製人,勞力者制於人 如果專案不緊的情況下,應該從需求做起,最好能夠窮盡所有的需求,遇到與別人模組互動的情況,規定好與別人互動的介面。然後才是開始設計,抓住需求當中的名詞,想想是否設計成為類,然後根據測試用例,來設計框架結構,至少要...

做乙個心靈富翁

你是否想過 怎樣的人生才是真的有價值?怎樣的生活才算自在而沒有遺憾?得到與失去 付出與收受 快樂與傷心 成功與失敗 我們又該如何看待其中的必然與不必然?親愛的,人生真的很複雜,複雜到我們窮其一生也難以解開奧秘 既然解不開,我們何妨單純看待呢!只要尋找一種屬於自己的簡單的幸福。簡單的幸福裡,也能有真實...

做乙個正直的人

做乙個正直的人,做乙個人格健全完善的人,受人崇敬。做乙個自私的人,做欺心的事,疾賢防能,與成功無緣。1 己所不欲,勿施於人 2 嫉妒乃方正之人之大忌 3 不做欺心事,本身是一種愉悅 踏踏實實做人,實實在在辦事。任何乙個雙手插在口袋裡的人,都爬不上成功的梯子。給人留下乙個實在的形象,給自己的成功增添乙...