用COCOS-2DX做一个RPG游戏(一)

第一天,先用cocos创建了一个tilemap,原来以为很简单的东西,也搞了好久,任何东西,不动手做
总是以为很容易,动手做起来,就复杂很多了。但愿我能坚持下去。

lua的文档比较难找,官方的wiki就有使用的示例,而demo里面也有使用的例子。可以借助demo里面的东西来学习。

终于用tiledmap创建了一个地图,并导入到项目中使用。
    display.newSprite("HelloWorld.png")
        :move(display.center)
        :addTo(self)


这种结构蛮奇怪的,看它的意义是用第一个的返回对象去调用函数,以前写lua并没有这种方式,估计是新的。

创建了一个layer之后,并没有显示,原来是没调用 mylayer:addTo(self)。

没有控制台调试是蛮不方便的。

还有在windows调试,每次都会把资源拷贝到模拟器的目录下面。

if not exist "$(LocalDebuggerWorkingDirectory)" mkdir "$(LocalDebuggerWorkingDirectory)"
xcopy /Y /Q "$(OutDir)*.dll" "$(LocalDebuggerWorkingDirectory)"
xcopy /Y /Q "$(ProjectDir)..\Classes\ide-support\lang" "$(LocalDebuggerWorkingDirectory)"
xcopy "$(ProjectDir)..\..\..\res" "$(LocalDebuggerWorkingDirectory)\res" /D /E /I /F /Y
xcopy "$(ProjectDir)..\..\..\src" "$(LocalDebuggerWorkingDirectory)\src" /D /E /I /F /Y

在custom build step里面有上面5行,这就是每次rebuild之后拷贝那些文件执行的地方。细看了一下,有
资源 有 lua脚本 还有dll 还有语言
所以不要在working directory里面编辑lua脚本,会被覆盖的,我就踩过一次这坑。
必须单独建立一个目录来存放这些资源文件,然后debug的时候设置为工作目录就ok了,不用每次都拷贝好点


下一步是texture packer的问题,好像找不到破解版的,先用着免费版本吧。


今天看了火星救援,结局有一句话点名了我,就是 you just begin。开始了,解决一个又一个的问题,你就达成了。
那么问题来了。首先,制作一个地图,然后,我需要一个主角,能在地图上走。

现在有一张图,主角全部按规则排列上面,我要创建一个角色,用这个图做资源。然,怎么搞的呢。

话说,写一个界面容易,要创建一个游戏的结构还是不容易的,先从简单的做起吧。

第一步,创建一个类,来管理你的主角吧。

写了这么多年的python,突然被lua搞得有点头大,现在是想直接继承cocos里面的类,这个应该没什么问题。
ok,下一个目的,写一个类,继承CSprite。

先搞清楚怎么播放动画

    local sprite1 = cc.Sprite:create("res/101.png", cc.rect(0, 0, 41, 36))
    local s = cc.Director:getInstance():getWinSize()
    sprite1:setPosition( cc.p( (s.width/5)*1, (s.height/3)*1) )


先创建一个精灵

    local animFrames = {}
    for i = 1,3 do 
        local frame = cc.SpriteFrame:create( "res/101.png", cc.rect((i-1)*46, 0, 32, 36) )
        animFrames[i] = frame
    end


创建一个动画,这里是3帧的帧动画,图片是我从网上down的,所以没有plist,我就用另外的函数创建。
当然plist是最好的,而且我这里没有cache

    local animation = cc.Animation:createWithSpriteFrames(animFrames, 0.3)
    sprite1:runAction(cc.RepeatForever:create(cc.Animate:create(animation)))

    layer:addChild(sprite1, 0, 0)



这里是用精灵播放动画。

下一步是把这个放到player的类里
ok,完工了

avatar.lua
local gamePlayer = class("Player", function()
    return cc.Sprite:create()
end)

function gamePlayer:ctor()
end

function gamePlayer:Walk()
      local s = cc.Director:getInstance():getWinSize()
    self:setPosition( cc.p( (s.width/5)*3, (s.height/3)*1) )

    local animFrames = {}
    for i = 1,3 do 
        local frame = cc.SpriteFrame:create( "res/101.png", cc.rect((i-1)*46, 0, 32, 36) )
        animFrames[i] = frame
    end

    local animation = cc.Animation:createWithSpriteFrames(animFrames, 0.3)
    self:runAction(cc.RepeatForever:create(cc.Animate:create(animation)))
end

return gamePlayer



用法如下

    local sprite2 = Avatar:create()
    layer:addChild(sprite2, 0, 0)
    sprite2:Walk()



当来是相当简单好用了呢,继承了Sprite,其实继承自Sprite是不是最好的呢,或者就一个空的类如何。
先这样吧,继续下一个结构。

下一步,我要把动画都都加上cache
为了更好的控制主角的动作,我加入了cache,和通过参数传递的动作,虽然和大型的游戏动作匹配之类的机制还相差比较远。
但是看起来也有那么回事了。
avatar.lua内容如下
local gamePlayer = class("Player", function()
    return cc.Sprite:create()
end)

function gamePlayer:ctor()
    self:onCreate()
end

function gamePlayer:onCreate()
    local cache = cc.SpriteFrameCache:getInstance()
    for i = 1,3 do 
        local frame = cc.SpriteFrame:create( "res/101.png", cc.rect((i-1)*46, 0, 32, 36) )
        cache:addSpriteFrame(frame,string.format("walk_down_%d",i))
    end
    for i = 1,3 do 
        local frame = cc.SpriteFrame:create( "res/101.png", cc.rect((i-1)*46, 36, 32, 36) )
        cache:addSpriteFrame(frame,string.format("walk_right_%d",i))
    end
    for i = 1,3 do 
        local frame = cc.SpriteFrame:create( "res/101.png", cc.rect((i-1)*46, 72, 32, 36) )
        cache:addSpriteFrame(frame,string.format("walk_up_%d",i))
    end 
    for i = 1,3 do 
        local frame = cc.SpriteFrame:create( "res/101.png", cc.rect((i-1)*46, 108, 32, 36) )
        cache:addSpriteFrame(frame,string.format("walk_left_%d",i))
    end
end

function gamePlayer:Walk(position)
    local cache = cc.SpriteFrameCache:getInstance()
      local s = cc.Director:getInstance():getWinSize()
    self:setPosition( cc.p( (s.width/5)*3, (s.height/3)*1) )

    local animFrames = {}
    for i = 1,3 do 
        local frame = cache:getSpriteFrame(string.format("walk_%s_%d",position,i))
        animFrames[i] = frame
    end

    local animation = cc.Animation:createWithSpriteFrames(animFrames, 0.3)
    self:runAction(cc.RepeatForever:create(cc.Animate:create(animation)))
end

return gamePlayer


-------------------------
这不是大型rpg游戏,只是一个小demo,至于机制,结构之类的东西,我会在后面慢慢完善。
那么下一个问题是什么?
角色有了,动作有了,需要在地图上行走,那么,我的地图是随机的呢,还是固定的地图?
随机生成的地图更有挑战性,我觉得这是必须的。战斗场景,怪物?
此外还有npc角色,怪物,之类的,但是路遥一步一步走。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值