Do południa bawiłem się trochę stylowaniem, bo wybrana themka, trochę już przeze mnie wymemłana, oczywiście średnio sobie radziła ze wstawkami kodu. Ponadto – najwyższy czas zapoczątkować nową, warsztatową kategorię, pod którą będę mógł składować moją radosną twórczość ;]
A zatem otwieram „Imadło”, nazwa taka sobie i byle jaka – myślę, że w sam raz :P
Na pierwszy ogień pójdzie kompletny banał – byle wstawić kawałek kodu i zobaczyć czy się świeci bardziej niż choinka ;D
Drobny wstępniak.
CoronaSDK ma generalnie taki problem, że nie lubi się z procesorami w architekturze ARM6. Z tego też powodu porzucili support dla Androida 2.1 i starszych. Oczywiście Android w wersji 2.2 i wyżej nie pomoże, jeżeli w urządzeniu nie siedzi przynajmniej ARM7. Jeżeli więc ktoś się uprze (a ja się uparłem), to musi pracować na jednym z antycznych buildów SDK.
Ja dokopałem się do buildu 2011.337, przetestowałem go i daje radę coś tam zbudować nawet dla mojej Xperii X8. Zasadnicze utrudnienie życia w tym przypadku polega na tym, że wszystkie pliki źródeł i zasobów muszą znajdować się w głównym katalogu projektu. Tak jest, żadnych podkatalogów = totalny pierdolnik. O tym jednak innym razem. Oczywistą oczywistością w przypadku tak starego buildu jest fakt, że tracimy dostęp do tych wszystkich cudnych ficzerów, które pojawiły się w SDK od tamtego czasu. Corona jest wówczas goła i wesoła, a okazuje się nawet, że nie ma czegoś tak błahego jak funkcja math.round(), która po prostu nie jest oficjalną składową języka Lua :)
Ok, no to jedziemy z własną odmianą math.round(), na wypadek gdyby brakowało jej w naszym środowisku:
if math.round == nil then math.round = function( number ) local number = tonumber( number ) or 0 return math.floor(number + 0.5) end end
W sumie to zaokrąglanie nadal jest skromne, bo przydałby się parametr dla precyzji zaokrąglenia. Corona do tej pory nie dorobiła się odpowiedniego rozwiązania, dlatego na użytek własny powołam do życia funkcję math.roundTo():
math.roundTo = function( number, precision ) local number = tonumber( number ) or 0 local precision = tonumber( precision ) or 0 precision = math.pow( 10, math.round( precision ) ) return math.round( number / precision ) * precision end
No dobra. Dla formalności jakiś przykład dla potomnych ;P
local number1 = 17.1337 print( math.round( number1 ) ) -- wypisze: 17 print( math.roundTo( number1 ) ) -- precyzja jest opcjonalna, domyślnie 0; wypisze: 17 print( math.roundTo( number1, 0 ) ) -- domyślna precyzja 0 oznacza rząd jedności; wypisze: 17 print( math.roundTo( number1, -2 ) ) -- zaokrąglenie do dwóch miejsc po przecinku; wypisze: 17.13 print( math.roundTo( number1, -3 ) ) -- zaokrąglenie do trzech miejsc po przecinku; wypisze: 17.134 print( math.roundTo( number1, 1 ) ) -- zaokrąglenie do całych dziesiątek; wypisze: 20
local number2 = -0.509 print( math.round( number2 ) ) -- wypisze: -1 print( math.roundTo( number2 ) ) -- wypisze: -1 print( math.roundTo( number2, 0 ) ) -- wypisze: -1 print( math.roundTo( number2, -2 ) ) -- wypisze: -0.51 print( math.roundTo( number2, -3 ) ) -- wypisze: -0.509 print( math.roundTo( number2, 1 ) ) -- wypisze: 0
Na koniec kompletny listing pliku, zwarty i gotowy do użycia w walce ;]
--[[----------------------------------- CoronaSDK / Lua Extensions ext_math_round.lua 2013, Hubert Świtek Released under NO license - use it as you like, if you like it ;] Desired to be compatible with CoronaSDK builds as far as 2011.377; Aimed to be deployed on ARM6-based Android devices; -----------------------------------]]-- -- math.round -- if math.round == nil then math.round = function( number ) local number = tonumber( number ) or 0 return math.floor(number + 0.5) end end -- math.roundTo -- math.roundTo = function( number, precision ) local number = tonumber( number ) or 0 local precision = tonumber( precision ) or 0 precision = math.pow( 10, math.round( precision ) ) return math.round( number / precision ) * precision end
No dobra, dość zabawy na dzisiaj. Na jakiś czas powinno mi wystarczyć takie ostylowanie. Choinka przy tym to pikuś :D
« Vigil Games, R.I.P. Milion $ dziennie z dwóch darmowych gierek »
A może po prostu przeciąż systemowe math.roud twoją wersją, jak drugi parametr == nil to działa jak stare round.
Tak BTW to moja commandlinowa lua 5.1.4 nie ma round-a.
Można, nawet ifa wtedy pisać nie trzeba (or). I dla czystej Lui to jest rozwiązanie.
Rozbiłem to na dwie funkcje ze względu na Coronę. W bieżących buildach jest round i działa tak jak działa, z jednym parametrem. Chciałem zachować zgodność z nim, żeby było wiadomo czego się po nim spodziewać.
Chodzi o to, że wywołanie obecnego systemowego jako math.round(A, B) będzie dla Corony OK. Ona po prostu oleje drugi parametr i nawet nie kwiknie.
Przeciążenie rounda i potem stosowanie go w kodzie prowadzi do sytuacji, w której przy omyłkowym braku require’a, funkcja działa poprawnie (w sensie nie sypie błędami), a daje nieoczekiwane wyniki, bo przyjmuje oba parametry i wszystko jest ok, ale drugi jest olewany (wiadomo jak potem szuka się takich błędów).
Wymuszenie nowej nazwy i zmuszanie ludzi do stosowania oddzielnej funkcji uznałem za bardziej „bezpieczne”. To oczywiście wzięcie poprawki na mnie samego, ja bywam nieuważny :P A tak od razu wiadomo – jak wołam funkcję bez definicji to zaraz jest error – i o to właśnie chodzi – jak zapomnę require’a, to mi zaraz konsola wypyszczy.