Andrew

FlaP d003e003

Оценить эту запись
Протестите пожалуйста.
Вот я наконец то сделал основу двига FlaP(да, я изменил название). Это уже вполне "играбельная" версия движка. На нём уже можно сделать хороший(почти профессиональный) платформер. Правда, физика ещё не полностью дописана. Это мощный прорыв.
Спойлер Скрины:


"меню. фон движется."

"сама игровая карта. верху тестовый хад, с помощью которого вы можете тэстить игру."

http://redcode.do.am/load/algoritmy/flap_3_3/2-1-0-5(16 кб)
А для тек , кому влом качать вот версия онлайн http://redcode.do.am/FlaP.swf

Отправить "FlaP d003e003" в Digg Отправить "FlaP d003e003" в del.icio.us Отправить "FlaP d003e003" в StumbleUpon Отправить "FlaP d003e003" в Google Отправить "FlaP d003e003" в VKontakte Отправить "FlaP d003e003" в Facebook

Обновлено 09.02.2012 в 19:50 Andrew

Метки: Нет Добавить / редактировать метки
Категории
Без категории

Комментарии

  1. Аватар для Andrew
    Всё исправил. Выглядит классно. Можешь попробовать прикрутить это к прыжку(я тоже буду пробовать)?
    PHP код:
    //can change
    var gravitation 80;
    var 
    maxJumpForce 96;
    var 
    jumpSpeed 2;
    var 
    fallSpeed 2;
    var 
    maxMovingSpeed 2;

    //not change
    var isMoving false;
    var 
    dir "right";
    var 
    airdir "graund";
    var 
    jumpForce 0;
    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 = (1) * maxMovingSpeed// вправо, хотя вроде наоборот
        
    }
        if ((
    Key.isDown(Key.UP)) and (onGraund1 == true)) {
            
    airdir "jumping";
            
    jumpForce maxJumpForce;
        }
        
    hero._x += movingSpeed;
        
    movingSpeed movingSpeed 0.96// тормазим 
    }
    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])){
                
    jumpForce 0;
            }
            if(
    hero.md.hitTest(platformsArr[i])){
                
    onGraund1 true;
            }
            if(
    hero.mr.hitTest(platformsArr[i])){
                
    hero._x-=maxMovingSpeed;
                
    movingSpeed 0;
            }
            if(
    hero.ml.hitTest(platformsArr[i])){
                
    hero._x+=maxMovingSpeed;
                
    movingSpeed 0;
            }
        }
        for(
    i=1;i<=liftsCount;i++){
            if(
    hero.mu.hitTest(liftsArr[i])){
                
    jumpForce 0;
            }
            if(
    hero.md.hitTest(liftsArr[i])){
                
    onGraund1 true;
                if(
    liftsStatus==2){
                    
    hero._y+=1;
                } else {
                    
    hero._y-=1;
                }
            }
            if(
    hero.mr.hitTest(liftsArr[i])){
                
    hero._x-=maxMovingSpeed;
                
    movingSpeed 0;
            }
            if(
    hero.ml.hitTest(liftsArr[i])){
                
    hero._x+=maxMovingSpeed;
                
    movingSpeed 0;
            }
        }
        if ((
    jumpForce == 0) and (onGraund1 == false)) {
            
    hero._y += (gravitation/80)*fallSpeed;
        }
        if (
    onGraund1 == true) {
            
    airdir "graund";
        } else {
            if (
    jumpForce>0) {
                
    airdir "jumping";
            } else {
                
    airdir "falling";
            }
        }
        if (
    hero._x<0) {
            
    hero._x 0;
        }
        if (
    hero._x>640-hero._width) {
            
    hero._x 640-hero._width;
        }
        if (
    jumpForce<0) {
            
    jumpForce 0;
        }
        if (
    jumpForce>0) {
            
    airdir "jumping";
            
    hero._y -= 1/(gravitation/80)*jumpSpeed;
            
    jumpForce -= jumpSpeed;
        }
    }
    function 
    drawHUD() {
        
    grav.text "Gravitation: "+gravitation;
        
    stat.text "Status: "+dir+" & "+airdir;
        
    sp.text "Jump Speed: "+jumpSpeed;
        
    jf.text "Jump Force: "+maxJumpForce;
        
    spg.text "Moving Speed: "+maxMovingSpeed;
    }

    onEnterFrame = function () {
        
    inputUpdate();
        
    physicUpdate();
        
    spritesUpdate();
        
    drawHUD();
    }; 
  2. Аватар для Andrew
    пишу скрипт в хад для того чтобы узнать фпс. Потом попробую перенести двиг на ас3(это был ас2) и посмотреть, увеличится ли фпс.
  3. Аватар для Рыб
    PHP код:
    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 = (1) * maxMovingSpeed// вправо, хотя вроде наоборот
        
    }
        if (
    Key.isDown(Key.UP)) {
            if  (
    onGraund1 == true)){ // если мы стоит на земле, то толчок
            
    airdir "jumping";
            
    jumpForce maxJumpForce;
         }
         
    jumpForce jumpForce airResistance// неспеша уменшаем силу прыжка за счет ситы трения
        
    }
        
    hero._x += movingSpeed;
        
    movingSpeed movingSpeed 0.96// тормазим 

    Добавь
    var airResistance = 0.96 // трение воздуха(кооэфицент тормажения)
    правдп что будет с падением я даже прикинуть не могу.
    Обновлено 10.02.2012 в 22:10 Рыб
  4. Аватар для Andrew
    не, не сработает. вопервых jumpForce = jumpForce * airResistance; сработает только тогда, когда нажата клавиша Вверх. Во вторых jumpForce это не сила прыжка, вопрёки названию, а сколько пиклелей осталось подниматься. Вот часть из физикАпдэйт
    PHP код:
    if (jumpForce>0) {
            
    airdir "jumping";
            
    hero._y -= (1/(gravitation/80)*jumpSpeed);
            
    jumpForce -= jumpSpeed;
        } 
  5. Аватар для Andrew
    Вот что у меня вышло со скролингом.
    http://redcode.do.am/FlaP01.swf
  6. Аватар для Рыб
    а так?
    PHP код:
    if (jumpForce>0) {
            
    airdir "jumping";
            
    hero._y -= (1/(gravitation/80)*jumpSpeed);
                    
    jumpSpeed jumpSpeed airResistance;
            
    jumpForce -= jumpSpeed;
        } 
  7. Аватар для Andrew
    вот, это я и написал, только немного подругому
    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;
        } 
  8. Аватар для Andrew
    Вот только я не могу подобрать нужные 0.988 и 1.01 что бы было плавно
  9. Аватар для Рыб
    А если попробовать не умножать на какой-то коэфициент, а отнимать\дабовлять его к скорости.
    зы: поробуй 0.988 и 1.02(или 0.989 и 1.01)
  10. Аватар для Andrew
    у меня была идея найти процент jumpForce от maxJumpForce и умножить на speed, но получалось слишком ровно и не правдоподобно. А вообще можно как то сделать через синусы.
  11. Аватар для Рыб
    Ну в школьной физике формула падения тела будет:
    x = x0 + v0 + (g*t^2)/2
    либо(дайбогпамяти)
    v = v0 + g*t
    А если перенести на твои переменные (буквой t можно пренебречь, т.к. мы берем его через равные промежутки времени)
    jumpSpeed = jumpSpeed + G // ускарение свободного падения, его надо подобрать
  12. Аватар для Рыб
    Синусы и косинусы, эта уже немного другая физика. С векторами.
  13. Аватар для Andrew
    Я сделал очень прадоподобный прыжок, очень.
    http://redcode.do.am/flap-kopija.swf (лучше скачай(файл,сохранить как)
    Но появилась очень большая проблема, которую я раньше не замечал. А именно, если пойти влево, то скольжение будет длиться очень долго. Такой же баг я видел в суперКароши, и она тоже на флэш.
  14. Аватар для Andrew
    А вообще с новой физикой появились и новые глюки. Нужно заняться оптимизацей.
  15. Аватар для Рыб
    + баг: если стоять(без движения) под низким потолком и прыгнуть, то прыгнуть толком не получиться.
  16. Аватар для Andrew
    так что мне делать со скольжением?
  17. Аватар для Andrew
    исправил много глюков(кроме скольжения)
    http://redcode.do.am/FlaP_optim.swf
    код стал немного быстрее и крассивее
    PHP код:
    //can change
    var maxJumpSpeed 5;
    var 
    maxMovingSpeed 2;

    //not change
    var 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=1i<=liftsCounti++) {
                
    liftsArr[i]._y -= 1;
            }
        } else {
            
    liftsStatus1 -= 1;
            for (
    i=1i<=liftsCounti++) {
                
    liftsArr[i]._y += 1;
            }
        }
        
    onGraund1 false;
        for (
    i=1i<=platformsCounti++) {
            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=1i<=liftsCounti++) {
            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();
    }; 
  18. Аватар для Рыб
    Сделай так чтобы в хад выводилась значение movingSpeed и посмотри с какие значения у нее при повернутом влево и вправо персонаже. Думаю связано с минусом в выражении.
  19. Аватар для Andrew
    решил проблему вот таким кодом. возможно всё было иза минуса, потому в хаде выводился минус и всё, никаких цифр, если я шёл в лево
    PHP код:
    if(((movingSpeed>0)and(movingSpeed<0.01))or((movingSpeed<0)and(movingSpeed>-0.01))){
            
    movingSpeed 0;
        }