第一个cocos2dx-lua游戏--蚂蚁进洞


lua蛮小巧的,比用c++来做简单,c++内存管理,字符串操作都太麻烦,这点脚本就是好用啊。

但cocos配合lua,编译模拟器时也不好,要编译好久,而且占用空间几个g几个g地增长,需要装vs2012以上的版本,怎么能这样呢,哥的老电脑怎么跑啊,还有就是cocos搭配lua现在的资料太少,不好学啊。

现在开始做游戏吧

在建立cocos游戏项目时,它会自己生成一个游戏,《杀死蚂蚁》,我就不用自带的游戏代码了,当做参考,自己动手实现游戏逻辑。

有两个场景




第一个场景中点击play按钮后,进入第二个场景


第一个场景主要代码

local function main()
    local sceneGame = cc.Scene:create()
    local layer = createdInGameLayer()
    sceneGame:addChild(layer);
    local label = cc.Label:createWithSystemFont("Hello Cocos!","Gadugi",25)
    label:setPosition(500,100)
    label:setVisible(true)
    label:setTextColor(cc.c4b(0,0,255,255))
    layer:addChild(label)
    layer:setTouchEnabled(true)
    
    --ccp replaced by cc.p(x,y)
    ---ccc4 replaced by cc.c4b
    
    local bgObj = display.newSprite("MainSceneBg.jpg")
    bgObj:move(display.center):addTo(sceneGame)
    local playBt = display.newSprite("PlayButton.png")
    playBt:setScale(0.5,0.5)
    playBt:move(display.center):addTo(bgObj)
    playBt:setPositionY(100)
    local function onTouchBegin(touch, x, y)
        local rect = playBt:getBoundingBox()
         if containsPoint(rect, cc.p(x, y)) then
         	switchScene()
         end
    	return false
    end
    -- (onTouchBegin,true,0,false)它的回调函数的第二个参数是个table,table[1], table[2]是坐标
    layer:registerScriptTouchHandler(onTouchBegin);
    cc.Director:getInstance():replaceScene(sceneGame)
end

--local status, msg = xpcall(main, __G__TRACKBACK__)
--if not status then
 --   error(msg)
--end
main()
还需要这些代码:
cc.FileUtils:getInstance():setPopupNotify(false)
cc.FileUtils:getInstance():addSearchPath("src/")
cc.FileUtils:getInstance():addSearchPath("res/")

require "config"
require "cocos.init"

主要知识点:

1.显示场景

local scene = cc.Scene:create()
cc.Director:getInstance():replaceScene(scene)


2.显示图片

    local layer = createdInGameLayer()
    sceneGame:addChild(layer);

    local bgObj = display.newSprite("MainSceneBg.jpg")
    bgObj:move(display.center):addTo(sceneGame)
    local playBt = display.newSprite("PlayButton.png")
    playBt:setScale(0.5,0.5)
    playBt:move(display.center):addTo(bgObj)
    playBt:setPositionY(100)



	local bg = cc.Sprite:create("PlaySceneBg.jpg")
	bg:setPosition(cc.p(566,320))
	layer:addChild(bg)


3.处理点击事件

layer:setTouchEnabled(true)

    local function onTouchBegin(touch, x, y)
        local rect = playBt:getBoundingBox()
         if containsPoint(rect, cc.p(x, y)) then
         	switchScene()
         end
    	return false
    end
    -- (onTouchBegin,true,0,false)它的回调函数的第二个参数是个table,table[1], table[2]是坐标
    layer:registerScriptTouchHandler(onTouchBegin);

第二个场景代码:

local function switchScene()
	local scene = cc.Scene:create()
	local layer = cc.Layer:create()
	playScene = scene
	playLayer = layer
	scene:addChild(layer)
	layer:setTouchEnabled(true)
	local bg = cc.Sprite:create("PlaySceneBg.jpg")
	bg:setPosition(cc.p(566,320))
	layer:addChild(bg)

	local filename = TEXTURE_FILENAME_ANT
	local texture = display.loadImage(filename)
    local frameWidth = texture:getPixelsWide() / 3
    local frameHeight = texture:getPixelsHigh()
    local frames = {}
    for i = 0, 1 do
        local frame = display.newSpriteFrame(texture, cc.rect(frameWidth * i, 0, frameWidth, frameHeight))
        frames[#frames + 1] = frame
    end

    -- create animation
    local animation = display.newAnimation(frames, 0.15)
    -- caching animation
    display.setAnimationCache(filename, animation)

	cc.Director:getInstance():getScheduler():scheduleScriptFunc(tickUpdate,0,false)

	playLayer:registerScriptTouchHandler(
	   function(event, x, y)
	   		--移动
	   		--原生接口self.sp:runAction(cc.MoveTo:create(5, cc.p(display.cx, display.cy)))
			--antSprite:removeSelf()
			--怎么停止动画???
			for k,v in pairs(bugs) do
				if isTouchedSprite(v, x, y) then
					local deadBug = cc.Sprite:create(filename, cc.rect(frameWidth * 2, 0, frameWidth, frameHeight))
					deadBug:setPosition(cc.p(v:getPositionX(), v:getPositionY()))
					v:removeSelf()
					bugs[v] = nil
					layer:addChild(deadBug)
					audio.playSound("BugDead.wav")
					transition.fadeOut(deadBug, {time=1})
				end
			end
			return false
	   end
	)
	cc.Director:getInstance():replaceScene(scene)
end

计时器

local function tickUpdate(dt)
	lastTime = lastTime + dt
	if lastTime > 1 then
		--添加精灵
		lastTime = 0
		addBug()
	end
	checkBugHole()
end

检查蚂蚁是否进洞

local function checkBugHole()
	for _,v in pairs(bugs) do
		local point = cc.p(v:getPositionX(), v:getPositionY())
		local distance = (point.x - holePoint.x)*(point.x - holePoint.x) 
			+ (point.y - holePoint.y)*(point.y - holePoint.y)
		if distance < 10 then
			audio.playSound("BugEnterHole.wav")
			v:removeSelf()
			bugs[v] = nil
		end
	end
end
添加蚂蚁

--添加精灵
local function addBug()
	local antSprite = cc.Sprite:create(TEXTURE_FILENAME_ANT, cc.rect(0,0,frameWidth,frameHeight))
	local x,y=nil
	if math.random(1,2) == 1 then
		x = math.random(CLIENT_WIDTH)
		if math.random(1,2) == 1 then
			y = CLIENT_HEIGHT
		else
			y = 0
		end
	else
		y = math.random(CLIENT_HEIGHT)
		if math.random(1,2) == 1 then
			x = CLIENT_WIDTH
		else
			x = 0
		end
	end
	--x = holePoint.x
	--y = 0
	antSprite:setPosition(cc.p(x,y))
	playLayer:addChild(antSprite)
	bugs[antSprite] = antSprite
	local angleDelta = nil

	if x == holePoint.x then
		if y > -1 and y < 1 then
			angleDelta = 90
		else
			angleDelta = -90
		end
	else
		angleDelta = math.atan((y-holePoint.y)/(x-holePoint.x))
		angleDelta = angleDelta * 180 / 3.14159
	end
	--圆周率是多少???
	
	if x > CLIENT_WIDTH / 2 then
		if angleDelta > 0 then
			angleDelta = angleDelta - 180
		else
			angleDelta = angleDelta + 180
		end
	end
	transition.rotateTo(antSprite,{time = 0.1, rotation = -angleDelta})
	transition.moveTo(antSprite, {time = 5, x = holePoint.x, y = holePoint.y})
	antSprite:playAnimationForever(display.getAnimationCache(TEXTURE_FILENAME_ANT))
end
prite是否被点击到了
--sprite是否被点击到了
local function isTouchedSprite(sprite, x, y)
	local position = cc.p(sprite:getPositionX(), sprite:getPositionY())
	local radio = 30
	return (position.x - x) * (position.x - x) + (position.y - y) * (position.y - y) < radio * radio
end

local function containsPoint(rect, point)
return point.x >= rect.x and point.x <= rect.x + rect.width 
and point.y >= rect.y and point.y <= rect.y + rect.height
end

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值