self 在lua中相当于java中的this

lua中的任何变量在没有赋值前, 都可以看做是nil

 lua变量有3种,
成员变量: self.变量名 = 
局部变量: local 变量名 = 
全局变量: 变量名 = 
 
在一个游戏中和逻辑有关的动作最好不用transition 因为不可控且不稳定
物体的移动可以用update的方法实现:

设置一个角色每帧移动的项目距离,比如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.

修改方法:

 self._imgSpr: 改成 self: 
 注意self. 和self:的区别。

心得:

在平时写代码的过程中要有意识的封装一些常用的函数。函数的复用性还是很高的。可以自己做一个functions.lua的文件。然后所有的通用函数都放这里,把这个文件require一下,就可以直接用里面的函数了。

出错的地方多写一些print帮助查错也是很有帮助的。

 CCNode里的这些方法 setPosition,setScale,setRotation 等等这类的方法,只要不重新set,这些值是不会变的,有些不需要变的值,不用每次update都去set,比如角度如果定好了不变,就不需要每次都去set了。
 
 另外。因为lua的特性。比如CCNode里有一个叫 aaa 函数,而你继承CCNode的时候,自己做了一个 self.aaa的变量。这样的话,父类的aaa函数就会失效了。。

所以我建议大家把类成员变量做一些特殊标记。比如我一般都会用 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 旋转子弹的实现中我学到的的更多相关文章

  1. cocos2dx与Lua以及quick cocos

    1.cocos2dx中的脚本架构与组件 2.quick cocos的开发优势 3.自定义c++类如何导出到lua

  2. Quick Cocos (2.2.5plus)CoinFlip解析(MenuScene display AdBar二次封装)

    转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621 从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工 ...

  3. 三维空间旋转和Three.JS中的实现

    三维空间中主要有两种几何变换,一种是位置的变换,位置变换和二维空间的是一样的.假设一点P(X1,Y1,Z1) 移动到Q(X2,Y2,Z2)只要简单的让P点的坐标值加上偏移值就可以了.但是三维空间的旋转 ...

  4. 【LeetCode】Find Minimum in Rotated Sorted Array 找到旋转后有序数组中的最小值

     本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4032570.html 原题: Suppose a sorted array is ...

  5. quick cocos 的scheduler 定时器

    cocos2dx原生lua对于定时器的写法: 1.每帧调用: void scheduleUpdateWithPriority(int priority) void scheduleUpdateWith ...

  6. quick Cocos 2dx 学习网站

    http://quick.cocoachina.com/wiki/doku.php?id=zh_cn http://www.cocoachina.com/ http://www.cocoachina. ...

  7. quick cocos 暂停场景

    local MainScene = class("MainScene", function() return display.newScene("MainScene&qu ...

  8. quick cocos map使用

    '''lua local MainScene = class("MainScene", function() return display.newScene("MainS ...

  9. LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...

随机推荐

  1. WPF 开发 WebBrowser

    WebBrowser WebBrowser 报错如何屏蔽 CEF(Chromium Embedded Framework)       参考 WPF, Chrome Embedded and WebA ...

  2. jquery $.each终止本次循环

    1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环. 2.而在jquery中 $.each则对应的使用return true 进入下一个循环,return ...

  3. Dubbo学习之简单环境搭建

    Dubbo服务的发展和作用: 首先,看下一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后的常规方案演进历程. 其次,当服务越来越多之后,我们需要做哪些服务治理? 最后,是d ...

  4. [No000095].Net入门级逆向工程-1.SpreadsheetGear汉化

    一.SpreadsheetGear汉化 最近,我们的有个项目要用到表格功能,由于历(la)史(ji)遗(kuang)留(jia)的问题,我们不得不用第三方的一个插件SpreadsheetGear来实现 ...

  5. html之select标签

    循环select标签 <select name="group_id"> {% for row in group_list %} <option value={{r ...

  6. [LeetCode] Plus One 加一运算

    Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...

  7. [LeetCode] Anagrams 错位词

    Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...

  8. JAVA的反射理解

    1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...

  9. CSS清除浮动float方法总结

    使用浮动造成的BUG: 使用浮动前:(子节点是将父节点撑开了) 代码如下 <div class="box"> <div class="d1"& ...

  10. CSS:position:fixed使用(转)

    position属性规定元素的定位类型,即建立元素布局所用的定位机制.任何元素都可以定位,不过绝对定位或固定定位元素会生成一个块级框,而不论该元素本身是什么类型.相对定位元素会相对于它在正常流中的默认 ...