local Snake=class("Snake")
local Body=require"app.Body"
local cInitLen=3
function Snake:ctor(node)
self.BodyArray={}
self.node=node
--给予蛇移动的方向
self:SetDir("left")
--self.MoveDir="left"
--将蛇初始化
for i=1,cInitLen do
self:Grow(i==1)
end
end
function Snake:Grow(isHead)
--初始的位置
local tailX,tailY=self:GetTailGrid()
local body=Body.new(self,tailX,tailY,self.node,isHead)
table.insert(self.BodyArray,body)
end
function Snake:GetTailGrid()
--无蛇情况
if #self.BodyArray==0 then
return 0,0
end
--有蛇情况返回其尾巴,以用于添加蛇身
local tail=self.BodyArray[#self.BodyArray]
return tail.X,tail.Y
end
function Snake:Update()
if #self.BodyArray==0 then
return
end
for i=#self.BodyArray,1,-1 do
local body=self.BodyArray[i]
--i=1时为头部
if i==1 then
body.X,body.Y=OffsetGridByDir(body.X,body.Y,self.MoveDir)
else
local front=self.BodyArray[i-1]
body.X,body.Y=front.X,front.Y
end
body:Update()
end
end
function OffsetGridByDir(x,y,Dir)
if Dir=="left" then return x-1,y
elseif Dir=="right" then return x+1,y
elseif Dir=="up" then return x,y-1
elseif Dir=="down" then return x,y+1
else
print("unknown Dir")
return x,y
end
end
--水平只能走垂直
--垂直只能走水平
local hvTable={
["left"]="h",
["right"]="h",
["up"]="v",
["down"]="v",
}
local rotTable={
["up"]=90,
["down"]=-90,
["left"]=0,
["right"]=180,
}
function Snake:SetDir(dir)
if hvTable[dir]==hvTable[self.MoveDir] then
return
end
self.MoveDir=dir
local head=self.BodyArray[1]
head.sp:setRotation(rotTable[self.MoveDir])
end
return Snake
终于知道问题出现在哪里了
--给予蛇移动的方向
self:SetDir("left")
--self.MoveDir="left"
--将蛇初始化
for i=1,cInitLen do
self:Grow(i==1)
end
这里调用self:SetDir()函数的时候,self.BodyArray里面还没有元素,所以取BodyArray[1]肯定一直nil,只要把这个函数位置放在for循环后面就好了
我也遇到这种情况了,head好像没有取出来,一直是nil的。不知道为什么