Lua是一门占用资源少,跨平台,并且可以灵活扩展的编程语言
1、Lua特性
1.1.变量
不能以数字开头。变量名大小写有区别。Lua中系统保留字不能当作变量名使用的:and break do else elseif end false for function if in local nil not or repeat return then true until while .
1.2.字符串
字符串用单引号或者双引号界定,如'Lua'和“Lua”都是有效的。转义字符可以用类似C的方式在前面加反斜线(\),并将它们包含在单引号或者双引号当中。
1.3.数字
print(5) ------5 这是小数数字
print(5.3) -------5.3 这是浮点型数字
print(5.31e-2) -------0.0531这是科学计数数字
print(0xfeed) -------65261 这是十六制数字
1.4.类型
1)nil nil相当于null。假如一个变量,最后引用的值没有被垃圾回收器清空,你可以将这个变量设置为nil,表明其引用可以被垃圾回收器回收。
2)boolean 包含true 和false ,用于进行条件判断
3)number 可以定义为小数,长整型 整型 十六进制 和浮点型 。Lua中的数字会存储为双精度浮点数
4)函数 function
5)string 通常定义为8位纯字符串
6)线程 是一个特殊的变量,它指定一个独立的执行线程。跟操作系统的线程不一样
7)table表 就是数组、关联数组、集合、记录(records)、列表(Lists)、树(Trees)以及对象
2、Lua运算符
3、如何制作按钮
module(..., package.seeall)
-----------------
-- Helper function for newButton utility function below
local function newButtonHandler( self, event )
local result = true
local default = self[1]
local over = self[2]
-- General "onEvent" function overrides onPress and onRelease, if present
local onEvent = self._onEvent
local onPress = self._onPress
local onRelease = self._onRelease
local buttonEvent = {}
if (self._id) then
buttonEvent.id = self._id
end
local phase = event.phase
if "began" == phase then
if over then
default.isVisible = false
over.isVisible = true
end
if onEvent then
buttonEvent.phase = "press"
result = onEvent( buttonEvent )
elseif onPress then
result = onPress( event )
end
-- Subsequent touch events will target button even if they are outside the stageBounds of button
display.getCurrentStage():setFocus( self, event.id )
self.isFocus = true
elseif self.isFocus then
local bounds = self.stageBounds
local x,y = event.x,event.y
local isWithinBounds =
bounds.xMin <= x and bounds.xMax >= x and bounds.yMin <= y and bounds.yMax >= y
if "moved" == phase then
if over then
-- The rollover image should only be visible while the finger is within button's stageBounds
default.isVisible = not isWithinBounds
over.isVisible = isWithinBounds
end
elseif "ended" == phase or "cancelled" == phase then
if over then
default.isVisible = true
over.isVisible = false
end
if "ended" == phase then
-- Only consider this a "click" if the user lifts their finger inside button's stageBounds
if isWithinBounds then
if onEvent then
buttonEvent.phase = "release"
result = onEvent( buttonEvent )
elseif onRelease then
result = onRelease( event )
end
end
end
-- Allow touch events to be sent normally to the objects they "hit"
display.getCurrentStage():setFocus( self, nil )
self.isFocus = false
end
end
return result
end
---------------
-- Button class
function newButton( params )
local button, defaultSrc , defaultX , defaultY , overSrc , overX , overY , size, font, textColor, offset
if params.defaultSrc then
button = display.newGroup()
default = display.newImageRect ( params.defaultSrc , params.defaultX , params.defaultY )
button:insert( default, true )
end
if params.overSrc then
over = display.newImageRect ( params.overSrc , params.overX , params.overY )
over.isVisible = false
button:insert( over, true )
end
-- Public methods
function button:setText( newText )
local labelText = self.text
if ( labelText ) then
labelText:removeSelf()
self.text = nil
end
local labelShadow = self.shadow
if ( labelShadow ) then
labelShadow:removeSelf()
self.shadow = nil
end
local labelHighlight = self.highlight
if ( labelHighlight ) then
labelHighlight:removeSelf()
self.highlight = nil
end
if ( params.size and type(params.size) == "number" ) then size=params.size else size=20 end
if ( params.font ) then font=params.font else font=native.systemFontBold end
if ( params.textColor ) then textColor=params.textColor else textColor={ 255, 255, 255, 255 } end
size = size * 2
-- Optional vertical correction for fonts with unusual baselines (I'm looking at you, Zapfino)
if ( params.offset and type(params.offset) == "number" ) then offset=params.offset else offset = 0 end
if ( params.emboss ) then
-- Make the label text look "embossed" (also adjusts effect for textColor brightness)
local textBrightness = ( textColor[1] + textColor[2] + textColor[3] ) / 3
labelHighlight = display.newText( newText, 0, 0, font, size )
if ( textBrightness > 127) then
labelHighlight:setTextColor( 255, 255, 255, 20 )
else
labelHighlight:setTextColor( 255, 255, 255, 140 )
end
button:insert( labelHighlight, true )
labelHighlight.x = labelHighlight.x + 1.5; labelHighlight.y = labelHighlight.y + 1.5 + offset
self.highlight = labelHighlight
labelShadow = display.newText( newText, 0, 0, font, size )
if ( textBrightness > 127) then
labelShadow:setTextColor( 0, 0, 0, 128 )
else
labelShadow:setTextColor( 0, 0, 0, 20 )
end
button:insert( labelShadow, true )
labelShadow.x = labelShadow.x - 1; labelShadow.y = labelShadow.y - 1 + offset
self.shadow = labelShadow
labelHighlight.xScale = .5; labelHighlight.yScale = .5
labelShadow.xScale = .5; labelShadow.yScale = .5
end
labelText = display.newText( newText, 0, 0, font, size )
labelText:setTextColor( textColor[1], textColor[2], textColor[3], textColor[4] )
button:insert( labelText, true )
labelText.y = labelText.y + offset
self.text = labelText
labelText.xScale = .5; labelText.yScale = .5
end
if params.text then
button:setText( params.text )
end
if ( params.onPress and ( type(params.onPress) == "function" ) ) then
button._onPress = params.onPress
end
if ( params.onRelease and ( type(params.onRelease) == "function" ) ) then
button._onRelease = params.onRelease
end
if (params.onEvent and ( type(params.onEvent) == "function" ) ) then
button._onEvent = params.onEvent
end
-- set button to active (meaning, can be pushed)
button.isActive = true
-- Set button as a table listener by setting a table method and adding the button as its own table listener for "touch" events
button.touch = newButtonHandler
button:addEventListener( "touch", button )
if params.x then
button.x = params.x
end
if params.y then
button.y = params.y
end
if params.id then
button._id = params.id
end
return button
end
--------------
-- Label class
function newLabel( params )
local labelText
local size, font, textColor, align
local t = display.newGroup()
if ( params.bounds ) then
local bounds = params.bounds
local left = bounds[1]
local top = bounds[2]
local width = bounds[3]
local height = bounds[4]
if ( params.size and type(params.size) == "number" ) then size=params.size else size=20 end
if ( params.font ) then font=params.font else font=native.systemFontBold end
if ( params.textColor ) then textColor=params.textColor else textColor={ 255, 255, 255, 255 } end
if ( params.offset and type(params.offset) == "number" ) then offset=params.offset else offset = 0 end
if ( params.align ) then align = params.align else align = "center" end
if ( params.text ) then
labelText = display.newText( params.text, 0, 0, font, size )
labelText:setTextColor( textColor[1], textColor[2], textColor[3], textColor[4] )
t:insert( labelText )
-- TODO: handle no-initial-text case by creating a field with an empty string?
if ( align == "left" ) then
labelText.x = left + labelText.stageWidth * 0.5
elseif ( align == "right" ) then
labelText.x = (left + width) - labelText.stageWidth * 0.5
else
labelText.x = ((2 * left) + width) * 0.5
end
end
labelText.y = top + labelText.stageHeight * 0.5
-- Public methods
function t:setText( newText )
if ( newText ) then
labelText.text = newText
if ( "left" == align ) then
labelText.x = left + labelText.stageWidth / 2
elseif ( "right" == align ) then
labelText.x = (left + width) - labelText.stageWidth / 2
else
labelText.x = ((2 * left) + width) / 2
end
end
end
function t:setTextColor( r, g, b, a )
local newR = 255
local newG = 255
local newB = 255
local newA = 255
if ( r and type(r) == "number" ) then newR = r end
if ( g and type(g) == "number" ) then newG = g end
if ( b and type(b) == "number" ) then newB = b end
if ( a and type(a) == "number" ) then newA = a end
labelText:setTextColor( r, g, b, a )
end
end
-- Return instance (as display group)
return t
end
local ui = require("ui")
local on1Touched = function(event)
if event.phase=="press" then
print"just pressed sound button 1"
end
end
local sound1Button =ui.newButton{
defaulSrc ="1.png",
defaultX=54,
defaultY=224,
overSrc="1P.png"
overX=51,
overY=224,
onEvent=on1Tounched, ----按下键需要做什么事情
}