Pixel Envision Ltd.
Indie Game Development Studio
  • Home
  • About Us
    • Privacy Policy
    • Press Kit
  • Our Games
    • Casual Games
      • Hordes of Enemies
      • noded
      • kubic
      • Whip Swing
      • Witches’ Brew
    • Kids Apps
      • Cars & Trucks Puzzle
      • Train Puzzles for Kids
      • Animal Puzzle
      • Fairy Tale Puzzles for Kids
      • Coloring Book
      • Find the Differences
  • Blog
  • Support
Select Page ...

Tag: CoronaSDK

Witches' Brew selected for Amazon's Free App of the Day promotion...

October 25, 2012 Amazon Apps, CoronaSDK, Google Play

Witches’ Brew – Halloween potion making fun! featured by Amazon as Free App of the Day for October 25th. If you have an Android device or a Kindle Fire, this is your chance to get it for free right before the Halloween! This is the full version that is normally $0.99, and recently updated to remove OpenFeint & unnecessary permissions…

Just click on below to go to the product page…

Corona SDK PRO License for sale...

March 11, 2012 CoronaSDK

We have decided to sell remaning time on our Corona SDK PRO license to anyone who might be looking for an opportunity like this to get started with it…

This is a PRO license that covers full privileges and supports iOS & Android… License has approximately 7 months left, expires at 2012/10/21

If you are interested in buying, simply pay using the PayPal buy button below. As soon as we receive your payment, I’ll let Carlos know about your name & email and he will do the license transfer…

Edit: It looks like (please refer to the comments) I misunderstood what Carlos said on the forum and the license is NOT transferrable. So, if you are looking for a license, you should buy it directly from ANSCA. If you are serious about the game development, it’s totally worth the investment. I’ll leave this post here for future reference for any one who might be looking for that information…

Corona Project Manager license for sale!

February 23, 2012 CoronaSDK

As you might know, we have recently decided to move away from CoronaSDK. Decision made based on our own requirements and expectations, but that won’t change the fact it still is a very good SDK which is capable of making hit games.

Anyway, due to that change we also won’t be using Corona Project Manager anymore and decided to sell our license to anyone who might be interested. I have confirmed that with Jay (CPM developer) and the license is transferable, so we are good to go…

Our asking price is $50 (1/3 off than the original price, $75), that is 33% discount…

If you are interested in buying, simply pay using the PayPal buy button below. As soon as we receive your payment, I’ll let Jay know about your name & email and he will create a new license for you…

My license is sold, thank you! But if you are looking to purchase CPM, act now. It’s the best add-on for CoronaSDK I’ve ever used!

We have stopped developing with the Corona SDK

February 14, 2012 CoronaSDK, Lua

Due to recent developments, we will no longer be using Corona SDK. If anyone wants to know why, all I can say is that’s because of all the little things stacking up on each other such as:

  • Dropping ArmV6 support, first on Android and now on iOS.
  • Forcing 32 bit frame buffers for Android (to fix gradient banding issues) which causes slowdowns, without an option to disable it.
  • Launchpad Analytics appended to each app but simply I do not want Ansca to track my apps… Yes, I know there is an option to disable this but it’ll be back on as soon as you add something like game network, ads, etc…
  • They are still adding new features while there are major stuff waiting to be fixed such as properly working masks, better (retina, rotation, etc) sprites, etc…
  • Outdated core engine, Box2D
  • Bloating app size day by day with the stuff I won’t be using such as Papaya, super rewards, etc.
  • We wanted iAds, Ansca added InMobi. We wanted iAds, Ansca added Inneractive. We wanted iAds….well, still nothing…
  • Simulator vs Device inconsistency

I still think CoronaSDK is an good alternative but simply, it’s not suited for us anymore…

Btw, following CoronaSDK projects maintained by us will be discontinued as well. If anyone wants to continue working on those projects may do so freely.

Autocomplete Wordlist for Corona Project Manager (CPM) *
CoronaSDK Enhanced UI Library (ui.lua)
CoronaSDK Proper Orientation Rotation with Animation

* This project is taken over by Jay himself, thank you Jay…

For anyone looking for similar LUA based cross platform alternatives, I would suggest looking at Gideros or Moai SDK + Rapanui
Edit 2: Since I made that post, there were some improvements to the SDK such as Box2D update (appears to be WIP), new sprite API, off-screen culling, etc. I’m glad to see things are improving…

Autocomplete Wordlist for Corona Project Manager (CPM)

December 9, 2011 CoronaSDK, Lua

If you are serious about mobile development using CoronaSDK there is one tool you should definitely check out, Corona Project Manager by J. A. Whye. For me, it’s an organic extension to CoronaSDK and makes it very easier to work with.

One of the most important features of CPM is the autocomplete function. It speeds up my coding but also it reminds me the functions I might have forgotten at the time, or functions recently added which might make things easier. Because of that, I’d like to keep it up-to-date. You may copy & paste the following list to keep yours updated as well! ;)

Updated on December 9, 2011 for Corona SDK 2011.701+

analytics.init (  )
analytics.logEvent (  )
and
assert(   )
audio.dispose (  )
audio.fade ( [ { [channel=] [, time=] [, volume= ] } ] )
audio.fadeOut ( [ { [channel=] [, time=] } ] )
audio.findFreeChannel (  )
audio.freeChannels
audio.getDuration (  )
audio.getMaxVolume ( { channel= } )
audio.getMinVolume ( { channel= } )
audio.getVolume ( [ { channel= } ] )
audio.isChannelActive (  )
audio.isChannelPaused (  )
audio.isChannelPlaying (  )
audio.loadSound (   )
audio.loadStream (   )
audio.pause (  )
audio.play (  [, { [channel=] [, loops=] [, duration=] [, fadein=] [, onComplete=]  } ] )
audio.reserveChannels (  )
audio.reservedChannels
audio.resume (  )
audio.rewind ( [  ] [, { channel= } ] )
audio.seek (   [, { channel= } ] )
audio.setMaxVolume ( , { channel= } )
audio.setMinVolume ( , { channel= } )
audio.setVolume (  [,{ channel= }] )
audio.stop (  )
audio.stopWithDelay (   )
audio.totalChannels
audio.unreservedFreeChannels
audio.unreservedUsedChannels
audio.usedChannels
body.angularDamping
body.angularVelocity
body.bodyType
body.isAwake
body.isBodyActive
body.isBullet
body.isFixedRotation
body.isSleepingAllowed
body.linearDamping
body:applyAngularImpulse (  )
body:applyForce ( , , ,  )
body:applyLinearImpulse ( , , ,  )
body:applyTorque (  )
body:getLinearVelocity ( )
body:resetMassData ( )
body:setLinearVelocity ( ,  )
break
crypto.digest ( ,   )
crypto.hmac ( , ,   )
crypto.md4
crypto.md5
crypto.sha1
crypto.sha224
crypto.sha256
crypto.sha384
crypto.sha512
display.captureScreen (  )
display.contentCenterX
display.contentCenterY
display.contentHeight
display.contentScaleX
display.contentScaleY
display.contentWidth
display.getCurrentStage ( )
display.loadRemoteImage ( , ,  ,    )
display.newCircle( , ,  )
display.newGroup ( )
display.newImage(    )
display.newImage(      )
display.newImageRect (    ,  )
display.newLine(  , , ,  )
display.newRect(  , , ,  )
display.newRoundedRect(  , , , ,  )
display.newText(  "", , , ,  )
display.save ( ,   )
display.screenOriginX
display.screenOriginY
display.setDefault( , , ,   )
display.setStatusBar (  )
display.statusBarHeight
display.viewableContentHeight
display.viewableContentWidth
do
easing.inExpo ( , , ,  )
easing.inOutExpo ( , , ,  )
easing.inOutQuad ( , , ,  )
easing.inQuad ( , , ,  )
easing.linear ( , , ,  )
easing.outExpo ( , , ,  )
easing.outQuad ( , , ,  )
else
elseif
end
error (   )
event.accuracy
event.altitude
event.city
event.cityDetail
event.count
event.country
event.countryCode
event.delta
event.direction
event.errorCode
event.errorMessage
event.force
event.friction
event.geographic
event.id
event.invalidProducts
event.isError
event.isShake
event.latitude
event.longitude
event.magnetic
event.name
event.object1
event.object2
event.other
event.phase
event.postalCode
event.products
event.region
event.regionDetail
event.source
event.speed
event.sprite
event.street
event.streetDetail
event.time
event.transaction
event.type
event.url
event.x
event.xGravity
event.xInstant
event.xStart
event.y
event.yGravity
event.yInstant
event.yStart
event.zGravity
event.zInstant
facebook.login ( ,   )
facebook.logout ( )
facebook.request (   )
facebook.showDialog (  )
false
file:close ( )
file:flush ( )
file:lines ( )
file:read (    )
file:seek (   )
file:setvbuf (   )
file:write (    )
for
function
getfenv (  )
getmetatable (  )
group.numChildren
group:insert(  ,  )
group:remove (  )
if
in
io.close (  )
io.flush ( )
io.input (  )
io.lines (  )
io.open (   )
io.output (  )
io.popen ( )
io.read (    )
io.tmpfile ( )
io.type (  )
io.write (    )
ipairs (  )
joint.dampingRatio
joint.frequency
joint.isLimitEnabled
joint.isMotorEnabled
joint.jointAngle
joint.jointSpeed
joint.jointTranslation
joint.length
joint.length1
joint.length2
joint.maxForce
joint.maxMotorForce
joint.maxMotorTorque
joint.maxTorque
joint.motorForce
joint.motorSpeed
joint.motorTorque
joint.ratio
joint:getAnchorA ( )
joint:getAnchorB ( )
joint:getLimits ( )
joint:getReactionForce ( )
joint:getRotationLimits ( )
joint:removeSelf ( )
joint:setLimits ( ,  )
joint:setRotationLimits ( ,  )
local
math.abs (  )
math.acos (  )
math.asin (  )
math.atan (  )
math.atan2 ( ,  )
math.ceil (  )
math.cos (  )
math.cosh (  )
math.deg (  )
math.exp (  )
math.floor (  )
math.fmod ( ,  )
math.frexp (  )
math.huge
math.ldexp (  , )
math.log (  )
math.log10 (  )
math.max ( ,  )
math.min ( ,  )
math.modf (  )
math.pi
math.pow ( ,  )
math.rad (  )
math.random (  )
math.randomseed (  )
math.sin (  )
math.sinh (  )
math.sqrt (  )
math.tan (  )
math.tanh (  )
media.getSoundVolume ( )
media.newEventSound (   )
media.newRecording(  )
media.pauseSound ( )
media.playEventSound (    )
media.playSound(    )
media.playSound(    )
media.playVideo(  , ,  )
media.setSoundVolume(  )
media.show ( ,  )
media.stopSound ( )
module (   )
movieclip.newAnim (  )
myMap.isLocationVisible = 
myMap.isScrollEnabled = 
myMap.isZoomEnabled = 
myMap.mapType = 
myMap:addMarker ( , , [{ title="", subtitle="" } ] )
myMap:getAddressLocation (  )
myMap:getUserLocation ( )
myMap:removeAllMarkers ( )
myMap:setCenter ( , ,  )
myMap:setRegion ( , , , ,  )
native.cancelAlert (  )
native.cancelWebPopup ( )
native.getFontNames ( )
native.newFont (   )
native.newTextBox ( , , ,  )
native.newTextField ( , , ,   )
native.setActivityIndicator (  )
native.setKeyboardFocus (  )
native.showAlert ( ,   )
native.showWebPopup(   )
native.showWebPopup( , , , ,   )
network.download ( , ,  ,   )
network.request ( , ,   )
next (   )
nil
not
object.align
object.alpha
object.baseUrl
object.font
object.hasBackground
object.height
object.isHitTestable
object.isSecure
object.isVisible
object.parent
object.play ( )
object.rotation
object.size
object.strokeWidth
object.text
object.urlRequest
object.width
object.x
object.xOrigin
object.xReference
object.xScale
object.y
object.yOrigin
object.yReference
object.yScale
object:addEventListener ( ,  )
object:dispatchEvent(  )
object:getSampleRate ( )
object:getTunerFrequency ( )
object:getTunerVolume ( )
object:isRecording ( )
object:nextFrame ( )
object:play ( )
object:play { startFrame=, endFrame=, loop=, remove= }
object:previousFrame ( )
object:removeEventListener ( ,  )
object:reverse ( )
object:reverse { startFrame=, endFrame=, loop=, remove= }
object:rotate(  )
object:scale ( ,  )
object:setDrag ( drag= )
object:setFillColor ( , ,   )
object:setLabels { frameLabel1=, frameLabel2=, frameLabelN= }
object:setReferencePoint (  )
object:setSampleRate(  )
object:setStrokeColor ( , ,   )
object:setTextColor ( , ,   )
object:startRecording ( )
object:startTuner ( )
object:stop ( )
object:stopAtFrame (  )
object:stopRecording ( )
object:stopTuner ( )
object:translate ( ,  )
openfeint.downloadBlob ( ,  )
openfeint.init ( , , ,  )
openfeint.launchDashboard (  )
openfeint.launchDashboard ( ,  )
openfeint.setHighScore ( { leaderboardID=, score=  } )
openfeint.unlockAchievement (  )
openfeint.uploadBlob ( ,  )
or
os.clock ( )
os.date (  )
os.difftime ( ,  )
os.execute(  )
os.exit (  )
os.remove (  )
os.rename ( ,  )
os.time (  )
package.loaded
package.loaders
package.seeall (  )
pairs (  )
pcall ( , ,  )
physics.addBody ( ,  {density=, friction=, bounce= [,radius=]} )
physics.addBody ( ,  {density=, friction=, bounce= [,shape=]} )
physics.newJoint ( , , , ,  )
print (  )
rawequal ( ,  )
rawget ( ,  )
rawset ( , ,  )
removeSelf()
repeat
require (  )
return
select ( ,  )
setfenv ( ,  )
setmetatable ( ,  )
setReferencePoint(display.TopLeftReferencePoint)
sprite.add ( , , , , ,  )
sprite.newSpriteSet ( , ,  )
sprite.newSpriteSheet ( ,   ,  )
sprite.newSpriteSheetFromData( ,   )
spriteInstance.animating
spriteInstance.currentFrame
spriteInstance.newSprite (  )
spriteInstance.sequence
spriteInstance:addListener (  )
spriteInstance:pause ( )
spriteInstance:play ( )
spriteInstance:prepare (  )
spriteSheet:dispose ( )
stage:setFocus (  )
store.canMakePurchases
store.finishTransaction (  )
store.init (  )
store.loadProducts ( ,  )
store.purchase (  )
store.restore()
string.byte (   )
string.char (   )
string.find ( ,   )
string.format (   )
string.gmatch( ,  )
string.gsub ( , ,   )
string.len (  )
string.lower (  )
string.match ( ,   )
string.rep ( ,  )
string.reverse (  )
string.sub ( ,   )
string.upper (  )
system.getInfo(  )
system.getPreference ( ,  )
system.getTimer ( )
system.openURL (  )
system.pathForFile ( )
system.setAccelerometerInterval (  )
system.setIdleTimer (  )
system.setLocationAccuracy (  )
system.setLocationThreshold (  )
system.vibrate ( )
table.concat (   )
table.insert ( ,   )
table.maxn (  )
table.remove (   )
table.sort (   )
then
timer.cancel (  )
timer.performWithDelay ( ,   )
tonumber (   )
tostring (  )
transition.cancel (  )
transition.dissolve( , , ,  )
transition.from ( ,  )
transition.to ( ,  )
true
type (  )
unpack (   )
until
while
_G
alphabet
align
alpha
baseUrl
font
hasBackground
height
isHitTestable
isSecure
isVisible
parent
rotation
size
contentBounds
contentHeight
contentWidth
strokeWidth
text
urlRequest
width
xOrigin
xReference
xScale
yOrigin
yReference
yScale
addEventListener ( ,  )
dispatchEvent(  )
getSampleRate ( )
getTunerFrequency ( )
getTunerVolume ( )
isRecording ( )
nextFrame ( )
play ( )
play { startFrame=, endFrame=, loop=, remove= }
previousFrame ( )
removeEventListener ( ,  )
reverse ( )
reverse { startFrame=, endFrame=, loop=, remove= }
rotate(  )
scale ( ,  )
setDrag ( drag= )
setFillColor ( , ,   )
setLabels { frameLabel1=, frameLabel2=, frameLabelN= }
setReferencePoint (  )
setSampleRate(  )
setStrokeColor ( , ,   )
setTextColor ( , ,   )
startRecording ( )
startTuner ( )
stop ( )
stopAtFrame (  )
stopRecording ( )
stopTuner ( )
translate ( ,  )
math.round(  )
table.copy( ,   )
table.indexOf( ,  )
credits.init( , ,  )
credits.requestUpdate( )
credits.showOffers( )
event.newCredits
event.totalCredits
graphics.newMask(    )
display.remove(  )
object:contentToLocal( ,  )
object:localToContent( ,  )
object:removeSelf( )
object:setMask(  )
object:toBack( )
object:toFront( )
object.contentBounds
object.contentHeight
object.contentWidth
object.isHitTestMasked
object.maskRotation
object.maskScaleX
object.maskScaleY
object.maskX
object.maskY
object:append( ,  )
object:setColor( , ,   )
native.newMapView( , , ,  )
system.DocumentsDirectory
system.ResourceDirectory
system.TemporaryDirectory
system.activate(  )
system.orientation( )
network.canDetectNetworkStatusChanges
network.setStatusListener( ,  )
native.systemFont
event.address
event.isConnectionOnDemand
event.isConnectionRequired
event.isInteractionRequired
event.isReachable
event.isReachableViaCellular
event.isReachableViaWiFi
event.channel
event.completed
event.handle
event.action
event.index
event.target
event.numTaps
object.inputType = 
physics.getGravity( )
physics.pause( )
physics.setDrawMode(  )
physics.setGravity( ,  )
physics.setPositionIterations(  )
physics.setScale(  )
physics.setVelocityIterations(  )
physics.start(  )
physics.stop( )
body.isSensor
joint.reactionTorque
spriteInstance.timeScale
sprite.newSpriteMultiSet({ { sheet = , frames = { n1, n2, nx} }, })
audio.supportsSessionProperty
audio.setSessionProperty( ,  )
audio.getSessionProperty(  )
audio.ActiveMode
audio.MixMode
audio.OverrideMixWithOthers
audio.OtherAudioIsPlaying
audio.OtherMixableAudioShouldDuck
audio.AmbientMixMode
audio.SoloAmbientMixMode
audio.MediaPlaybackMixMode
audio.RecordAudioMixMode
audio.PlayAndRecordMixMode
system.setGyroscopeInterval( )
system.hasEventSource(  )
event.deltaTime
event.xRotation
event.yRotation
event.zRotation
gameNetwork.init (   )
gameNetwork.request (   )
gameNetwork.show (   )
json.encode(  )
json.decode(  )
json.null()
event.keyName
event.phase
event.name
physics.removeBody(  )
timer.pause(  )
timer.resume(  )
ads.init( ,  )
ads.show(   )
ads.hide( )
object.isEditable
graphics.newGradient( ,   )
system.scheduleNotification(   )
system.scheduleNotification(   )
system.cancelNotification(  )
display.newRetinaText(  "", , ,  ,  )
display.newEmbossedText(  "", , ,  , ,  )
widget.newButton (  )
widget.newSlider (  )
widget.newScrollView (  )
widget.newTableView (  )
widget.newTabBar (  )
widget.newPickerWheel (  )
widget.setTheme (  )
storyboard.newScene ( )
storyboard.gotoScene (  ""  )
storyboard.purgeScene ( "" )
storyboard.removeScene ( "" )
storyboard.getPrevious ( )
storyboard.getScene ( "" )
storyboard.purgeAll ( )
storyboard.removeAll ( )
system.setLocationThreshold(  )

CoronaSDK Enhanced UI Library (ui.lua)

August 3, 2011 CoronaSDK, Lua

While working with CoronaSDK I ended up using ui.lua for the buttons in our upcoming iPhone/iPad game. But I had hard time locating the latest version as many other developers had their own versions.

So, I have decided to make an ultimate latest version that will combine all previous enhancements along with my own. Copy of that Lua code is still available at Ansca code exchange.

NEW: Updated to eliminate the use of LUAs deprecated module() function. This is an internal change only, usage stays the same.
NEW: Added event support, now returns even.target, event.x & event.y values. You can use x/y values to provide different actions based on the coordinates of the touch event reative to the x/y size of the button image.
NEW: isActive state enhanced, so the button can be enabled/disabled without checking current isActive state with if-then.

ui.lua v2.4
-- ui.lua (currently includes Button class with labels, font selection and optional event model)

-- Version 2.4
-- Based on the folowing original provided by Ansca Inc.
-- Version 1.5 (works with multitouch, adds setText() method to buttons)
--
-- Copyright (C) 2010 ANSCA Inc. All Rights Reserved.
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy of
-- this software and associated documentation files (the "Software"), to deal in the
-- Software without restriction, including without limitation the rights to use, copy,
-- modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
-- and to permit persons to whom the Software is furnished to do so, subject to the
-- following conditions:
--
-- The above copyright notice and this permission notice shall be included in all copies
-- or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-- INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-- PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-- FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- DEALINGS IN THE SOFTWARE.

-- Version 1.6 Works with Dynamic Scaling.
-- Based on the work edited by William Flagello, williamflagello.com
-- Original from https://developer.anscamobile.com/code/ui-library
--
-- Version 1.7 Dynamic Scaling text fixes by Jonathan Bebe
-- http://developer.anscamobile.com/forum/2010/12/17/easily-make-your-text-sharp-retina-displays#comment-18164
-- Provided in Ghosts & Monsters Sample Project
--
-- Version 1.71 Retina Updates by Jonathan Bebe
-- http://developer.anscamobile.com/forum/2010/12/17/easily-make-your-text-sharp-retina-displays#comment-38284
-- Adapted to 1.7 base code by E. Gonenc, pixelenvision.com
--
-- Version 1.8 added support for providing already realized display-objects for use in Tiled/Lime
-- Based on the file changed by Frank Siebenlist
-- http://developer.anscamobile.com/forum/2011/02/19/enhanced-uilua-v15
-- Adapted to 1.7 base code by E. Gonenc, pixelenvision.com
--
-- Version 1.9
-- Added transparency & scaling options to use as over state. newLabel updated to support retina text.
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 1.91
-- Added suggested fix for overlapping buttons by Jonathan Bebe
-- http://jonbeebe.net/to-return-true-or-not-to
-- Adapted by E. Gonenc, pixelenvision.com
--
-- Version 2.02
-- Button text will now follow scaling & alpha states of over button
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 2.1
-- Added suggested .isActive update by monoxgas http://developer.anscamobile.com/code/enhanced-ui-library-uilua#comment-49272
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 2.2
-- Updated to eliminate the use of LUAs deprecated module() function. This is an internal change only, usage stays the same.
-- http://blog.anscamobile.com/2011/09/a-better-approach-to-external-modules/
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 2.3
-- Updated to use object.contentBounds instead of deprecated object.stageBounds
-- Added event support, now returns even.target, event.x & event.y values. You can use x/y values to provide different actions
-- based on the coordinates of the touch event reative to the x/y size of the button image.
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 2.4
-- isActive state enhanced to button can be enabled/disabled without checking current isActive state with if-then.
-- ie. btn.isActive = true (Default state, button is enabled) btn.isActive = false (button is disabled, no animation and action)
-- Edited by E. Gonenc, pixelenvision.com

local M = {}

-------------
-- convenience test functions added by Frank.

local coronaMetaTable = getmetatable(display.getCurrentStage())

--- Test function that returns whether object is a Corona display object.
-- Note that all Corona types seem to share the same metatable...
local isDisplayObject = function(o)
        return type(o) == "table" and getmetatable(o) == coronaMetaTable
end

-----------------
-- Helper function for newButton utility function below
local function newButtonHandler( self, event )

        local result = true

        local default = self[1]
        local over = self[2]
        local txt1,txt2,txt3

        local OX,OY,SX,SY,SM
        if self[3] then txt1 = self[3] end
        if self[4] then txt2 = self[4] end
        if self[5] then txt3 = self[5] end
        if txt1 or txt2 or txt3 then
        if display.contentScaleX < 1.0 or display.contentScaleY < 1.0 then SM = 2 else SM = 1 end
		OX,OY = (over.xScale/default.xScale),(over.yScale/default.yScale)
		SX,SY = (default.xScale/over.xScale),(default.yScale/over.yScale)
        end

        -- 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
		buttonEvent.isActive = self.isActive
		buttonEvent.target = self
        local phase = event.phase
        if self.isActive then
        if "began" == phase then
                if over then
                        default.isVisible = false
                        over.isVisible = true
                if txt1 then txt1:scale(OX,OY);txt1.alpha = over.alpha end
                if txt2 then txt2:scale(OX,OY);txt2.alpha = over.alpha end
                if txt3 then txt3:scale(OX,OY);txt3.alpha = over.alpha end
                end

                if onEvent then
                        buttonEvent.phase = "press"
                        buttonEvent.x = event.x - self.contentBounds.xMin
                        buttonEvent.y = event.y - self.contentBounds.yMin
                        result = onEvent( buttonEvent )
                elseif onPress then
                        result = onPress( event )
                end

                -- Subsequent touch events will target button even if they are outside the contentBounds of button
                display.getCurrentStage():setFocus( self, event.id )
                self.isFocus = true

        elseif self.isFocus then
                local bounds = self.contentBounds
                local x,y = event.x,event.y
                local isWithinBounds =
                        bounds.xMin = x and bounds.yMin = 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
                        if txt1 and not isWithinBounds and txt1.xScale*SM == OX then txt1:scale(SX,SY);txt1.alpha = default.alpha
                        elseif txt1 and isWithinBounds and txt1.xScale*SM ~= OX then txt1:scale(OX,OY);txt1.alpha = over.alpha end
                        if txt2 and not isWithinBounds and txt2.xScale*SM == OX then txt2:scale(SX,SY);txt2.alpha = default.alpha
                        elseif txt2 and isWithinBounds and txt2.xScale*SM ~= OX then txt2:scale(OX,OY);txt2.alpha = over.alpha end
                        if txt3 and not isWithinBounds and txt3.xScale*SM == OX then txt3:scale(SX,SY);txt3.alpha = default.alpha
                        elseif txt3 and isWithinBounds and txt3.xScale*SM ~= OX then txt3:scale(OX,OY);txt3.alpha = over.alpha end
                        end

                elseif "ended" == phase or "cancelled" == phase then
                        if over then
                                default.isVisible = true
                                over.isVisible = false
                        if txt1 and txt1.xScale*SM == OX then txt1:scale(SX,SY);txt1.alpha = default.alpha end
                        if txt2 and txt2.xScale*SM == OX then txt2:scale(SX,SY);txt2.alpha = default.alpha end
                        if txt3 and txt3.xScale*SM == OX then txt3:scale(SX,SY);txt3.alpha = default.alpha end
                        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"
                                                buttonEvent.x = event.x - bounds.xMin
                                                buttonEvent.y = event.y - bounds.yMin
                                                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
        end
        return true

end

---------------
-- Button class

local function newButton( params )
        local button, defaultSrc , defaultX , defaultY , overSrc , overX , overY , overScale , overAlpha , size, font, textColor, offset

        local sizeDivide = 1
 	   local sizeMultiply = 1

        if display.contentScaleX < 1.0 or display.contentScaleY < 1.0 then
                sizeMultiply = 2
                sizeDivide = 0.5
        end

        if params.defaultSrc then
                button = display.newGroup()
                if isDisplayObject(params.defaultSrc) then
                        default = params.defaultSrc
                else
                        default = display.newImageRect ( params.defaultSrc , params.defaultX , params.defaultY )
                end
                button:insert( default, false )
        end

        if params.overSrc then
                if isDisplayObject(params.overSrc) then
                        over = params.overSrc
                else
                        over = display.newImageRect ( params.overSrc , params.overX , params.overY )
                end
                if params.overAlpha then
                        over.alpha = params.overAlpha
                end
                if params.overScale then
                        over:scale(params.overScale,params.overScale)
                end
                over.isVisible = false
                button:insert( over, false )
        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 * sizeMultiply

                -- 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 = sizeDivide; labelHighlight.yScale = sizeDivide
                        labelShadow.xScale = sizeDivide; labelShadow.yScale = sizeDivide
                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 = sizeDivide; labelText.yScale = sizeDivide
        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
M.newButton = newButton

--------------
-- Label class

local function newLabel( params )
        local labelText
        local size, font, textColor, align
        local t = display.newGroup()

        local sizeDivide = 1
 	   local sizeMultiply = 1

        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 * 2 )
                        labelText.xScale = 0.5; labelText.yScale = 0.5
                        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.contentWidth * 0.5
                        elseif ( align == "right" ) then
                                labelText.x = (left + width) - labelText.contentWidth * 0.5
                        else
                                labelText.x = ((2 * left) + width) * 0.5
                        end
                end

                labelText.y = top + labelText.contentHeight * 0.5

                -- Public methods
                function t:setText( newText )
                        if ( newText ) then
                                labelText.text = newText

                                if ( "left" == align ) then
                                        labelText.x = left + labelText.contentWidth * 0.5
                                elseif ( "right" == align ) then
                                        labelText.x = (left + width) - labelText.contentWidth * 0.5
                                else
                                        labelText.x = ((2 * left) + width) * 0.5
                                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
M.newLabel = newLabel

return M
12»
  • Tweets by PixelEnvision

  • Recent Comments

    • Yogesh Singh on ZIP (POSTAL) Code Validation Regex & PHP code for 12 Countries
    • Admin on Maxscript – Vray Cubemap Generator for Unity
    • charlie on Maxscript – Vray Cubemap Generator for Unity
    • Mastan on PHP Currency Converter
    • Rakesh Vishnoi on ZIP (POSTAL) Code Validation Regex & PHP code for 12 Countries
  • Tags

    Coming Soon CoronaSDK Featured Flash Lua PHP Programming Reviews Tips & Tricks Unity 3D Windows Phone
    • Find us on

      amazonandroidapplefacebooklinkedinrsstwitterwindowsyoutube
    • Company Information

      Pixel Envision Limited is a company registered in England, company number: 09558675. Registered Office: Preston Park House, South Road, Brighton, East Sussex, BN1 6SB, United Kingdom

    • Press Kit
    • Privacy Policy
    Copyright © 2011-2018 Pixel Envision Ltd, all rights reserved.
    We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it.OKNoPrivacy policy
    Revoke cookies