Total Pageviews

Tuesday, March 25, 2014

សំរាប់ Global ចុងក្រោយគេឈ្មោះ unpack()


Unpack() ប្រើសំរាប់ឪ្យតំលៃធាតុរបស់ Elements return ពី given table។​ សំរាប់ហ្វាំងសិនរបស់វាគឺស្មើនឹង
Return list[1], list[i+1],…,list[j]
ចំនុចខុសគ្នាគឺ code ខាងលើអាចសរសេរជា fixed number របស់ធាតុនោះ។ ដោយតំលៃដើមគឺ I is 1 & j is the length of the list។ ហើយវាត្រូវបាន defined ដោយរូបនេះ (#)

Syntax: unpack (list [, 1[1 j ] ] )

List(តំរូវការ)ជាតារាង ដែលធាតុត្រូវ unpacked
I(ជំរើស) ជា អិនដិចរបស់ ធាតុតារាង ដែលហ្វាំងសិននឹងចាប់ផ្តើម unpacking values ដែលតំលៃដើមគឺ១

J(ជំរើស) ជាលេខរបស់អិនដិច នៃធាតុរបស់តារាងដែល ហ្វាំងសិននឹងឈប់ unpacking ។ តំលៃដើមរបស់វាគឺ ប្រវែងរបស់ តារាងដែលតាងដោយ #

toString ហើយនឹង toNumber

Tonumber()
បើសិនជាអ្នកចង់បំលែង its argument ទៅជា លេខដូចនេះមានតែការប្រើប្រាស់ tonumber()។ បើសិនជា argument វាជាលេខស្រាប់ ឬក៏ String ហើយបំលែងជាលេខ ពេលនោះ tonumber() ត្រឡប់ជាលេខ បើមិនដូចនេះទេវាជា Nil។ ជំរើសសំរាប់ Argument អាស្រ័យលើការបកស្រាយ លេខ។

Syntax: tonumber(e [, base])
E(តំរូវការ) ជាអ្វីដែលត្រូវបំលែងជាលេខ
Base(ជំរើស) អាស្រ័យលើការបកស្រាយលេខ, វាអាចជា integer រវាងចន្លោះលេខ២នឹង​៣៦ បើសិនជាវាលើសពី១០ អក្សរ A (upper or lower case) តំណាងឧ្យ១០,  B តំណាងឪ្យលេខ១១ ហើយ z តំណាងឪ្យលេខ៣៥។ សូមមើលឧទាហរណ័ខាងក្រោមះ ក្នុងការបំលែងលេខ String 42 ទៅជា ៤២
local numString = "42"
local numValue = tonumber(numString)
if numValue ~= nil then
    -- got a number back
end

នៅពេលស្វែងយល់អំពី Global ហើយប្រាកដជាជួយបង្កើននៅសមត្ថភាពខាង Programming របស់ភាសាឡូអាច្រើន។
សូមមើល Global មួយចំនួនទៀត
Tostring()
សំរាប់ API មួយនេះគឺមានប្រយោជន៏ណាស់ដែល ជាDebug tool សំរាប់បង្ហាញ ឬក៏ concatenating នៅតំលៃ​ Nil ឬក៏បង្ហាញ displayObject table information
ចំណាំះ ដើម្បីឪ្យការគ្រប់គ្រងបានពេញលេញក្នុងការដែល លេខត្រូវបំលែងជា String សូមប្រើ string.format()

Syntax: tostring €
E(តំរូវការ)ជា Object សំរាប់បំលែងទៅជា String។ បើសិនជា metastable របស់​ e មាន tostring field ពេលនោះ tostrng() ហៅតំលៃជាមួយនឹង​e argument ហើយបញ្ចូលជាតំលៃហៅជា លទ្ធផល។

Type()
ជាប្រភេទហ្វាំងសិន, គេប្រើសំរាប់ឪ្យតំលៃវិលត្រឡប់មកវិញនៅ its argument។ ដែលតំលៃរបស់វាមានះ
Nil
Number
String
Boolean
Table
Function
Thread
Userdate


Syntax: type(v)

Set ក៏មានត្រកូលដែរ

Setfenv()
គេប្រើវាសំរាប់បញ្ចូល environment ឬក៏ table ដែលឡូអាអាចរក្សាគ្រប់ទាំង global variables ក្នុងការប្រើ ប្រាស់សំរាប់ function ដែលបានផ្តល់។

Syntax: setfenv (f, table )

F(តំរូវការ) function or number បើសិនជា f គឺជាហ្វាំងសិន ពេលនោះ setfenv() បញ្ចូលនៅ environment សំរាប់ហ្វាំងសិននោះ។ បើសិនជាលេខ environment សំរាប់ហ្វាំងសិនដែល stack level ត្រូវបានបញ្ចូល
លេខ១មានន័យថា current function ចំណែកលេខ២មានន័យថា ហ្វាំងសិនដែលបានហៅនៅ current function។ នៅពេលបញ្ចូលទៅកាន់ 0 setfenv() បានប្តូរនៅ environment ដែល running thread (ក្នុង ករណីដែលមិនមានអ្វីត្រឡប់)
Table(តំរូវការ) ជាតារាងដែលផ្ទុក New Environment

Setmetatable()
ប្រើសំរាប់បញ្ចូល metastable សំរាប់ given table (អ្នកមិនអាចប្តូរ metastable សំរាប់ប្រភេទផ្សេងពី ឡូអា) បើសិនជា Metatable គឺជា nil វានឹងលុបចេញនៅ metastable ពីតារាង។ បើសិនជា Original metastable មាន​​ _metatable field វានឹងបង្ហាញ Error។ សំរាប់ហ្វាំងសិននេះនឹងត្រឡប់មកវិញនៅតារាង ដូចគ្នាដែលផ្តលដោយ first argument របស់ហ្វាំងសិន (with its metastable now set)

Syntax: setmetatable (table, metatable)
Table(តំរូវការ)វាជាតារាងរបស់ Lua table ដែល metastable ដែលអ្នកចង់ modify
Metastable(តំរូវការ)វាជាឡូអា table ដែលបញ្ចូលជា metastable ថ្មីសំរាប់ table
សូមមើលកូដះ
local t = {}
local mt = { __index = t }

function t.new()
    return setmetatable( {}, mt )
end 

return t

ចង់ Select អីមួយអត់?


បើសិនជាតំលៃរបស់ Index ជាលេខ select() នឹងត្រឡប់មកវិញនៅគ្រប់ទាំង arguments បន្ទាប់ពី argument ចំពោះលេខ Index។ បើមិនដូចនេះទេ index គួរតែជា String # ហើយ select() ត្រឡប់មកលេខទាំងអស់សំរាប់ extra arguments ដែលវាទទួល។

Syntax: select (index, …)

Index(តំរូវការ) វាជាលេខ or String ដែល Parameter អាចជាលេខ ដែលជាករណីដែល select() នឹងត្រឡប់គ្រប់ទាំង argument number index។ បើមិនដូចនេះទេ index គួរតែជា String # and select() ដែលត្រឡប់នៅតំលៃ extra arguments ដែលវាទទួល។

សូមមើលកូដះ
-- This example demonstrates how to access individual return values
-- from a function that returns multiple values

print(string.find("hello hello", " hel"))         --> 6  9
print(select(1, string.find("hello hello", " hel"))) --> 6
print(select(2, string.find("hello hello", " hel"))) --> 9 -- This example prints the total number of extra arguments passed to the `select()` function

print(select("#", a,b,c)) --> 3

សាក់មើលត្រកូល Raw ម្តងមើល?

Rawequal()
ប្រើក្នុងការបង្ហាញស្មើគ្នា (==) ក្នុងការ​ឆែកមើលតំលៃពីរ ដោយគ្មាន invoking នៅ metamethod មួយ ហើយវាត្រឡប់ទៅជា Boolean

Syntax: rawequal ( value1, value2 )

Value1 & value2(តំរូវការ) វាជាលេខ ឬក៏ String ក្នុងការប្រៀបធៀបតំលៃពីរ
សូមមើលកូដះ
local val1 = 5
local val2 = 5
print( rawequal( val1, val2) ) -- true
                      

Rawget()
គេប្រើសំរាប់ទទួលតំលៃពិតរបស់ table [index] ដោយគ្មាន invoking នូវ metamethod ណាមួយទេ។ Table ជា Table ចំណែក index អាចជាតំលៃណាមួយ (number Or string)

Syntax: rawget (table, index)
Table(តំរូវការ) ជា Table ណាមួយ
indexG2(តំរូវការ)ជាលេខ ឬក៏ String
សូមមើលកូដះ
local t =
{
    sample = "example value",
    another = 12345
}

print( rawget( t, "sample" ) )

-- OUTPUT:"example value"


Rawset()
គេប្រើសំរាប់បញ្ចូលនៅតំលៃពិតរបស់ table [index] ទៅកាន់តំលៃ ដោយមិនចាំបាច់ invoking នៅ metamethod ណាមួយ។ Table ជា Table ចំណែក index អាចជាតំលៃណាមួយ (number Or string)

Syntax: rawest (table, index, value)

Table(តំរូវការ) ជាតារាងដែលត្រូវ Modify
Index(តំរូវការ) ជាលេខ ឬក៏ String របស់ index ចូលទៅកាន់តារាង

Value(តំរូវការ) តំលៃដែលត្រូវបញ្ចូលទៅក្នុង table [index]

ស្គាល់ Print statement អត់ Programmers?

Print()
គេថាកូដដែលខ្លាំងនោះគឺ print statement។ ទោះជាអ្នកសរសេរកូដរាប់ពាន់បន្ទាត់ពេលនោះ Print statement នឹងបង្ហាញនូវចំនុច error មានឬក៏អត់។ គេប្រើវាសំរាប់ទទួល លេខណាមួយរបស់ argument ហើយបន្ទាប់មក print តំលៃរបស់វាទៅកាន់ stdout ដោយប្រើ tostring() ហ្វាំងសិន ក្នុងការបំលែងវាទៅកាន់ Stringprint() គឺមិនត្រូវបានformatted output ប៉ុន្តែវាគ្រាន់តែជាវិធីលឿនក្នុងការបង្ហាញតំលៃ typically for debugging។ សំរាប់ formatted output សូមប្រើ string.format

តំលៃ API នេះគឺមានប្រយោជន៏ណាស់សំរាប់ ​debugging កម្មវិធីរបស់អ្នកក្នុងការ verify value របស់ ​variables ហើយនឹង display Objects ក្នុងការ verify program flow

Syntax: print (…)

…(ជំរើស) វាជាលេខឬក៏ String។ សំរាប់ text output ទៅកាន់ stdout (e.g the terminal) សំរាប់ newline character (\n) គឺត្រូវបាន appended រហូតដល់បញ្ចប់សំរាប់ fanal output string

សូមមើលកូដះ

Print ( “ Hello World” ) – Output: Hello World

ឡូអាក៏ចេះ​ Call ដែរ

ប្រើសំរាប់ហៅ ហ្វាំងសិនច្បាស់លាស់ណាមួយធ្វើជា first argument ដោយផ្តល់នូវ arguments ក្នុងការ protected mode។ មានន័យថាបើសិនជា Error នៅក្នុង f ដែលមិនត្រូវបាន propagated; ជំនួយដោយ pcall() ដែលចាប់ errors
ហើយត្រឡប់មកបង្ហាញកូដ។ វាជាកូដទី១ដែលជា Status code (a boolean) ដែលជាការពិត។ បើសិនជាការហៅបានសំរេចដោយគ្មាន error។ នៅក្នុងករណីនេះ pcall() ហើយត្រឡប់គ្រប់លិទ្ធផលទាំងអស់ដែលបានមកពីហៅ។ នៅក្នុងករណី error pcall() ត្រឡប់ជា false រួមទាំង error message

Syntax: pcall (f [,…])
F(តំរូវការ) វាជាហ្វាំងសិនដែលត្រូវបានហៅសំរាប់ protected mode
…(ជំរើស) អាចគ្រប់ពីទីកន្លែងដែលបានពីសូន្យ រហូតដល់ចំនួនណាមួយរបស់ argument ដែលបានបញ្ចូលទៅក្នុងហ្វាំងសិនដែលត្រូវបានហៅ។
សូមមើលកូដះ
function myPrint( value )
    local foo = value .. nil
end


print( pcall( myPrint, "hello" ) )  -- print false and error message

ដល់វេន Pairs ម្តង

Pairs() យើងបានមើលពី ipairs ហើយ ចុះPair នេះវិញសំរាប់ធ្វើអ្វី? វានឹងត្រឡប់មកនៅតំលៃ ចំនួន៣ដោយះ ហ្វាំងសិនបន្ទាប់, តារាងមួយ ឬក៏ nil។ ដូចនេះការសាងសង់នឹង iterate នៅលើគ្រប់ Key ទាំងអស់នៃ Pairs របស់ Table t

For k,v in pairs (t) do
End

សូមប្រើហ្វាំងសិន next() សំរាប់ caveats នៃការបញ្ជាក់របស់ Table អំឡុងពេល traversal

Syntax: pairs (t)


T(តំរូវការ) វាជាតារាងដែលចង់ iterate នៅលើ key value pairs
សូមមើលកូដះ

local keyTable = { apple="red", banana="yellow", lime="green", grape="purple" }
for k,v in pairs( keyTable ) do
    print( "KEY: "..k.." | ".."VALUE: "..v )

end

Next?


គេប្រើសំរាប់អនុញ្ញាតឪ្យកម្មវិធី traverse នៅគ្រប់ fields ទាំងអស់របស់អារ៉េ។ next() វានឹងត្រឡប់មកវិញនៅ next index របស់អារ៉េ នឹងតំលៃបន្ទាប់បន្សំ។ នៅពេលហៅ nil ជា Second argument, 

Next() នឹងត្រឡប់នៅតំលៃដើមរបស់ Index នឹងតំលៃបន្ទាប់។ នៅពេលហៅ index ចុងក្រោយ ឬក៏ nil ជាមួយនឹង​ empty array ពេលនោះ next returns nil។ បើសិនជា second argument អត់មាន ពេលនោះវានឹងក្លាយជា nil។ អ្នកអាចប្រើ next(t) ក្នុងការ Check មើលតើអារ៉េវាទទេឬអត់។
ដើម្បី Traverse អារ៉េតាមលេខរៀង ការប្រើ numerical for loop ipairs() ហ្វាំងសិន
សំរាប់ Behavior របស់ next()មិនត្រូវបាន define ក្នុងអំឡុងពេល traversal ចាប់ផ្តើម assign តំលៃណាមួយ​ចំពោះ non-existent field នៅក្នុងអារ៉េ។​

Syntax: next (array [, index])

Array(តំរូវការ) ជាអេរ៉េដែលត្រូវ iterated

Index(ជំរើស) ជាIndex របស់អារ៉េ

មើលតួនាទីរបស់ Ipairs ម្តង

វាមានមុខងារច្រើនដោយត្រឡប់មកវិញនៅតំលៃ៣ function, a table and 0។ វាមានវិធីសាងសងរបស់វា for I, v in ipars(t) do body; end ពេលនោះវានឹង​iterate over pairs (1, t [1]), (2,t[2]), … រហូតដល់​ លេខInteger ទីមួយត្រូវបាត់ពី table

Syntax: ipairs(t)

T(ជំរើស) ជា Table ដែលត្រូវ iterated
សូមមើលកូដះ
local t = { "every", "word", "is", "on", "a", "separate", "line.", "add ey add yang nis",1,2 }
for i=1,#t do
   local v = t[i]
   print( v ) -- print each array element on a separate line
end 

Getenv & Getmatatable ស្គាល់អត់?

Getenv() គេប្រើវាសំរាប់ឪ្យតំលៃវិលត្រឡប់ក្នុងការប្រើប្រាស់ហ្វាំងសិនណាមួយ។ ដែល Argument ទីមួយរបស់វាអាចជា a ឬក៏ លេខ សំរាប់ហ្វាំងសិនមួយនោះ។ នៅLevel1 គឺជាហ្វាំងសិនហៅ getfenv។ បើសិនជាវាមិនមែនជាហ្វាំងសិន របស់ឡូអា ឬក៏ f គឺសូន្យ ពេលនោះ getfenv នឹងត្រឡប់ជា Global environment។ តំលៃដើមរបស់fគឺ១
Syntax: getfenv ([f])
F(ជំរើស) ជាហ្វាំងសិនឬជាលេខ

Getmetatable()ប្រើដើម្បីទទួល metastable នៃ Table ច្បាស់លាស់ណាមួយ។ បើសិនជា Table អត់មាន metatable ទេ ពេលនោះវានឹងត្រឡប់មកជា nil តែបើសិនជា object របស់ Metatable មាន metastable field វានឹងត្រឡប់ជាតំលៃបន្ទាប់ បើមិនទេវានឹងត្រឡប់ជា metastable របស់ table មួយ។

Syntax: getmetatable (object)

Object (តំរូវការ) ជាតារាង(table) ដែលចង់បាន Metatable

សូមមើលកូដះ

local t = {}
t.name = "Joe" 
local mt = {}
setmetatable( t, mt ) 
local another_t = {}
setmetatable( another_t, getmetatable(t) )

សំរាយះ
Local t = {} ជាការបង្កើតតារាងទទេមួយឈ្មោះ t

t.name =  “Joe” access data ទៅកាន់ joe

នៅពេលដែលវា Error

Error() វាប្រើសំរាប់បញ្ចប់ហ្វាំងសិនហើយនឹងវិលត្រឡប់មកវិញនៅ First Arg ជា Error Message។ ជាទូទៅ error() បានបន្ថែមនូវទិន្នន័យខ្លះអំពី error position នៅចាប់ផ្តើមដំណើរការសារ។ 

Error (message [, level ])
Message(តំរូវការ) វាជាសារដែលបង្ហាញនៅ error

Level(ជំរើស) ជាប្រភេទលេខ វានឹងបង្ហាញនៅកន្លែងដែល error។ ជាមួយនឹង Level 1 (the default) ទីតាំង error ដែលហ្វាំងសិនដែលត្រូវហៅ។ ចំពោះ Level2 ចំនុចដែល ​​Error  នៅកន្លែងហ្វាំងសិនដែលត្រូវបានហៅមកប្រើ។ នៅពេលដែល Passing a level 0 ដើម្បីជៀសវាងកន្លែង Error នៃពត័មានរបស់ Message

Monday, March 24, 2014

Collectgarbage()​ ឡូអាក៏អាចប្រមូលសំរាមបានដែរ

Collectgarbage()​ វាប្រើសំរាប់ប្រមូល garbage ដែលបានមកពី generic interface to Lua’s garbage collector។ ប្រើប្រាស់ហ្វាំងសិននេះមិនត្រូវការនោះទេពីព្រោះឡូអាមាន automatic garbage collection។ 


Syntax: collectgarbage( [opt [, arg]])
Opt(ជំរើស) វាជា String ដែលបង្ហាញអំពី garbage collection functions ដែលខុសពី Option។ សូមមើល Possible values forOpt ដែលជាផ្នែកត្រូវបំពេញ។ តំលៃដើមគឺ “collect”
Arg(ជំរើស) ជា Arguments ដែលជាប់ទាក់ទង់នឹងតំលៃដែលអ្នកបានរើស

សូមមើលតំលៃ Possible for Opt
ខាងក្រោមនេះជា List ដែលអាចទទួលពី String សំរាប់ Opt argument:
“collect” ជាតំលៃដើមប្រើសំរាប់ Performs a full garbage collection cycle
“stop” ឈប់ garbage collector
“restart” restart garbage collector
“count” វានឹងត្រឡប់មកវិញនៅ total memory ដែលប្រើដោយឡូអា
“step” សំរាប់បង្ហាញនូវ garbage collection step។ សំរាប់ size របស់វាគឺគ្រប់គ្រង់ដោយ arg (តំលៃធំមានន័យថាមាន Step ច្រើន)
“setpause” ប្រើសំរាប់បញ្ចូល Arg ជាតំលៃថ្មីសំរាប់ Pause របស់ Collector, ហើយវានឹងវិលទៅកាន់តំលៃដើមមុន។

“setstepmul”ប្រើសំរាប់បញ្ចូល Arg តំលៃថ្មីក្នុងការ បន្ថែមCollector។ វានឹងវិលទៅកាន់តំលៃមុន។

សូមមើលហ្វាំងសិនជាលំអិត


Assert()​ វាប្រើសំរាប់បង្ហាញនូវ Error & aborts របស់ កម្មវិធីនៅពេលដែល Argument របស់វា false (ex: nil or false) បើមិនទេវានឹងត្រឡប់មកវិញនៅ arguments ទាំងអស់។ ហ្វាំងសិនមួយនេះគឺមានប្រយោជន៏ណាស់សំរាប់ catching & avoiding (unexpected situations and bugs)

Syntax: assert(v [, message])

V (តំរូវការ) បង្ហាញនៅ error នៅពេលដែលតំលៃខុស
Message​(ជំរើស) វាជា String ដែលបង្ហាញនូវសារ error នៅពេលដែល Absent វានឹងវិលមកកាន់តំលៃដើមដែល assertion failed។ សារអេរើនឹងបង្ហាញលើ Terminal Or Console
សូមមើលកូដះ
local img = display.newImage("imageWithWrongName.png")
assert( img, "Error: Image not found!" )


នៅពេលដែលកូដនេះដំណើរការវានឹងបង្ហាញនូវ Dialog error ដែលរូបមិនអាចរកឃើញ

ស្គាល់ Global របស់ឡូអាអត់?

សំរាប់ Global របស់វានឹងគ្រប់ដណ្តប់លើ Basic Functions ដែលភាសារបស់វាត្រូវប្រើជាមួយនឹង Corona SDK។ គ្រប់ទាំងហ្វាំងសិនរបស់វា​ ហើយនឹង Objects ត្រូវប្រើដោយមិនមាន Prefix:

Globals.rawget() – wrong, will produce an error ដែល global ជា Prefix
Rawget() – correct

សំរាប់ហ្វាំងសិនរបស់វាគឺះ

Assert() / Collectgarbage() / Error()/Getenv()/Getmetatable()
/Ipairs()/Next()/Pairs()/Pcall()/Print()
Rawequal()/Rawget()/Rawset()
/Select()/Setfenv()/Setmetatable()/Tonumber()/Tostring()Type()/Unpack()


Pause មួយ

audio.pause() គេប្រើសំរាប់ Pauses playback នៅលើ Channel មួយ ហើយវាមិនប៉ះពាល់ដល់ Channels ដែលមិនបានលេង 

Syntax: audio.pause ([ channel ])
Channel (តំរូវការ) ជាចំនួនលេខដែល channel ត្រូវ Pause។ ដោយ សូន្យសំរាប់ Pause គ្រប់ channels
សូមមើលកូដពីមុនះ
local funnySound = audio.loadSound( "soda.mp3" )

audio.pause (funnySound)

LoadSound មកដាក់លើ Devices

គេប្រើសំរាប់ Loads គ្រប់ហ្វាល់ទាំងអស់ចូលទៅកាន់ Memory ហើយត្រឡប់មកជា reference សំរាប់ audio data។ ហ្វាល់ត្រូវបាន Load ពេញលេញនៅក្នុង Memory ហើយវាអាច reused/played/shared លើ Channels ជាច្រើនដូចនេះការ Load វាមានតែម្តង។ សូមប្រើវាសំរាប់ Load គ្រប់សំលេងទាំងអស់ដែលលេងជាប្រចាំ។ សំរាប់លទ្ធផលល្អការ Load គ្រប់សំលេងទាំងអស់នៅពេល ចាប់ផ្តើម Launch app ក្នុងការចាប់ផ្តើម Level ថ្មី។


Syntax: audio.loadSound (audiofileName [, baseDir])
audiofileName(តំរូវការ)វាជា String ដែលជាឈ្មោះរបស់ audio ដែលចង់ Load វា។ format sound​ ដែលវា Support អាស្រ័យលើ Devices ដែលប្រើ។
baseDir(ជំរើស) ដោយសំលេងដើមរបស់វា ដែលស្ថិតនៅក្នុង Project folder (system.ResourceDirectory)
សូមមើល Sound Format
គ្រប់ទាំង Platforms support ១៦bit uncompressed .wav
IOS & Mac support .mp3, .caf & .acc
Window support .mp3 with .wav
Android support .mp3 & .ogg
សូមមើលកូដះ
local funnySound = audio.loadSound( "soda.mp3" )

audio.play (funnySound)

បន្ទាប់ពី Pause Music សាក់ Resume លេងវិញមើល

audio.resume() គេប្រើវាសំរាប់ resume playback នៅលើ Channel ដែលចង់ Paused។ វាមិនប៉ះពាល់ជាមួយនឹង channels ដែលមិនបាន pause នោះទេ។ សំរាប់ហ្វាំងសិនរបស់វានឹងត្រឡប់ ជាលេខរបស់ Channels ដែល resumed ឬក៏ -១ ពេលerror។

syntax: audio.resume ( [ channel ] )

channel(ជំរើស) ជាចំនួនលេខរបស់ Channel ដែលត្រូវ resume

ភ្លេងលឿនពេក សាក Play ថយក្រោយ

audio.rewind() បើចង់លេងភ្លេងឪ្យវាថយក្រោយវាមានហ្វាំងសិនមួយឈ្មោះវា audio.rewind ។ គេប្រើសំរាប់ឪ្យវាដំណើរការ audio សំរាប់ការចាប់ផ្តើមដំណើរការ លើ active channel ហើយនឹង audio handle។ សំរាប់ហ្វាំងសិនមួយនេះប្រើសំរាប់ return true នៅលេខដំណើរការ ហើយ false បើសិនជាមិនដំណើរការ។
Syntax: audio.rewind( [audioHandle | options] )
audioHandle(តំរូវការ)ជា AudioHandle របស់ទិន្នន័យដែលចង់ថយក្រោយ។ សូមប្រើតែ audio.loadStream()។ សូមកុំប្រើ Channel parameter សំរាប់ការប្រើដូចគ្នា

options(តំរូវការ) វាជាតារាង single key: channel ជា Channel ដែលចង់ rewind។ សូមប្រើតែ audio.loadSound()

ស្វែងរក Audio ដើម្បីលេង


គេប្រើវាសំរាប់ ស្វែងរកពេលវេលា Position ដែលលើ active channel ឬក៏  audio handle ដោយផ្ទាល់។ សំរាប់ហ្វាំងសិនមួយនេះប្រើសំរាប់ return true នៅលេខដំណើរការ ហើយ false បើសិនជាមិនដំណើរការ។

Syntax: audio.seek ( time [, andioHandle ] [, options] )

Time(តំរូវការ) វាជាពេលវេលាដែលប្រើជា milleseconds ជាមួយនឹង audio handle ដែលចង់ស្វែងរក
audioHandle(ជំរើស) សំរាប់ audioHandle នៃទិន្នន័យដែលចង់ស្វែងរក។ សូមប្រើតែ audio loaded ជាមួយនឹង​audio.loadStrem()។ សូមកុំប្រើ Channel parameter សំរាបើការហៅដូចគ្នា

options(ជំរើស) វាជាតារាងដែល Support single key: channel វាជា​channel ដែលអ្នកចង់ប្រើក្នុងការស្វែងរកការប្រតិបត្តិការណ៏។ សូមកុំប្រើ Channel parameter សំរាបើការហៅដូចគ្នា

Saturday, March 22, 2014

ចំណែក fadeOut ក៏មិនធម្មតា

audio.fadeOut សំរាប់ fade មួយនេះក៏មិនខុសពី fade ពីលើដែរ។ គេប្រើវាសំរាប់បឍ្ឃប់លេង Sound នៅពេលកំនត់ណាមួយ ហើយ fade វាទៅរហូតដល់ min volume នៅពេលវា ដំណើរការ។ audio នឹងឈប់នៅពេលវាអស់

Syntax: audio.fadeOut ([{ [ channel = c] [, time = t] }])

Channel(ជំរើស) ជាចំនួនលេខដែលជា Audio អ្នកចង់ fadeout ដោយ ១ រហូតដល់ចំនួនធំរបស់ audio។ សំរាប់ ០ គឺ fade out គ្រប់ទាំងអស់
Time(ជំរើស) Time(ជំរើស) ជាចំនួនលេខ ដោយចាប់ពីពេលនេះ(គិតជាវិនាទី) ដែលចង់ឪ្យ Audio to fade over & stop។ បើមិនប្រើពេលវេលាមានន័យថា វានឹងប្រើ default fade ដែលគិតជា១០០០វិនាទី
Volume(ជំរើស) ជាចំនួនលេខ ដែលចង់ប្រើសំរាប់ fade។ វាចាប់ផ្តើមពី ០.០ ទៅ ១.០ ជាចំនួនធំ។ បើសិនមិនប្រើវា ពេលនោះតំលៃដើមរបស់វាគឺ ០.០
សូមមើលកូដ យើងនឹងប្រើកូដដូចខាងលើ
local backgroundMusic = audio.loadStream( "media/callingSound.mp3" )
local backgroundMusic = audio.play( backgroundMusic, { channel=1, loops=-1, fadein=5000 } )
audio.fadeOut( { backgroundMusic=1, time=2000, volume=0.2 } )

នៅពេលប្រើ audio FadeOut វានឹងមិនលឺអ្វីទាំងអស់

ភ្លេងហាក់ដូចជាលឺពេក សាកប្រើ fade មើល

ជាប្រភេទហ្វាំងសិនរបស់ Audio គេប្រើវានៅពេលលេង Sound ដោយនៅកំរិត Volume ណាមួយ។ សំរាប់ Audio នឹងបន្តលេងបន្ទាប់ពី fade បញ្ចប់។
ចំណាំះ នៅពេលដែល fade vomule គឺមានន័យថាអ្នកកំពុងផ្លាស់ប្តូរសំលេង។
Syntax: audio.fade ( [ { [ channel = c] [, time = t] [, volume = v ]}] )
សំរាប់ហ្វាំងសិននេះប្រើតែ ​Single Table ជា Parameter ជាមួយនឹង Optional keys:
Channel(ជំរើស) ជាចំនួន Channel ដែលចង់ Fade ។ ១​រហូតដល់ ចំនួនច្រើនបំផុត ចំណែក ០​ មានន័យថា fade គ្រប់ទាំងអស់
Time(ជំរើស) ជាចំនួនលេខ ដោយចាប់ពីពេលនេះ(គិតជាវិនាទី) ដែលចង់ឪ្យ Audio to fade over & stop។ បើមិនប្រើពេលវេលាមានន័យថា វានឹងប្រើ default fade ដែលគិតជា១០០០វិនាទី
Volume(ជំរើស) ជាចំនួនលេខ ដែលចង់ប្រើសំរាប់ fade។ វាចាប់ផ្តើមពី ០.០ ទៅ ១.០ ជាចំនួនធំ។ បើសិនមិនប្រើវា ពេលនោះតំលៃដើមរបស់វាគឺ ០.០

សូមមើលកូដះ
local backgroundMusic = audio.loadStream( "media/callingSound.mp3" )
local backgroundMusic = audio.play( backgroundMusic, { channel=1, loops=-1, fadein=5000 } )
audio.fade( { backgroundMusic=1, time=2000, volume=0.2 } )
១. បង្កើត file sound មួយឈ្មោះ callingSound.mp3
២. ចាប់ផ្តើម Play

៣. ឪ្យវា fade

រៀនរៀបចំបទភ្លេង

audio.dispose() ជួយសំរួលដល់ Audio memory។ កុំប្រើវានៅពេលដែល memory is freed។ វាមាន Syntax: audio.dispose (audioHandle)

*audioHandle: (តំរូវការ) ការ Handle វិលត្រឡប់មកវិញដោយ audio.loadSound() and audio.loadStream() that you want to free

Friday, March 21, 2014

ដូចជាស្ងាត់ ដាក់ភ្លេងមួយមើល

audio.play() = ជាប្រភេទ Function។ វានឹងលេង audio តាមរយះ audio handle on a channel។ បើសិនជា channel មិនច្បាស់លាស់ ពេលនោះ Channel ដែលទំនេរនឹងចាប់ផ្តើមលេង។ វាមាន 


syntax: audio.play ( audioHandle [, options] )

audioHandle (តំរូវការ)
object: វាជាទិន្នន័យ Data ដែលចង់លេង (as returned from audio.loadSound() and audio.loadStream)
options: (ជំរើស)
table: បន្ថែម Options សំរាប់ Playback ។ សូមមើល Format for options, ដែល តារាងរបស់options អនុញ្ញាតឪ្យយើងបន្ថែមនូវជំរើសជាច្រើន។
local options = { channel =1, loops = -1, duration = 30000, fadein = 5000, onComplete = callbackListener}
-       Channel (optional) ជាចំនួនលេខ​, ជាចំនួនលេខ Channel ដែលចង់លេង។ លេខ១ជាចំនួនលេខរបស់ channel (currently 32) ជាចំនួនដែលត្រឹមត្រូវ។ បើសិនជាលេខ ០ ឬក៏ លុបចោល ពេលនោះ channel នឹងរើសលេងដោយខ្លួនឯង។

-       Loops (ជំរើស) ជាលេខនៃចំនួនពេលដែលចង់ឪ្យ audio ក្នុងការធ្វើការ​ Loop។ មានន័យថាលេខ​០ ពេលនោះAudio នឹងលេខចំនួន០ដង ដែលមានន័យថាសំលេងនឹងលេងម្តង ហើយមិន Loop ទេ។ -Loop នឹងលេងរហូត។

ស្គាល់ទេ Display.setStatusBar ?


សំរាប់ Display មួយនេះប្រើសំរាប់បង្ហាញ ឬ លាក់នៅ status bar ដែលមាននៅលើ Devices (Ipad, Iphone, Ipod Touch & Android 2x)
ចំណាំះ សំរាប់Android 3. មិន Support status bar ទេ
Syntax: display.setStatusBar(mode)
Mode(តំរូវការ) សូមជ្រើសរើស
* display.HiddenStatusBar
* display.DefaultStatusBar
* display.TranslucentStatusBar
* display.DarkStatusBar

កាប្រើប្រាស់ Display Remove


វាជាប្រភេទហ្វាំងសិនដែលប្រើសំរាប់ លុបចេញនូវ Group បើសិនជាវាមិនមែន Nil
វាប្រៀបដូចជាការហៅ object:removeSelf() ប៉ុន្តែមុនដំបូងវាត្រូវត្រួតពិនិត្យសិន បើសិនជា Object មាន មុនពេលដែលវាចាប់ផ្តើមលុប។

Syntax: display.remove(object)

Object(តំរូវការ) វាជា Display Object ដែល Variable ទាក់ទងនឹង Display object (vector, image & group) ដែលត្រូវលុបចេញ។


Thursday, March 20, 2014

ចុះបើគូសពហុកោណវិញ រាងប៉ោងឬខូងនោះ

ចុះបើអ្នកចង់គូស ពហុកោណវិញត្រូវធ្វើដូចម្តេច? សំរាប់ Corona អាចឪ្យអ្នកគូសវាបាន។ ដោយការគូសចេញជាពហុកោណ ដោយផ្តល់
នូវរូបរាង។ វារួមបញ្ចូលទៅដោយ រូបរាងប៉ោង (convex) ឬ​ខូង (concave)

Syntax: display.newPolygon( x, y, vertices )
display.newPolygon( parent, x, y, vertices )

parent(ជំរើស) ជា Group ដែលប្រើសំរាប់បញ្ចូលនូវ Polygon
x & y (តំរូវការ) ជាចំនុចដែល Object មានទំនាកទំនង់ទៅនឹង​ មេរបស់វា
vertices (តំរូវការ) ជាអារ៉េរបស់ X & Y Coordinates។ ដែល Coordiates ទាំងនេះនឹងចាប់ផ្តើមមកនៅចំនុចកណ្តាលវិញ

សូមមើលកូដះ
local halfW = display.contentWidth * 0.5
local halfH = display.contentHeight * 0.5

local vertices = { 0,-110, 27,-35, 105,-35, 43,16, 65,90, 0,45, -65,90, -43,15, -105,-35, -27,-35, }

local o = display.newPolygon( halfW, halfH, vertices )
o.fill = { type="image", filename="aquariumbackgroundIPhone.jpg" }
o.strokeWidth = 10
o:setStrokeColor( 0, 1, 1 )

វានឹងគូរចេញជារូបផ្កាយដោយប្រើ display.newLine


ឧបមារថាអ្នកចង់គូសនូវបន្ទាត់មួយ ពីចំនុចមួយទៅកាន់មួយទៀត ដូចនេះវាមានហ្វាំងសិន NewLine ដែលអាចធ្វើការនេះបាន
ចំនាំះ វាមិន Support Touch & Tap events នោះទេ

Syntax: display.newLine ( [parentGroup,] x1, y1, x2, y2 [, x3, y3, ...)

parentGroup(ជំរើស) ការប្រើប្រាស់ Group ដើម្បីបញ្ចូល Line
x1 y1(តំរូវការ) ជាចំនុចចាប់ផ្តើមរបស់ Coordinates នៃ Line
x2 y2(តំរូវការ) ជាចំនុចបញ្ចប់នៃ Coordinates របស់​ Line
x3 y3(ជំរើស) ជាចំនុច Coordinate បន្ថែម

សូមមើលកូដះ
local star = display.newLine( 200, 90, 227, 165 )
star:append( 305,165, 243,216, 265,290, 200,245, 135,290, 157,215, 95,165, 173,165, 200,90 )
star:setStrokeColor( 1, 0, 0, 1 )
star.strokeWidth = 8



ដាក់រូបរាងបួនជ្រុងម្តង

យើងបានរៀនអំពីការដាក់រូបមូល ពេលនេះសូមមើលរូបបួនជ្រុុងវិញ។ ចំណែកកន្លែងដើមរបស់វា ស្ថិតនៅចំនុចកណ្តាលរបស់ rectangle។ ហើយចំនុច Anchor គឺចាប់ផ្តើមនៅកន្លែងនោះ។

display.newRect( x, y, width, height )
display.newRect( parent, x, y, width, height )

x / y (តំរូវការ)​ ជាចំនុច Coordinate របស់​ X & Y នៃ Rectancle
width / height (តំរូវការ) ជា Width & Height របស់​ Rectangle
parent(ជំរើស) អាចជាមេរបស់ Group ក្នុងការដាក់ Rectangle

សូមមើលកូដះ
local myRectangle = display.newRect( 0, 0, 150, 50 )
myRectangle.strokeWidth = 3
myRectangle:setFillColor( 0.5 )
myRectangle:setStrokeColor( 1, 0, 0 )

Wednesday, March 19, 2014

មានប្រភេទ Container នេះមួយទៀត



សំរាប់ Containers ជាប្រភេទ Group ពិសេសដែលវាអាចឪ្យ Children masked បាន

Syntax: display.newContainer ([parent, ] width, height)

ដែនកំនត់ះ ដោយសារ container objects​ត្រូវបានបង្កើតឡើងដោយប្រើ Mask។ ដូចនេះនៅពេលដែលមាន Mask ត្រូវការ Nesting នោះវាមាន
ដែនកំនត់សំរាប់បី Platforms

សូមមើលកូដះ
-- Create a container
local container = display.newContainer( 128, 128 )

-- Create an image
local bkgd = display.newImage( "bg.jpg" )
-- Insert the image into the container
container:insert( bkgd, true )
-- Center the container in the display area
container:translate( display.contentWidth*0.5, display.contentHeight*0.5 )

-- Transition (rotate) the container
transition.to( container, { rotation=360, transition=easing.inOutExpo} )

ដាក់រូបមូលមួយ Display New Circle


ប្រើសំរាប់បង្កើតរូបមួយមូលជាមួយនឹង radius centered នៅចំនុច Coordinates មួយ(xCenter, yCenter) ចំនុចដើមរបស់វាគឺនៅចំនុចកណ្តាលរបស់ Center។ ចំណែក anchor point គឺចាប់ផ្តើមនៅចំនុចណាមួយ។

Syntax: display.newCircle (xCenter, yCenter, radius)

Display.newCircle (parent, xCenter, yCenter, radius)
Parent(ជំរើស) ជាប្រភេទ GroupObject ជាជំរើសសំរាប់បង្ហាញនៅ Group ដែលត្រូវបញ្ចូលCircle
xCenter/ yCenter ជាប្រភេទលេខ នៃចំនួន X & Y របស់ Coordinate សំរាប់ចំនុចកណ្តាលរបស់ Circle
radius (តំរូវការ) ជាប្រភេទលេខ ដែលជា Radius របស់ Circle (កំនត់ចំនួនរបស់ Circle) ដែល Radius គឺធំជាង០។

សូមមើលកូដះ
local myCircle = display.newCircle( 100, 100, 30 )
myCircle:setFillColor( 0.5 )
myCircle.strokeWidth = 5
myCircle:setStrokeColor( 1, 0, 0 )
print ("circle")

Tuesday, March 18, 2014

ចុះចំណែក function របស់ Display មានអ្វីខ្លះ?


១. Display.capture()
ហ្វាំងសិនមួយនេះមានតួនាទីដូចជា display.save() ភាពខុសគ្នារបស់វាគឺ នឹង Returns a display object ជំនួសការ Save ៕ វាអាចបន្ថែម Option ក្នុងការ Save the capture ទៅ Photo Lib របស់ Devices ដែលត្រូវ ធ្វើវានៅក្នុងការហៅហ្វាំងសិន។
Display.capture() អាចជា Hybrid នៅចន្លោះ display.save() & display.captureScreen()

ចំណាំះ
Adroid: នៅពេលដែល App របស់អ្នកត្រូវ Suspended ពេលនោះ Android OS លុបចេញគ្រប់ទាំង OpenGL textures ចេញពី Memory។ នៅពេលដែល App ត្រូវ Resumed ពេលនោះ Corona នឹង Load គ្រប់ទាំងរូបភាព ប៉ុន្តែ Capture image មិនមាននៅក្នុង Memory ទៀតទេ។ ដំណោះស្រាយមានដូចនេះ
១. Save the returned capture image to file via the display.save() function
២. Display the image saved to file via display.newImageRect() ដោយប្រើប្រាស់ Capture Object’s Bounds

សូមប្រយ័ត្នះ មិនអាចប្រើ ហ្វាំងសិន display.save() នៅក្នុង Android application Suspend and applicationExit events ពីព្រោះមិនមាន OpenGL texture នៅក្នុង Memory។
សំរាប់ Android ត្រូវការដាក់ Permission នៅក្នុង build.setting ដោយបន្ថែមកូដដូចខាងក្រោម
settings =
{
    android =
    {
        usesPermissions =
        {
            "android.permission.WRITE_EXTERNAL_STORAGE",
        },
    },
}

សំរាប់ Mac
ដោយ save screen capture ជាហ្វាល JPEG ទៅកាន់ Current User’s Desktop
សំរាប់ Windows
ដោយ save screen capture ជាហ្វាល png ទៅកាន់ My Pictures\Corona Simulator directory
ដាក់ Capture on Launch
ការប្រើប្រាស់មួយនេះសំរាប់ Display Object នៅលើ Application (នៅពេល main.lua នឹងដំណើរការនៅពេលដែលចាប់ផ្តើម App) ដូចនេះត្រូវប្រើ display.capture() នៅចន្លោះ timer.performWithDelay ។ សំរាប់ delay ត្រូវប្រើត្រឹមតែ 100 វិនាទី
សូមមើលកូដះ
local myObject1 = display.newRect( 50, 50, 100, 150 )

local function captureWithDelay()
    local capture = display.capture( myObject1 )
end

timer.performWithDelay( 100, captureWithDelay )

Syntax: display.capture (displayObject, options)

displayObject (តំរូវការ) វាជា Variable ដែលជា References ទៅកាន់ Display object/ group to save

ការដាក់ Object ទាំងអស់នៅក្នុង Group


ប្រើសំរាប់ បង្កើត Group ដែលអាចបន្ថែម ឬលុបចោលនៅ Child Display Objects។ ចាប់ផ្តើមវាគ្មាន Children នៅក្នុង Group ទេ។ កន្លែងដើមរបស់វាគឺ នៅ Parent’s Origin ហើយ anchor របស់វាគឺចាប់ ផ្តើមនៅកន្លែងមួយ។
ចំណាំះ ការប្រើប្រាស់ Groups ជាមួយនឹង Physics engine មានដែលកំនត់។

Syntax: display.newGroup()

សូមមើលកូដះ
បង្កើត rectangle & a group បន្ទាប់មកដាក់ rectangle ទៅក្នុង Group

local rect = display.newRect (20,50,100,100)
rect:setFillColor (0.5)

local group = display.newGroup()
group:insert (rect)


Monday, March 17, 2014

Display.contentScaleX Vs display.contentScaleY

វាជា Ratio ដែលនៅចន្លោះ Content Pixel & Screen Pixel width។ តំលៃរបស់វាតែងតែ ១ អ្នកអាចកែប្រែបានតាមរយះ config.lua ដែលបញ្ជាក់អំពី content’s height & width។ វាមាន Mood ផ្សេងៗទៀតដូចជា “letterbox” “zoomEven” ដែលជាលទ្ធផលនៃ Scale ដែលខុសគ្នា។
សូមមើលកូដះ
Config.lua
application =
{
    content =
    {
        width = 320,
        height = 480,
        scale = "letterbox"
    },
}    
Main.lua
local scalex = display.contentScaleX
local scaley = display.contentScaleY

-- display scale values
print( "scaleX", scalex )
print( "scaleY", scaley )

-- OUTPUT:
-- iPhone 4
-- scaleX 0.5
-- scaleY 0.5

-- iPad 1/2
-- scaleX 0.46875
-- scaleY 0.46875
ចង់ដឹងអំពី ប្រវែង Width & Height គិតជា pixel ដូចនេះការប្រើ display ពិតជាអាចជួយបាន។ មើលការប្រើប្រាស់ Print statement ដូចនេះ
Print (display.pixelWidth .. display.pixelHeight)
ការប្រើ (..concat) សំរាប់ភ្ជាប់ Print statement ទាំងពីរនេះ។ មានន័យថា អ្នកអាចដឹងអំពី Smart Devices របស់អ្នកមានប៉ុន្មាន pixel?
Display.screenOriginX / Y តើវាមានប្រយោជន៏អ្វីខ្លះ? វានឹងត្រឡប់មកនៅ x distance ពីខាងឆ្វេង មកដល់ content area។ ដូចជានៅក្នុង “letterbox” & “zoomEven” របស់ Mood៕ វាប្រើសំរាប់បន្ថែម ឬក៏ កាត់ចេញពី Current Device។ អត្ថប្រយោជន៏មួយទៀតគឺ អោយរកឃើញ Visible area ដែលត្រូវ បន្ថែម ឬ លុបចេញពី Current device។
សូមមើលកូដះ
-- Create a grey background
local background = display.newRect( 0, 0, 320, 480 )
background:setFillColor( 0.5 )

-- Create two squares
local rect1 = display.newRect( 0, 0, 50, 50 )
local rect2 = display.newRect( 0, 0, 50, 50 )

-- Place the squares along the top edge
-- Offset the second square with display.screenOriginX
rect1.x = 25
rect2.x = 25 + display.screenOriginX  
rect1.y = 25
rect2.y = 150