Hi Brent,
Thanks for the advice. I removed all the “hasCollided…” flags, redundant add/remove EventListeners and removed all the contents of the localCollisionEvent except for a single print line. And so far . . . . both collision errors STILL occurs.
Btw, i’m running this on Windows XP using Corona Simulator 2012.894. Maybe this info would help. I have no access to the current daily builds - yet.
-----------------------------------------------------------------------------------------
--
-- level1.lua
--
-----------------------------------------------------------------------------------------
local storyboard = require( "storyboard" )
local scene = storyboard.newScene()
local sprite = require ("sprite")
-- include Corona's "physics" library
local physics = require ("physics")
physics.start()
physics.pause()
physics.setGravity( 0, 0 ) -- no gravity vector
physics.setScale( 5 )
physics.setDrawMode( "hybrid" )
--------------------------------------------
-- forward declarations and other locals
local screenW, screenH, halfW, halfH = display.contentWidth, display.contentHeight, display.contentWidth\*0.5, display.contentHeight\*0.5
local bg
-----------------------------------------------------------------------------------------
-- BEGINNING OF YOUR IMPLEMENTATION
--
-- NOTE: Code outside of listener functions (below) will only be executed once,
-- unless storyboard.removeScene() is called.
--
-----------------------------------------------------------------------------------------
-- Called when the scene's view does not exist:
function scene:createScene( event )
local group = self.view
-- create a grey rectangle as the backdrop
bg = display.newImage("bg2.jpg",0,0)
bg:setReferencePoint( display.TopLeftReferencePoint )
bg.x, bg.y = 0, 0
local displayGroup = display.newGroup()
displayGroup:insert( bg )
displayGroup:setReferencePoint( display.TopLeftReferencePoint )
displayGroup.x, displayGroup.y = bg.x, bg.y
local activeGroup = display.newGroup()
local distanceTravelled = 4
local minX = 0
local maxX = bg.width
local minY = 0
local maxY = bg.height
-- filepath, width, height
local pteroSheet = sprite.newSpriteSheet("ptero.png",104, 50)
-- spritesheet, starting frame, number of frames
local pteroSet = sprite.newSpriteSet(pteroSheet, 1, 6 )
--spriteSet,sprite name, starting frame,# of frames,time in millis for a full animation,-2 for loop indefinite
sprite.add( pteroSet, "ptero", 1, 6, 300, -2 )
local ptero = sprite.newSprite( pteroSet )
local pteroShape = {-30,-30, 30,-30, 30,30, -30,30}
physics.addBody( ptero, {density=6.0, friction=0.3, bounce=0.0, shape=pteroShape} )
ptero.myName = "ptero"
ptero.x = screenW \* 0.5
ptero.y = screenH \* 0.25
ptero:prepare( "ptero" )
ptero:play()
activeGroup:insert(ptero)
local eventRect = display.newRect( 0, 0, bg.width, bg.height \*0.95)
eventRect.strokeWidth = 2
eventRect.alpha = 0.01
eventRect:setStrokeColor(180,0,200)
displayGroup:insert( eventRect)
-- create a grass object and add physics (with custom shape)
local grass = display.newImageRect( "grass.png", screenW \*0.25, 82 )
grass.x, grass.y = halfH, halfW
physics.addBody( grass, "static", {density=3.0, friction=0.3 } )
displayGroup:insert( grass )
-- all display objects must be inserted into group
group:insert( displayGroup )
group:insert( activeGroup)
local function onPteroFly(eventX,eventY)
-- unless when on the edges of the bg, ptero stays on the middle of the screen while sidescrolling
local function moveNextX() -- going right
--print("NextX eventX: " .. eventX .. " pteroX:" .. ptero.x .. " displayGroup.x: " .. displayGroup.x .. " maxX: " .. maxX)
if ptero.x \<= eventX then
if (ptero.x ) \>= halfW then -- greater or equal than half screen width size
if (displayGroup.x \>= -(maxX - screenW)) then --if less than the screen size of the max bg size from the right edge.
displayGroup.x=displayGroup.x - distanceTravelled -- subtract bg and the event instead of adding values to ptero.x
eventX =eventX-distanceTravelled
else
ptero.x = ptero.x + distanceTravelled
end
else
ptero.x = ptero.x + distanceTravelled
end
else
-- done, so remove listener
Runtime:removeEventListener("enterFrame", moveNextX )
eventRect.isVisible=true
end
end
local function moveBackX() -- going left
--print("BackX eventX: " .. eventX .. " pteroX:" .. ptero.x .. " displayGroup.x: " .. displayGroup.x .. " minX: " .. minX)
if ptero.x \>= eventX then
if (ptero.x) \<= halfW then -- less or equal than half screen width size
if (displayGroup.x \<= minX) then --if less than the screen size of the max bg size from the left edge.
displayGroup.x=displayGroup.x + distanceTravelled -- add bg and the event instead of subtracting values to ptero.x
eventX =eventX+distanceTravelled
else
ptero.x = ptero.x - distanceTravelled
end
else
ptero.x = ptero.x - distanceTravelled
end
else
-- done, so remove listener
Runtime:removeEventListener("enterFrame", moveBackX )
eventRect.isVisible=true
end
end
local function moveNextY() -- going down
--print("NextY eventY: " .. eventY .." pteroY:" .. ptero.y .. " displayGroup.y: " .. displayGroup.y .. " maxY: " .. maxY)
if ptero.y \<= eventY then
if (ptero.y ) \>= halfH then -- greater or equal than half screen height size.
if (displayGroup.y \>= -(maxY - screenH)) then --if less than the screen size of the max bg size from the bottom edge.
displayGroup.y=displayGroup.y - distanceTravelled -- subtract bg and the eventY instead of adding values to ptero.y
eventY =eventY-distanceTravelled
else
ptero.y = ptero.y + distanceTravelled
end
else
ptero.y = ptero.y + distanceTravelled
end
else
-- done, so remove listener
Runtime:removeEventListener("enterFrame", moveNextY )
eventRect.isVisible=true
end
end
local function moveBackY() -- going up
--print("BackY eventY: " .. eventY .. " pteroY:" .. ptero.y .. " displayGroup.y: " .. displayGroup.y .. " minY: " .. minY)
if ptero.y \>= eventY then
if (ptero.y) \<= halfH then -- less or equal than half screen height size
if (displayGroup.y \<= minY) then --if less than the screen size of the max bg size from the top edge.
displayGroup.y=displayGroup.y + distanceTravelled -- add bg and the eventY instead of subtracting values to ptero.y
eventY =eventY+distanceTravelled
else
ptero.y = ptero.y - distanceTravelled
end
else
ptero.y = ptero.y - distanceTravelled
end
else
-- done, so remove listener
Runtime:removeEventListener("enterFrame", moveBackY )
eventRect.isVisible=true
end
end
--Determines which local function to attach to the Runtime Event Listener
eventRect.isVisible=false
if ptero.x \< eventX then
ptero.xScale=1 -- the beak of ptero gives an indication of the left-right direction it is moving
Runtime:addEventListener("enterFrame", moveNextX )
else
ptero.xScale=-1
Runtime:addEventListener("enterFrame", moveBackX)
end
if ptero.y \< eventY then
ptero.yScale=-1 -- the right-side up/upside-down of ptero gives an indication of the up-down direction it is moving
Runtime:addEventListener("enterFrame", moveNextY )
else
ptero.yScale=1
Runtime:addEventListener("enterFrame", moveBackY)
end
end
local function onTapEventRect(event)
onPteroFly(event.x,event.y)
end
local function onLocalCollision( self, event )
print( "\n Collision Detected \n")
end
eventRect:addEventListener( "tap",onTapEventRect )
ptero.collision = onLocalCollision
ptero:addEventListener( "collision",ptero)
end
-- Called immediately after scene has moved onscreen:
function scene:enterScene( event )
local group = self.view
physics.start()
end
-- Called when scene is about to move offscreen:
function scene:exitScene( event )
local group = self.view
physics.stop()
end
-- If scene's view is removed, scene:destroyScene() will be called just prior to:
function scene:destroyScene( event )
local group = self.view
package.loaded[physics] = nil
physics = nil
end
-----------------------------------------------------------------------------------------
-- END OF YOUR IMPLEMENTATION
-----------------------------------------------------------------------------------------
-- "createScene" event is dispatched if scene's view does not exist
scene:addEventListener( "createScene", scene )
-- "enterScene" event is dispatched whenever scene transition has finished
scene:addEventListener( "enterScene", scene )
-- "exitScene" event is dispatched whenever before next scene's transition begins
scene:addEventListener( "exitScene", scene )
-- "destroyScene" event is dispatched before view is unloaded, which can be
-- automatically unloaded in low memory situations, or explicitly via a call to
-- storyboard.purgeScene() or storyboard.removeScene().
scene:addEventListener( "destroyScene", scene )
-----------------------------------------------------------------------------------------
return scene
Thanks again!,
merc
[import]uid: 179529 topic_id: 31601 reply_id: 129325[/import]