Да, значения ускорения, торможения, силы прыжка и т.д. На скирре такая же фига - всё дело в настройках коэффициентов.
Забыл добавить: версия онлайн значительно тормазнутее обычной версии. Или это только у меня.
Баг исправлен, ссылки обновлены. Подтверджаю - сейчас физика стала гораздо лучше. Осталось подтянуть коэффициенты и вперёд! О каких коэфицентах идёт речь? Ты имеешь в виду скорость падения, скорость движения и т.д.?
Подтверджаю - сейчас физика стала гораздо лучше. Осталось подтянуть коэффициенты и вперёд!
да, да, я тоже это увидел. это происходит в момент смены jumpSpeed с + на -( в момент оканчания взлёта и начала падения)
баг: Во время прыжка(на взлете), есть возможность впечатываться в стену
решил проблему вот таким кодом. возможно всё было иза минуса, потому в хаде выводился минус и всё, никаких цифр, если я шёл в лево PHP код: if(((movingSpeed>0)and(movingSpeed<0.01))or((movingSpeed<0)and(movingSpeed>-0.01))){ movingSpeed = 0; }
if(((movingSpeed>0)and(movingSpeed<0.01))or((movingSpeed<0)and(movingSpeed>-0.01))){ movingSpeed = 0; }
Сделай так чтобы в хад выводилась значение movingSpeed и посмотри с какие значения у нее при повернутом влево и вправо персонаже. Думаю связано с минусом в выражении.
исправил много глюков(кроме скольжения) http://redcode.do.am/FlaP_optim.swf код стал немного быстрее и крассивее PHP код: //can changevar maxJumpSpeed = 5;var maxMovingSpeed = 2;//not changevar jumpSpeed = 0;var isMoving = false;var dir = "right";var airdir = "graund";var onGraund1 = false;var movingSpeed = 0;var liftSize = 144;var platformsArr = [];var platformsCount = 0;var liftsArr = [];var liftsCount = 0;var liftsStatus = 0;var liftsStatus1 = 0;function spritesUpdate() { if (airdir == "graund") { if (isMoving == false) { if (dir == "right") { hero.gotoAndStop(1); } else { hero.gotoAndStop(2); } } else { if (dir == "right") { hero.gotoAndStop(3); } else { hero.gotoAndStop(4); } } } if (airdir == "jumping") { if (dir == "right") { hero.gotoAndStop(5); } else { hero.gotoAndStop(6); } } if (airdir == "falling") { if (dir == "right") { hero.gotoAndStop(7); } else { hero.gotoAndStop(8); } }}function inputUpdate() { isMoving = false; if (Key.isDown(Key.ESCAPE)) { _parent.gotoAndStop(2); } if (Key.isDown(Key.LEFT)) { if (onGraund1) { isMoving = true; } dir = "left"; movingSpeed = -maxMovingSpeed; } if (Key.isDown(Key.RIGHT)) { if (onGraund1) { isMoving = true; } dir = "right"; movingSpeed = maxMovingSpeed; } if ((Key.isDown(Key.UP)) and (onGraund1 == true)) { airdir = "jumping"; jumpSpeed = maxJumpSpeed; }}function physicUpdate() { if (liftsStatus1 == liftSize) { liftsStatus = 2; } if (liftsStatus1 == 0) { liftsStatus = 1; } if (liftsStatus == 1) { liftsStatus1 += 1; for (i=1; i<=liftsCount; i++) { liftsArr[i]._y -= 1; } } else { liftsStatus1 -= 1; for (i=1; i<=liftsCount; i++) { liftsArr[i]._y += 1; } } onGraund1 = false; for (i=1; i<=platformsCount; i++) { if (hero.mu.hitTest(platformsArr[i])) { jumpSpeed = -1; } if (hero.md.hitTest(platformsArr[i])) { onGraund1 = true; } if (hero.mr.hitTest(platformsArr[i])) { if(movingSpeed>0){ movingSpeed = 0; } } if (hero.ml.hitTest(platformsArr[i])) { if(movingSpeed<0){ movingSpeed = 0; } } } for (i=1; i<=liftsCount; i++) { if (hero.mu.hitTest(liftsArr[i])) { jumpSpeed = -1; } if (hero.md.hitTest(liftsArr[i])) { onGraund1 = true; if (liftsStatus == 2) { hero._y += 1; } else { hero._y -= 1; } } if (hero.mr.hitTest(liftsArr[i])) { if(movingSpeed>0){ movingSpeed = 0; } } if (hero.ml.hitTest(liftsArr[i])) { if(movingSpeed<0){ movingSpeed = 0; } } } if (onGraund1 == true) { airdir = "graund"; } else { if (jumpSpeed>0) { airdir = "jumping"; } else { airdir = "falling"; } } hero._x += movingSpeed; jumpSpeed -= 0.1; if (airdir == "graund") { if (jumpSpeed<0) { jumpSpeed = 0; } } if(jumpSpeed<-3){ jumpSpeed=-3; } hero._y -= jumpSpeed; movingSpeed *= 0.94;}function cameraUpdate(){ _x = -(hero._x-320); _y = -(hero._y-240); if (_x>0) { _x = 0; } if (_y>0) { _y = 0; } if (_x<640-_width) { _x = 640-_width; } if (_y<480-_height) { _y = 480-_height; } bk._x = -_x; bk._y = -_y;}onEnterFrame = function () { inputUpdate(); physicUpdate(); spritesUpdate(); cameraUpdate();};
//can changevar maxJumpSpeed = 5;var maxMovingSpeed = 2;//not changevar jumpSpeed = 0;var isMoving = false;var dir = "right";var airdir = "graund";var onGraund1 = false;var movingSpeed = 0;var liftSize = 144;var platformsArr = [];var platformsCount = 0;var liftsArr = [];var liftsCount = 0;var liftsStatus = 0;var liftsStatus1 = 0;function spritesUpdate() { if (airdir == "graund") { if (isMoving == false) { if (dir == "right") { hero.gotoAndStop(1); } else { hero.gotoAndStop(2); } } else { if (dir == "right") { hero.gotoAndStop(3); } else { hero.gotoAndStop(4); } } } if (airdir == "jumping") { if (dir == "right") { hero.gotoAndStop(5); } else { hero.gotoAndStop(6); } } if (airdir == "falling") { if (dir == "right") { hero.gotoAndStop(7); } else { hero.gotoAndStop(8); } }}function inputUpdate() { isMoving = false; if (Key.isDown(Key.ESCAPE)) { _parent.gotoAndStop(2); } if (Key.isDown(Key.LEFT)) { if (onGraund1) { isMoving = true; } dir = "left"; movingSpeed = -maxMovingSpeed; } if (Key.isDown(Key.RIGHT)) { if (onGraund1) { isMoving = true; } dir = "right"; movingSpeed = maxMovingSpeed; } if ((Key.isDown(Key.UP)) and (onGraund1 == true)) { airdir = "jumping"; jumpSpeed = maxJumpSpeed; }}function physicUpdate() { if (liftsStatus1 == liftSize) { liftsStatus = 2; } if (liftsStatus1 == 0) { liftsStatus = 1; } if (liftsStatus == 1) { liftsStatus1 += 1; for (i=1; i<=liftsCount; i++) { liftsArr[i]._y -= 1; } } else { liftsStatus1 -= 1; for (i=1; i<=liftsCount; i++) { liftsArr[i]._y += 1; } } onGraund1 = false; for (i=1; i<=platformsCount; i++) { if (hero.mu.hitTest(platformsArr[i])) { jumpSpeed = -1; } if (hero.md.hitTest(platformsArr[i])) { onGraund1 = true; } if (hero.mr.hitTest(platformsArr[i])) { if(movingSpeed>0){ movingSpeed = 0; } } if (hero.ml.hitTest(platformsArr[i])) { if(movingSpeed<0){ movingSpeed = 0; } } } for (i=1; i<=liftsCount; i++) { if (hero.mu.hitTest(liftsArr[i])) { jumpSpeed = -1; } if (hero.md.hitTest(liftsArr[i])) { onGraund1 = true; if (liftsStatus == 2) { hero._y += 1; } else { hero._y -= 1; } } if (hero.mr.hitTest(liftsArr[i])) { if(movingSpeed>0){ movingSpeed = 0; } } if (hero.ml.hitTest(liftsArr[i])) { if(movingSpeed<0){ movingSpeed = 0; } } } if (onGraund1 == true) { airdir = "graund"; } else { if (jumpSpeed>0) { airdir = "jumping"; } else { airdir = "falling"; } } hero._x += movingSpeed; jumpSpeed -= 0.1; if (airdir == "graund") { if (jumpSpeed<0) { jumpSpeed = 0; } } if(jumpSpeed<-3){ jumpSpeed=-3; } hero._y -= jumpSpeed; movingSpeed *= 0.94;}function cameraUpdate(){ _x = -(hero._x-320); _y = -(hero._y-240); if (_x>0) { _x = 0; } if (_y>0) { _y = 0; } if (_x<640-_width) { _x = 640-_width; } if (_y<480-_height) { _y = 480-_height; } bk._x = -_x; bk._y = -_y;}onEnterFrame = function () { inputUpdate(); physicUpdate(); spritesUpdate(); cameraUpdate();};
так что мне делать со скольжением?
+ баг: если стоять(без движения) под низким потолком и прыгнуть, то прыгнуть толком не получиться.
А вообще с новой физикой появились и новые глюки. Нужно заняться оптимизацей.
Я сделал очень прадоподобный прыжок, очень. http://redcode.do.am/flap-kopija.swf (лучше скачай(файл,сохранить как) Но появилась очень большая проблема, которую я раньше не замечал. А именно, если пойти влево, то скольжение будет длиться очень долго. Такой же баг я видел в суперКароши, и она тоже на флэш.
Синусы и косинусы, эта уже немного другая физика. С векторами.
Ну в школьной физике формула падения тела будет: x = x0 + v0 + (g*t^2)/2 либо(дайбогпамяти) v = v0 + g*t А если перенести на твои переменные (буквой t можно пренебречь, т.к. мы берем его через равные промежутки времени) jumpSpeed = jumpSpeed + G // ускарение свободного падения, его надо подобрать
у меня была идея найти процент jumpForce от maxJumpForce и умножить на speed, но получалось слишком ровно и не правдоподобно. А вообще можно как то сделать через синусы.
А если попробовать не умножать на какой-то коэфициент, а отнимать\дабовлять его к скорости. зы: поробуй 0.988 и 1.02(или 0.989 и 1.01)
Вот только я не могу подобрать нужные 0.988 и 1.01 что бы было плавно
вот, это я и написал, только немного подругому PHP код: if ((Key.isDown(Key.UP)) and (onGraund1 == true)) { airdir = "jumping"; jumpForce = maxJumpForce; jumpSpeed = maxJumpSpeed; }//------------------------------------------if (jumpForce>0) { airdir = "jumping"; hero._y -= (1/(gravitation/80)*jumpSpeed); jumpForce -= jumpSpeed; jumpSpeed *= 0.988; if(jumpForce<=0){ fallSpeed = jumpSpeed; } }if ((jumpForce == 0) and (onGraund1 == false)) { hero._y += (gravitation/80)*fallSpeed; fallSpeed *= 1.01; }
if ((Key.isDown(Key.UP)) and (onGraund1 == true)) { airdir = "jumping"; jumpForce = maxJumpForce; jumpSpeed = maxJumpSpeed; }//------------------------------------------if (jumpForce>0) { airdir = "jumping"; hero._y -= (1/(gravitation/80)*jumpSpeed); jumpForce -= jumpSpeed; jumpSpeed *= 0.988; if(jumpForce<=0){ fallSpeed = jumpSpeed; } }if ((jumpForce == 0) and (onGraund1 == false)) { hero._y += (gravitation/80)*fallSpeed; fallSpeed *= 1.01; }
а так? PHP код: if (jumpForce>0) { airdir = "jumping"; hero._y -= (1/(gravitation/80)*jumpSpeed); jumpSpeed = jumpSpeed * airResistance; jumpForce -= jumpSpeed; }
if (jumpForce>0) { airdir = "jumping"; hero._y -= (1/(gravitation/80)*jumpSpeed); jumpSpeed = jumpSpeed * airResistance; jumpForce -= jumpSpeed; }