Cocos实战篇[3.2]——《战神传说》Lua版

【唠叨】

当时学Lua的时候,我将《战神传说》用Lua也写了一遍。

C++版的《战神传说》参考这篇:http://shahdza.blog.51cto.com/2410787/1549660

【源码】

https://github.com/shahdza/Cocos-Lua_Plane



【学习心得】

1、继承自cc.Sprite后,设置自身纹理图片的方式

	-- 【方式一】通过精灵帧设置
	cc.SpriteFrameCache:getInstance():addSpriteFrames("123.plist")
	local frame = cc.SpriteFrameCache:getInstance():getSpriteFrame("1.png")
	self:setSpriteFrame(frame)

	-- 【方式二】通过图片纹理
	local texture = cc.Director:getInstance():getTextureCache():addImage("ship01.png")
	local frame = cc.SpriteFrame:createWithTexture(texture, cc.rect(0, 0, 60, 38))
	self:setSpriteFrame(frame)

2、混合模式

	-- local cbl = {GL_SRC_ALPHA, GL_ONE}
	self:setBlendFunc(GL_SRC_ALPHA, GL_ONE)

3、定时器

	-- 【默认定时器】
	self:scheduleUpdateWithPriorityLua(update, priority)
	self:unscheduleUpdate()

	-- 【自定义定时器】schedule
	local dt = 0
	function GameLayer:addUpdate()
		local function update(_dt) 
			dt = _dt 
		end
		self:scheduleUpdateWithPriorityLua(update, 0)
	end

	function GameLayer:xxxxx()
		local function func()
			print(dt)
		end
		schedule(self, func, 1.0 / 60.0)
	end

4、按钮回调

	-- registerScriptTapHandler
	local function turnToLoadingScene(tag, sender)
		self:turnToLoadingScene()
	end

	local backlb = cc.Label:createWithBMFont("Font/bitmapFontTest.fnt", "Go Back")
	local pback = cc.MenuItemLabel:create(backlb)
	pback:registerScriptTapHandler(turnToLoadingScene)

5、触摸事件

	-- registerScriptHandler
	-- 【单点触摸】
	local dispatcher = self:getEventDispatcher()
	local listener = cc.EventListenerTouchOneByOne:create()
	listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN)
	listener:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED)
	listener:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED)
	dispatcher:addEventListenerWithSceneGraphPriority(listener, self)
	-- 【吞噬触摸】
	listener:setSwallowTouches(true)

6、单例类

	Effect = class("Effect", function()
		return cc.Node:create()
	end)

	local _effect = nil
	function Effect:getInstance()
		if nil == _effect then
			_effect = clone(Effect) -- 用clone() ,好像用.new()有问题
			_effect:init()
		end
		return _effect
	end

7、贝塞尔曲线运动

	local bezier = {
		cc.p(sgn * dx, 0),		-- controlPoint_1
		cc.p(sgn * dx, -dy),	-- controlPoint_1
		cc.p(0, -dy),			-- bezier.endPosition
	}
	local b0 = cc.BezierBy:create(dt, bezier)

8、动画

	-- 【方式一】通过精灵帧创建
	local arr = {}
	for i=1, 34 do
		local str = string.format("explosion_%02d.png" , i)
		-- getSpriteFrameByName -> getSpriteFrame
		local frame = cc.SpriteFrameCache:getInstance():getSpriteFrame(str)
		table.insert(arr, frame)
	end
	local animation = cc.Animation:createWithSpriteFrames(arr, 0.02)
	cc.AnimationCache:getInstance():addAnimation(animation, "Explosion")

	-- 【方式二】通过图片纹理
	local texture = cc.Director:getInstance():getTextureCache():addImage("ship01.png")
	local sp1 = cc.SpriteFrame:createWithTexture(texture, cc.rect(0, 0, 60, 38))
	local sp2 = cc.SpriteFrame:createWithTexture(texture, cc.rect(60, 0, 60, 38))
	local animation = cc.Animation:create()
	an:addSpriteFrame(sp1)
	an:addSpriteFrame(sp2)
	an:setDelayPerUnit(0.1)
	an:setRestoreOriginalFrame(true)
	self:runAction(cc.RepeatForever:create(cc.Animate:create(animation)))

9、背景滚动

	-- 【1】添加背景
	function GameLayer:addBG()
		self.bg1 = cc.Sprite:create("bg01.jpg")
		self.bg2 = cc.Sprite:create("bg01.jpg")
		self.bg1:setAnchorPoint(cc.p(0, 0))
		self.bg2:setAnchorPoint(cc.p(0, 0))
		self.bg1:setPosition(0, 0)
		self.bg2:setPosition(0, self.bg1:getContentSize().height)
		self:addChild(self.bg1, -10)
		self:addChild(self.bg2, -10)
	end
	-- 【2】背景滚动
	function GameLayer:moveBG()
		local height = self.bg1:getContentSize().height
		local function updateBG()
			self.bg1:setPositionY(self.bg1:getPositionY() - 1)
			self.bg2:setPositionY(self.bg1:getPositionY() + height)
			if self.bg1:getPositionY() <= -height then
				self.bg1, self.bg2 = self.bg2, self.bg1
				self.bg2:setPositionY(WIN_SIZE.height)
			end
		end
		schedule(self, updateBG, 0)
	end

10、物理碰撞

碰撞事件 & 条件

(1)b1.CategoryBitmask 与 b2.ContactTestBitmask 进行按位与

(2)b2.CategoryBitmask 与 b1.ContactTestBitmask 进行按位与

只有(1)、(2)都不为0的时候,触发碰撞检测事件。

物体碰撞 & 条件

(1)b1.CategoryBitmask 与 b2.CollisionBitmask 进行按位与

(2)b2.CategoryBitmask 与 b1.CollisionBitmask 进行按位与

只有(1)、(2)都不为0的时候,触发物体碰撞。

	-- 设置场景物理信息
	scene:getPhysicsWorld():setGravity(cc.p(0, 0))
	scene:getPhysicsWorld():setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL)

	-- 创建物体
	b1 = cc.Sprite:create("123.png")
	-- 半径、材质(密度、弹性、摩擦力)、偏移量
	local body = cc.PhysicsBody:createCircle(3, cc.PhysicsMaterial(0.1, 1, 0), cc.p(0, 16)) 
	b1:setPhysicsBody(body)
	b1:getPhysicsBody():setCategoryBitmask(2)
	b1:getPhysicsBody():setCollisionBitmask(3)
	b1:getPhysicsBody():setContactTestBitmask(12)

	-- 注册碰撞事件
	local function onContactBegin(contact)
		local a = contact:getShapeA():getBody():getNode()
		local b = contact:getShapeB():getBody():getNode()
		if a ~= nil and b ~= nil then
			a:setPosition(0, 0)
			b:setPosition(0, 0)
		end
		return true
	end
	local dispatcher = self:getEventDispatcher()
	local contactListener = cc.EventListenerPhysicsContact:create()
	contactListener:registerScriptHandler(onContactBegin, cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)
	dispatcher:addEventListenerWithSceneGraphPriority(contactListener, self)

11、程序结束

	-- 【方式一】
	cc.Director:getInstance():endToLua()

	-- 【方式二】
	os.exit(0)

12、问题集

	-- 【敌人管理器】
	-- 不加入层中,好像就调用不了enemyManager的方法
	self.enemyManager = EnemyManager:create(self)
	self:addChild(self.enemyManager)
时间: 2024-10-11 18:17:09

Cocos实战篇[3.2]——《战神传说》Lua版的相关文章

Cocos实战篇[3.4]——仿COC的一个小Demo总结

[唠叨] 今天结束了本学期任务最为艰巨的项目实训课程,由于项目组里其他成员基本都已经找到实习了,然后他们都去实习了.只留下我和一个小伙伴在一起搞项目实训的小游戏.经过一个月与小伙伴的配合开发,做了一个勉强可以玩的一个小游戏demo,因为平时其他课程也比较繁重,所以游戏做得非常烂~(>_<)~. 我们本来打算做一款类似COC.海盗奇兵.口袋侏罗纪.城堡争霸的城战类的单机Demo.结果--哎说多了都是泪啊,经验不足,吸取教训了. [经验教训] 由于时间比较紧张,加上自身也没有大项目开发的经验,所以

cocos2dx实战篇——Demo《战神传说》学习心得

[唠叨] 源码教程请移步:http://blog.csdn.net/iamlazybone/article/details/19612941 感谢懒骨头提供了这么多的Demo教程,对于初学者的我而言,帮助真的十分大. 注:本节仅仅记录博主自身学习<战神传说>的心得体会. [游戏截图] [学习心得] 1.CCSprite从大图里截取小图 // //CCRectMake构造为UI坐标,原点在左上角. CCSprite* sp = CCSprite::create("menu.png&qu

Cocos实战篇——作品集

[唠叨] 之前学校的WP课程大作业需要交好几个WP应用,所以随手写了几个游戏. 现在有空,把它分享给大家. [小游戏目录] CrazyDodge PaperPlane Sudoku [CrazyDodge] 0.源码 https://github.com/shahdza/Cocos_CrazyDodge 1.开发环境 > 语言:C++ > 引擎版本:Cocos2d-x v3.2 > UI编辑器:Cocos Studio 1.6.0 > 物理引擎:Cocos封装 2.WP应用已发应用

《黑客攻防技术宝典Web实战篇》.Dafydd.Stuttard.第2版中文高清版pdf

下载地址:网盘下载 内容简介 编辑 <黑客攻防技术宝典(Web实战篇第2版)>从介绍当前Web应用程序安全概况开始,重点讨论渗透测试时使用的详细步骤和技巧,最后总结书中涵盖的主题.每章后还附有习题,便于读者巩固所学内容. <黑客攻防技术宝典(Web实战篇第2版)>适合各层次计算机安全人士和Web开发与管理领域的技术人员阅读.本书由斯图塔德.平托著. 目录 编辑 第1章 Web应用程序安全与风险 1.1 Web应用程序的发展历程 [1] 1.1.1 Web应用程序的常见功能 1.1.

2天驾驭DIV+CSS (实战篇)(转)

这是去年看到的一片文章,感觉在我的学习中,有不少的影响.于是把它分享给想很快了解css的兄弟们.本文是实战篇. 基础篇[知识一] “DIV+CSS” 的叫法是不准确的[知识二] “DIV+CSS” 将你引入两大误区[知识三] 什么是W3C标准?[基础一] CSS如何控制页面[基础二] CSS选择器[基础三] CSS选择器命名及常用命名[基础四] 盒子模型[基础五] 块状元素和内联元素 实战篇[第一课] 实战小热身[第二课] 浮动[第三课] 清除浮动[第四课] 导航条(上) | 导航条(下)[大练

Cocos数据篇[3.4](5) ——CSV文件解析

[唠叨] 在一个游戏中,通常会有很多怪物.关卡.技能等数据,这些数据不可能在代码里写死,一般都会使用配置文件保存,使用时再加载到内存. CSV文件编辑起来十分简单,所以常常用来配置游戏的数据信息. 本文要介绍的是:如何读取CSV文件格式的数据. [扩展阅读] http://baike.baidu.com/subview/468993/5926031.htm (CSV百度百科) http://blog.csdn.net/stevenkylelee/article/details/38309147 

关东升的iOS实战系列图书 《iOS实战:传感器卷(Swift版)》已经上市

?? 承蒙广大读者的厚爱我的 <iOS实战:传感器卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见.http://item.jd.com/11760248.html 欢迎关注关东升新浪微博@tony_关东升. 关注智捷课堂微信公共平台,了解最新技术文章.图书.教程信息 更多精品iOS.Cocos.移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com智捷课堂论坛网站:http://51work6.com/forum.php 版权声明:本文为博主原创文

如何编写高质量的 JS 函数(4) --函数式编程[实战篇]

本文首发于 vivo互联网技术 微信公众号? 链接:https://mp.weixin.qq.com/s/ZoXYbjuezOWgNyJKmSQmTw 作者:杨昆 ?[编写高质量函数系列],往期精彩内容: <如何编写高质量的 JS 函数(1) -- 敲山震虎篇>介绍了函数的执行机制,此篇将会从函数的命名.注释和鲁棒性方面,阐述如何通过 JavaScript 编写高质量的函数. ?<如何编写高质量的 JS 函数(2)-- 命名/注释/鲁棒篇>从函数的命名.注释和鲁棒性方面,阐述如何通

caffe框架下目标检测——faster-rcnn实战篇操作

原有模型 1.下载fasrer-rcnn源代码并安装 git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git 1)  经常断的话,可以采取两步: git clone https://github.com/rbgirshick/py-faster-rcnn.git 2)  到py-faster-rcnn中,继续下载caffe-faster-rcnn,采取后台跑: git submodule update --in