![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2011
Сообщений: 6
|
Я пытался создать бильярд и все застопорилось на одной проблеме - скорость по y (обозначена yy) постоянно равна нулю. Как я не пытался перестроить код выходила одна и та же фигня.... Опытным путем я обнаружил что проблема в классе мяча, в котором я описал торможение.
package cod { import flash.display.MovieClip; import flash.events.*; public class ball extends MovieClip { public var xx:Number = 0; public var yy:Number = 0; private var a:Number = 0.1; private var ang:Number; public function ball() { addEventListener(Event.ENTER_FRAME, torm); } public function torm(event:Event):void { ang = Math.atan2(yy,xx); if(xx>a ||xx<-a) { xx -= Math.cos(ang)*a; } else { xx = 0; } if(yy>a||yy<-a) { yy -= Math.sin(ang)*a; } else { yy = 0; } } } } Главный код package cod { import flash.display.*; import flash.events.*; import flash.ui.Mouse; public class first extends MovieClip { public var ball1:ball = new ball; public var stol1:stol = new stol; public var ky1:ky = new ky; public var kxx:Number = 0; public var kyy:Number = 0; public var mark:Number = 0; public var angle:Number; public var force:Number = 20; public var t:Number = 1; public var t1:Number; public var t2:Number; public var l:Number; public var l2:Number; public function first() { addChild(stol1); stol1.x = 0; stol1.y = 0; addChild(ball1); ball1.x = 300; ball1.y = 300; addChild(ky1); ky1.x = ball1.x; ky1.y = ball1.y; ky1.visible = false; stage.addEventListener(Event.ENTER_FRAME, kiy); stage.addEventListener(MouseEvent.CLICK , cli); stage.addEventListener(Event.ENTER_FRAME, movee); } public function movee(event:Event):void { if(!(ball1.xx==0)&&(ball1.yy==0)){ t=1; while(t>0){ if(ball1.xx > 0) { l = 770 - ball1.x - 7; t1 = l/ball1.xx; } else if(ball1.xx < 0) { l = ball1.x - 37; t1 = -l/ball1.xx; } else if(ball1.xx == 0){ t1 = 2; } if(ball1.yy > 0) { l2 = 400 - ball1.y - 7; t2 = l2/ball1.yy; } else if(ball1.yy < 0) { l2 = ball1.y - 37; t2 = -l2/ball1.yy; } else if(ball1.yy == 0) { t2 = 2; } if((t1<=t2)&&(t1<= t)) { t-=t1; ball1.x += t1*ball1.xx; ball1.y += t1*ball1.yy; ball1.xx = -ball1.xx; } else if ((t2<=t1)&&(t2<=t)) { t-=t2; ball1.x += t2*ball1.xx; ball1.y += t2*ball1.yy; ball1.yy = -ball1.yy; } else { ball1.x += t*ball1.xx; ball1.y += t*ball1.yy; t = 0; } } } } public function kiy(event:Event):void { if(ball1.xx == 0 && ball1.yy == 0){ ky1.visible = true; ky1.x = ball1.x; ky1.y = ball1.y; kxx = ball1.x - stage.mouseX; kyy = ball1.y - stage.mouseY; ky1.rotation = Math.atan2(kyy,kxx)* 360/(2*Math.PI); mark = 1; angle = Math.atan2(kyy,kxx); } else { ky1.visible = false; mark = 0; } } public function cli(event:MouseEvent):void { if(mark==1) { ball1.xx = -force*Math.cos(angle); ball1.yy = -force*Math.sin(angle); } } } } При стирании класса мяча скрипт вобще перестает работать, хотя в ммяче заложено лишь торможение.......... Подскажите как исправить ошибку, много раз было, что флеш глючил, но щас никакие меры(копироование, переименовка) непомагают =((( |
|
|||||
|
Смотрел только 1й участок кода. В нем скорость зависит от угла. Не знаю как вы, а я не помню в реальной жизни ситуций с такой зависимостью: скорость зависит от силы удара, трения и пр. Угол (приложения силы)... Да, влияет, но он далеко не единственный, как в вашем примере.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Цитата:
Для вычисления положения мяча вообще не нужно вычислять какие-либо углы. Достаточно нормированного вектора скорости и скалярной величины скорости. При замедлении менять только скалярную величину скорости, но не вектор движения. |
|
|||||
|
Регистрация: Mar 2011
Сообщений: 6
|
В векторах я почти не разбираюсь, если скинете какоенибуть описание я буду весьма благодарен.
Дело происходит так - вокруг мяча крутится кий. когда нажимаем на поле мяч летит в направлении заданном кием, скорость по Х и по У определяется углом кия. Тоесть сама скорость всегда постоянна V*V = XX*XX + YY*YY В чем ошибка - при нажатии на поле, чем больше должен быть показатель УУ тем больше проходит времени без движения. После проишествия некоторого времени (число кадров, после которого УУ = 0) мяч начинает двигаться по оси Х. Ну так вот суть проблемы в том что покадровая функция торможения мяча сначала полностью спускает УУ до нуля, а уже после этого начинает спускать ХХ, хотя все должно происходить одновременно. Пока УУ не будет равна нулю мяч не движеться(что абсурдно, так как функция торможения и функция движения должны быть независимы). При стирании класса мяча скрипт вобще не выполняется ( бред тупого флеша) |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|