首先!馬上畢業了,還算有點時間好久沒寫東西了就寫點東西吧!
進入主題,首先先思考算法和邏輯。把圓分爲八塊,每塊45度。正上,正下,正左,正右會被X和Y 平分。一邊一半各是22.5度。(PS:開始想用 斜率的,但是發現斜率是tan的圖像,也就是無限趨近最大值和最小值的不好做判斷最後就用了cos也可用sin)思考計算的過程圖如下:
準備工作完了就開始,首先控制的人物有八個狀態分別是:上,下,左,右,左上,左下,右上,右下的動畫。不同的狀態對應着不同的動畫,觸控點和圓心點作比較來判斷是哪個方向的。判斷算法如下圖:
結構如下:
觸控模塊代碼
box_tm:setTouchEnabled(true)
box_tm:setTouchSwallowEnabled(true)
box_tm:addTouchEventListener(function(event, x, y, prevX, prevY)
local x,y = x,y
if event == 'began' then
elseif event == "moved" then
cc,yy = box:getParent():convertToNodeSpace(ccp(x,y)) -- 變爲世界座標系
--box_tm:convertToWorldSpace(ccp(x,y))
box_tm:setPosition(cc,yy)
local up_x , up_y = box_tm:getPosition()
local loangle = self:CosAngle(up_x, up_y, box_x ,box_y)
if handle2 == nil then
handle2 = scheduler.scheduleGlobal(handler(self,self.TouchScheduler),0.1) -- 啓動定時器
end
if up_y > box_tm_y then -- 判斷在上邊
--todo
if loangle >= 0 and loangle <= 22.5 then
--todo
dir_bar = "右"
elseif loangle > 22.5 and loangle <= 62.5 then
--todo
dir_bar = "右上"
elseif loangle >67.5 and loangle <= 112.5 then
dir_bar = "上"
elseif loangle >= 112.5 and loangle < 157.5 then
dir_bar = "左上"
else
dir_bar = "左"
end
else -- 判斷在下面
--todo
if loangle >= 0 and loangle <= 22.5 then
--todo
dir_bar = "右"
elseif loangle > 22.5 and loangle <= 62.5 then
--todo
dir_bar = "右下"
elseif loangle >67.5 and loangle <= 112.5 then
dir_bar = "下"
elseif loangle >= 112.5 and loangle < 157.5 then
dir_bar = "左下"
else
--todo
dir_bar = "左"
end
end
elseif event == "ended" then
box_tm:setPosition(box_tm_x,box_tm_y)
self.critSprite:stopAllActions()
self.up_bar = 0
self.leftUp_bar =0
self.left_bar =0
self.rightUp_bar =0
self.right_bar =0
self.down_bar = 0
self.leftDown_bar = 0
self.rightDown_bar = 0
scheduler.unscheduleGlobal(handle2)
handle2 = nil
end
return true
end)
定時器中代碼:
function Backpack:TouchScheduler()
run_x,run_y = self.critSprite:getPosition()
local speed = 3
if dir_bar == "上" then
if self.up_bar == 0 then
self:State("上")
self.up_bar = 1
self.rightUp_bar = 0
self.right_bar = 0
self.leftUp_bar = 0
self.left_bar = 0
self.down_bar = 0
self.leftDown_bar = 0
self.rightDown_bar = 0
end
self.critSprite:setPosition(run_x, run_y + speed)
elseif dir_bar == "下" then
if self.down_bar == 0 then
self:State("下")
self.down_bar = 1
self.rightUp_bar = 0
self.right_bar = 0
self.leftUp_bar = 0
self.left_bar = 0
self.up_bar = 0
self.leftDown_bar = 0
self.rightDown_bar = 0
end
self.critSprite:setPosition(run_x, run_y - speed)
………… -- 就這樣的不多寫了 最好把<span style="font-family: 'Comic Sans MS';">self:State("下") 中的 漢字改爲英文(編碼問題要小心)。我這就不改了,大家注意就是。</span>
狀態:
function Backpack:State(...)
local dir = ...
if dir == "上" then
self:Action(0,8) -- 這裏要注意參數是從第幾個編號開始,往後多少張圖
elseif dir == "下" then
self:Action(32,8)
elseif dir == "左" then
self:Action(48,8)
elseif dir == "右" then
self:Action(16,8)
elseif dir == "左上" then
self:Action(56,8)
elseif dir == "右上" then
self:Action(8,8)
elseif dir == "左下" then
self:Action(40,8)
elseif dir == "右下" then
self:Action(24,8)
end
end
動畫:
function Backpack:Action(st,la)
self.critSprite:removeFromParentAndCleanup(true)
self.frames = display.newFrames("000%d.tga", st, la)
self.critSprite = display.newSprite(self.frames[1])
:addTo(display:getRunningScene(), SECOND_MENU_Z_ORDER)
self.critSprite:setScale(0.6)
animation = display.newAnimation(self.frames, 1 / 9)
transition.execute(self.critSprite,CCAnimate:create(animation),{
onComplete = function()
end})
self.critSprite:playAnimationForever(animation)
end
最後完成的效果如下:
有什麼問題大家可以交流共同學習共同進步。右下角會有我的QQ.
我盡力了,弄了很久 GIF 都發不出去,CSDN 說的是支持GIF 我也小於2M 了發出來還是不動得! 求知道朋友告知一聲怎麼弄的,在這我先謝謝了!
先替代的發個百度網盤地址吧:http://pan.baidu.com/s/1pJzENqV
這篇文章在quick 官方的教程中我也發過,在教程推薦的前幾名上過一段時間:http://cn.cocos2d-x.org/tutorial/show?id=2789 有興趣的可以點進去看下。
博主QQ: 294678265