Total Pageviews

Sunday, May 18, 2014

នេះជា Event Collision ស្វែងរកការប៉ះទង្គិចគ្នា

Event Collision
សំរាប់ physics engine collision events ត្រូវបាន​ exposed តាមរយះ Corona event-listener model​ជាមួយនឹង three type events “collision”,”preCollision” & “postCollision”
នៅពេលដែល event ត្រូវបានរកឃើញជាមួយនឹង table listener នៅក្នុង object, ពេលនោះ certain properties ត្រូវបានដាក់ជំនួស
Object1 à target
Object2 à other
Element1 à selfElement
Element2 à otherElement
ចំណាំះ
សំរាប់ទីតាំង X & Y វាអាច influenced ដោយសារ physics.getAverageCollisionPositions() & physics.setReportCollisionInContentCoordinates()
Event position
អំឡុងពេលដែលវាបានបញ្ចប់ ended phase, the X & Y positions តែងតែសូន្យ។ នេះជាដែនកំនត់របស់ Box2D។ នៅពេលដែល collision ទាក់ទង់នឹង circle ហើយបើសិនជា collision result ត្រូវបានត្រឡប់នៅក្នុង local space ពេលនោះ local space position នៃ collision គឺតែងតែសូន្យ 0,0 នេះជាដែនកំនត់របស់ Box2D
Modifying Objects
សំរាប់ object ទាក់ទង់នឹង collision ដែលមិនត្រូវបានលុបចេញ ឬក៏  it’s properties ក្នុងអំឡុងពេល collision event។ ចូរប្រើ timer.performWithDelay() បើសិនជាចង់ modify object position values ឬក៏ other properties ជាមួយនឹង​ collision events។ ការលុបចេញនៅ object or modifying the properties នៅក្នុង collision event ដែលអាចធ្វើឪ្យវា Crash
Properties:
event.contact
ក្នុងអំឡុងពេលដែល Collision វាមាន multiple contact points ដែលកើតឡើង។ វាអាច manipulate គ្រប់ contact points ទាំងអស់ក្នុងការបង្កើត certain effects
ចំណាំះ សូមកុំ hold onto ទៅកាន់ contact object។ វាគ្រាន់តែជា valid នៅក្នុង scope នៃ collision listener
Properties:
Event.contact.istouching តើវត្ថុ២បានប៉ះគ្នាទេ? (read-only)
Event.contact.isEnabled តើ collision នឹងត្រូវដោះស្រាយឬ?​ (read-write)
Event.contact.bounce វាជា bounce factor របស់ ​collision (read-write)
Event.contact.friction វាជា friction factor របស់ collision (read-write)
សូមមើលកូដះ
local platform = display.newImage( "platform.png" )
platform.collType = "passthru"
physics.addBody( platform, "static", { bounce=0.0, friction=0.3 } )

function character:preCollision( event )
   local collideObject = event.other
   if ( collideObject.collType == "passthru" ) then
      event.contact.isEnabled = false --disable this specific collision!
   end
end

event.element1
វាជាចំនួនលេខរបស់ event.object1’s element ដែលបាន hit ជាមួយនឹង collision

event.element2
វាជាចំនួនលេខរបស់ event.object2’s element ដែលបាន hit ជាមួយនឹង collision

event.object1
វាជា reference ទៅកាន់ first object នៅក្នុង collision
សូមមើលកូដះ
local function onCollision( event )
    if ( event.phase == "began" ) then
        print( "began: " .. event.object1.myName .. " & " .. event.object2.myName )
    elseif ( event.phase == "ended" ) then
        print( "ended: " .. event.object1.myName .. " & " .. event.object2.myName )
    end
end

event.object2
វាជា reference ទៅកាន់ second object នៅក្នុង collision
សូមមើលកូដះ
local function onCollision( event )
    if ( event.phase == "began" ) then
        print( "began: " .. event.object1.myName .. " & " .. event.object2.myName )
    elseif ( event.phase == "ended" ) then
        print( "ended: " .. event.object1.myName .. " & " .. event.object2.myName )
    end
end

event.phase
សំរាប់ phase collision ច្បាស់ណាមួយនៅក្នុង physics collision listener & អាចជាមួួក្នុងចំណោមខាងក្រោមះ
Began:​ វាត្រូវបាន indicates ជាមួយនឹង collision រវាង two bodies​ នៅចំនុចចាប់ផ្តើម contact
Ended: វាត្រូវបាន indicates ជាមួយនឹង collision រវាង two bodies ត្រូវបានបំពេញ

សូមមើលកូដះ
local crate1 = display.newImage( "crate.png", 100, 200 )
physics.addBody( crate1, { density = 1.0, friction = 0.3, bounce = 0.2 } )
crate1.myName = "first crate"

local crate2 = display.newImage( "crate.png", 100, 120 )
physics.addBody( crate2, { density = 1.0, friction = 0.3, bounce = 0.2 } )
crate2.myName = "second crate"

local function onCollision( event )
    if ( event.phase == "began" ) then
        print( "began: " .. event.object1.myName .. " & " .. event.object2.myName )
    elseif ( event.phase == "ended" ) then
        print( "ended: " .. event.object1.myName .. " & " .. event.object2.myName )
    end
end

Runtime:addEventListener( "collision", onCollision )

event.name
វាជា String “collision”
event.x
វាជាចំនុចទីតាំងរបស់ X នៅក្នុង global screen coordinates ដែល collision event បានកើតឡើង
សូមមើលកូដះ
local crate1 = display.newImage( "crate.png", 100, 200 )
physics.addBody( crate1, { density = 1.0, friction = 0.3, bounce = 0.2 } )
crate1.myName = "first crate"

local crate2 = display.newImage( "crate.png", 100, 120 )
physics.addBody( crate2, { density = 1.0, friction = 0.3, bounce = 0.2 } )
crate2.myName = "second crate"

local function onCollision( event )
    if ( event.phase == "began" ) then
        print( "began: " .. event.object1.myName .. " & " .. event.object2.myName .. " at " .. event.x .. "," .. event.y )
    elseif ( event.phase == "ended" ) then
        print( "ended: " .. event.object1.myName .. " & " .. event.object2.myName .. " at " .. event.x .. "," .. event.y )
    end
end

Runtime:addEventListener( "collision", onCollision )

event.y
វាចំនុចទីតាំងរបស់ Y នៅក្នុង global screen coordinates ដែល collision event បានកើតឡើង
សូមមើលកូដះ
local crate1 = display.newImage( "crate.png", 100, 200 )
physics.addBody( crate1, { density = 1.0, friction = 0.3, bounce = 0.2 } )
crate1.myName = "first crate"

local crate2 = display.newImage( "crate.png", 100, 120 )
physics.addBody( crate2, { density = 1.0, friction = 0.3, bounce = 0.2 } )
crate2.myName = "second crate"

local function onCollision( event )
    if ( event.phase == "began" ) then
        print( "began: " .. event.object1.myName .. " & " .. event.object2.myName .. " at " .. event.x .. "," .. event.y )
    elseif ( event.phase == "ended" ) then
        print( "ended: " .. event.object1.myName .. " & " .. event.object2.myName .. " at " .. event.x .. "," .. event.y )
    end
end

Runtime:addEventListener( "collision", onCollision )


No comments:

Post a Comment