Quick Cocos 旋转子弹的实现中我学到的
self 在lua中相当于java中的this
lua中的任何变量在没有赋值前, 都可以看做是nil
成员变量: self.变量名 =
局部变量: local 变量名 =
全局变量: 变量名 =
设置一个角色每帧移动的项目距离,比如speed = 5,然后解析几何的方法算出 speedX,和speedY的分量。
在update里,local curPos = self._imgSpr:getPositionInCCPoint()得到当前的坐标。坐标+速度,然后再setPosition就移动了。
例如:
function Bullet:update() --总函数的update调用每个子弹的update
local imagex = self._imgSpr:getPositionX();
local imagey = self._imgSpr:getPositionY();
imagex = imagex - self._speedx
imagey = imagey + self._speedy
self._imgSpr:pos(imagex, imagey)
end
lua中类的创建:
local Bullet = class("Bullet", function()
return display.newNode()
end)
speed =
function Bullet:ctor() --构造函数
--bullet父对象是node 这里把sprite对象添加到node上
self._imgSpr = display.newSprite("img1.png") --添加bullet图片
self._imgSpr:pos(,)
self._imgSpr:scale(0.5)
self:addChild(self._imgSpr)
self._speedx = nil
self._speedy = nil
end
function Bullet:init( x,y )
local mousex = x --bullet init传值 不推荐用构造函数传值 speed在这里计算出来后来直接调用即可
local mousey = y
local imagex =
local imagey =
local distance = math.sqrt((mousex - imagex)*(mousex - imagex)+(mousey - imagey)*(mousey - imagey))
local degree = math.deg(math.asin((y - imagey)/distance))
if(mousex < imagex) then
degree = - degree
end
degree = - degree
print(degree)
self._imgSpr:setRotation(degree)
self._speedx = speed*math.cos(math.rad(degree))
self._speedy = speed*math.sin(math.rad(degree))
print(self._speedx)
end
由上文可见此处的bullet类继承自node
ctor是构造函数,一般不建议传参数。若需要传参应新建一个函数 (如init)用于参数传递。
在main中新建实例时,首先要require声明此对象的文件。
例如新建bullet对象:
ClassBullet = require("app/object/Bullet") -- require相当于include
local bullet = ClassBullet.new() --bullet实例
bullet:init(x,y) --init bullet
self:addChild(bullet) --把bullet这个node添加到父节点中
table.insert(self._listBullet, bullet) --1开始 --把listBullet中对象insert到表中
第一版代码:
Bullet.lua
local Bullet = class("Bullet", function()
return display.newNode()
end)
speed =
function Bullet:ctor() --构造函数
--bullet父对象是node 这里把sprite对象添加到node上
self._imgSpr = display.newSprite("img1.png") --添加bullet图片
self._imgSpr:pos(,)
self._imgSpr:scale(0.5)
self:addChild(self._imgSpr)
self._speedx = nil
self._speedy = nil
end
function Bullet:init( x,y )
local mousex = x --bullet init传值 不推荐用构造函数传值 speed在这里计算出来后来直接调用即可
local mousey = y
local imagex =
local imagey =
local distance = math.sqrt((mousex - imagex)*(mousex - imagex)+(mousey - imagey)*(mousey - imagey))
local degree = math.deg(math.asin((y - imagey)/distance))
if(mousex < imagex) then
degree = - degree
end
degree = - degree
print(degree)
self._imgSpr:setRotation(degree)
self._speedx = speed*math.cos(math.rad(degree))
self._speedy = speed*math.sin(math.rad(degree))
print(self._speedx)
end
function Bullet:update() --总函数的update调用每个子弹的update
local imagex = self._imgSpr:getPositionX();
local imagey = self._imgSpr:getPositionY();
imagex = imagex - self._speedx
imagey = imagey + self._speedy
self._imgSpr:pos(imagex, imagey)
end
return Bullet
MainScene.lua
local MainScene = class("MainScene", function()
return display.newScene("MainScene")
end)
ClassBullet = require("app/object/Bullet") -- require相当于include
intersectLine = {left = display.c_left, right = display.c_right , top = display.c_top, bottom = display.c_bottom}
function MainScene:ctor()
local layer = display.newLayer()
layer:setTouchEnabled(true) --响应touch事件
layer:addNodeEventListener(cc.NODE_TOUCH_EVENT, --添加监听器
function(event)
return self:onTouch(event.name, event.x, event.y, event.prevX, event.prevY)
end
)
layer:setTouchSwallowEnabled(false)
self:addChild(layer)
self._imgBack = display.newSprite("back.jpg") --添加背景图片
self._imgBack:setAnchorPoint(ccp(,))
self:addChild(self._imgBack)
self._listBullet = {} --bullet table
self._scheduler = require("framework.scheduler") --事件调度器 与update搭配使用
self._scheduler.scheduleGlobal(handler(self, self.update), /)
print(intersectLine.left,intersectLine.right)
end
function MainScene:update()
for i,bullet in ipairs(self._listBullet) do --对listBullet表中的所有对象分别调用其update
bullet:update()
local bulletx = bullet:getPositionX()
local bullety = bullet:getPositionY()
print(bulletx,bullety)
p = CCPoint(bulletx, bullety)
ifHit = hitR2P(intersectLine, p)
if ifHit == true then
table.remove(self._listBullet, i)
self:removeChild(bullet)
print("delete")
end
end
end
TouchEventString = TouchEventString or {} --------鼠标事件名称
TouchEventString.began = "began"
TouchEventString.moved = "moved"
TouchEventString.ended = "ended"
TouchEventString.canceled = "canceled"
function MainScene:onTouch(name,x,y)
if name == TouchEventString.began then
local bullet = ClassBullet.new() --bullet实例
bullet:init(x,y) --init bullet
self:addChild(bullet) --把bullet这个node添加到父节点中
table.insert(self._listBullet, bullet) --1开始 --把listBullet中对象insert到表中
end
return true
end
function hitR2R(rect1,rect2)
if rect1 and rect2 then
if rect1.right > rect2.left and rect1.left < rect2.right and rect1.top > rect2.bottom and rect1.bottom < rect2.top then
return true
end
end
return false
end
function hitR2P(rect,pos)
if pos.x <= rect.left or pos.x >= rect.right or pos.y <= rect.bottom or pos.y >= rect.top then
return true
end
return false
end
return MainScene
此版代码可以实现基本的旋转和发射功能,但是并不能有效的remove飞出边界的bullet。
此处原因是对于Bullet的操作要注意不要直接操作class中的子节点,要以整个class为一个对象,在bullet层面上操作。
如此处update过程中
local imagex = self._imgSpr:getPositionX();
local imagey = self._imgSpr:getPositionY();
操作的是self._imgSpr这个精灵类,并非是bullet的position发生变化。所以在MainScene的update方法中
local bulletx = bullet:getPositionX()
local bullety = bullet:getPositionY()
print(bulletx,bullety) 得到的数总是0.
修改方法:
心得:
在平时写代码的过程中要有意识的封装一些常用的函数。函数的复用性还是很高的。可以自己做一个functions.lua的文件。然后所有的通用函数都放这里,把这个文件require一下,就可以直接用里面的函数了。
出错的地方多写一些print帮助查错也是很有帮助的。
所以我建议大家把类成员变量做一些特殊标记。比如我一般都会用 self._aaa
local Bullet = class("Bullet", function()
return display.newNode()
end)
speed =
function Bullet:ctor() --构造函数
--bullet父对象是node 这里把sprite对象添加到node上
self._imgSpr = display.newSprite("img1.png") --添加bullet图片
self._imgSpr:pos(,)
self._imgSpr:scale(0.5)
self:addChild(self._imgSpr)
self._speedx = nil
self._speedy = nil
end
function Bullet:init( x,y )
local mousex = x --bullet init传值 不推荐用构造函数传值 speed在这里计算出来后来直接调用即可
local mousey = y
local imagex =
local imagey =
local distance = math.sqrt((mousex - imagex)*(mousex - imagex)+(mousey - imagey)*(mousey - imagey))
local degree = math.deg(math.asin((y - imagey)/distance))
if(mousex < imagex) then
degree = - degree
end
degree = - degree
print(degree)
self._imgSpr:setRotation(degree)
self._speedx = speed*math.cos(math.rad(degree))
self._speedy = speed*math.sin(math.rad(degree))
print(self._speedx)
end
function Bullet:update() --总函数的update调用每个子弹的update
local imagex = self:getPositionX(); --只修改了Bullet的update函数
local imagey = self:getPositionY();
imagex = imagex - self._speedx
imagey = imagey + self._speedy
self:pos(imagex, imagey)
end
return Bullet
Quick Cocos 旋转子弹的实现中我学到的的更多相关文章
- cocos2dx与Lua以及quick cocos
1.cocos2dx中的脚本架构与组件 2.quick cocos的开发优势 3.自定义c++类如何导出到lua
- Quick Cocos (2.2.5plus)CoinFlip解析(MenuScene display AdBar二次封装)
转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621 从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工 ...
- 三维空间旋转和Three.JS中的实现
三维空间中主要有两种几何变换,一种是位置的变换,位置变换和二维空间的是一样的.假设一点P(X1,Y1,Z1) 移动到Q(X2,Y2,Z2)只要简单的让P点的坐标值加上偏移值就可以了.但是三维空间的旋转 ...
- 【LeetCode】Find Minimum in Rotated Sorted Array 找到旋转后有序数组中的最小值
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4032570.html 原题: Suppose a sorted array is ...
- quick cocos 的scheduler 定时器
cocos2dx原生lua对于定时器的写法: 1.每帧调用: void scheduleUpdateWithPriority(int priority) void scheduleUpdateWith ...
- quick Cocos 2dx 学习网站
http://quick.cocoachina.com/wiki/doku.php?id=zh_cn http://www.cocoachina.com/ http://www.cocoachina. ...
- quick cocos 暂停场景
local MainScene = class("MainScene", function() return display.newScene("MainScene&qu ...
- quick cocos map使用
'''lua local MainScene = class("MainScene", function() return display.newScene("MainS ...
- LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
随机推荐
- 【repost】JavaScript完美运动框架的进阶之旅
运动框架的实现思路 运动,其实就是在一段时间内改变left.right.width.height.opactiy的值,到达目的地之后停止. 现在按照以下步骤来进行我们的运动框架的封装: 匀速运动. 缓 ...
- HTML 学习笔记 JavaScript(面向对象)
现在让我们继续跟着大神的脚步前进 学习一下JavaScript中的面向对象的思想,其实作为一个iOS开发者,对面向对象还是比较熟悉的,但是昨晚看了一下Js中的面向对象,妈蛋 一脸萌比啊.还好有大神.让 ...
- [LeetCode] Reconstruct Itinerary 重建行程单
Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], r ...
- [LeetCode] Serialize and Deserialize Binary Tree 二叉树的序列化和去序列化
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- [LeetCode] Add Binary 二进制数相加
Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...
- knockout学习笔记10:demo
前面已经介绍了ko的基本用法,结合官方文档,基本就可以实际应用了.本章作为ko学习的最后一篇,实现一个简单的demo.主要集中在ko,所以后台数据都是静态的.类似于博园,有一个个人文章的分类列表,一个 ...
- 浅谈 Web 中前后端模板引擎的使用
前言 这篇文章本来不打算写的,实话说楼主对前端模板的认识还处在非常初级的阶段,但是为了整个 源码解读系列 的完整性,在深入 Underscore _.template 方法源码后,觉得还是有必要记下此 ...
- asp.net获取服务器绝对路径和相对路径
绝对路径 AppDomain.CurrentDomain.SetupInformation.ApplicationBase 相对路径 Server.MapPath("~/")表示当 ...
- Style样式
最重要的两个元素 :setter Trigger Style中的Setter setter是用来设置属性值的 <Style TargetType="{x:Type TextBox} ...
- C# 动态修改Config
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); confi ...