Today I had a chance to play with Gideros SDK. In order to get a better understanding about the SDK and Lua in general, I decided to port some AS3 code. Here are some code from Keith Peter’s book, Advanced AS3 animations, in Lua.
I haven’t fully understood Lua so these code might look bad in the eyes of Lua experts 🙂 but at least it works.
[note color=”#FFCC00″]You can get the original, fully commented AS3 code from http://www.apress.com/9781430216087[/note]
First, the Vector2D. I don’t know if Lua has a built-in Vector class, maybe it does but as part of the learning process, I wrote one myself. Porting Vector2D.as
to Vector2D.lua
was almost as easy as copy-pasting.
--[[ Vector 2D class. Ported to Lua from Keith Peter's AS3 Vector2D Author : Anggie Bratadinata | www.masputih.com --]] Vector2D = {} Vector2D.__index = Vector2D -- constructor function Vector2D.new(initX,initY) local instance = { x = initX, y = initY } setmetatable(instance,Vector2D) return instance end --[[ BASIC MATH OPS --]] function Vector2D:dotProduct(v2) return self.x * v2.x + self.y * v2.y end function Vector2D:angleFrom(v2) local v1 = self if self:isNormalized() == true then v1 = self:clone() v1:normalize() end if v2:isNormalized() == true then v2 = v2:clone() v2:normalize() end return math.acos(v1:dotProd(v2)) end function Vector2D:add(v2) self.x = self.x + v2.x self.y = self.y + v2.y end function Vector2D:subtract(v2) self.x = self.x - v2.x self.y = self.y - v2.y end function Vector2D:multiply(value) self.x = self.x * value self.y = self.y * value end function Vector2D:divide(value) self.x = self.x / value self.y = self.y / value end --[[ LENGTH --]] function Vector2D:setLength(value) local a = self:getAngle() self.x = math.cos(a) * value self.y = math.sin(a) * value end function Vector2D:getLength() return math.sqrt(self:getSquareLength()) end function Vector2D:getSquareLength() return self.x * self.x + self.y * self.y end -- normalization function Vector2D:normalize() if self:getLength() == 0 then self.x = 1 self.y = 0 else local l = self:getLength() self.x = self.x/l self.y = self.y/l end return self end function Vector2D:isNormalized() return self:getLength() == 1 end --[[ ANGLE --]] function Vector2D:getAngle() return math.atan2(self.y,self.x) end function Vector2D:setAngle(value) local l = self:getLength() self.x = math.cos(value) * l self.y = math.sin(value) * l end --[[ DISTANCE --]] -- get the distance of the given vector from this vector function Vector2D:getDistanceOf(v2) return math.sqrt(self:getSquareDistance(v2)) end function Vector2D:getSquareDistance(v2) local dx = v2.x - self.x local dy = v2.y - self.y return dx * dx + dy * dy end --[[ UTILITIES --]] -- determine if the given vector is to the right (+1) or to the left (-1) -- of this vector function Vector2D:getSignOf(v2) local perp = self:getPerpendicular() if perp:dotProduct(v2) < 0 then return -1 else return 1 end end -- return a new vector that is perpendicular to this vector function Vector2D:getPerpendicular() return Vector2D.new(-self.y,self.x) end function Vector2D:truncate(maxLength) self:setLength(math.min(maxLength,self:getLength())) end function Vector2D:zero() self.x = 0 self.y = 0 end function Vector2D:isZero() if self.x == 0 and self.y == 0 then return true else return false end end function Vector2D:equals(v2) return self.x == v2.x and self.y == v2.y end function Vector2D:clone() return Vector2D.new(self.x,self.y) end function Vector2D:toString() print("Vector2D[",self.x,",",self.y,"]"); end -- so that this class can be imported by "geom.Vector2D" return Vector2D