Comunidad de diseño web y desarrollo en internet online

Mejorando el juego de coches de carreras

Citar            
MensajeEscrito el 02 Nov 2010 10:24 am
Hola, hacia mucho que no posteaba por aqui...
pues nada que viendo el jueguecito de coches que teneis de tutorial, me puse con el y vi que estaba preparado para AS1!!!

he cambiado los nombres de las variables y la forma de interactuar las colisiones, en mi caso, dibujo un circuito trasparente que si se sale de el, frena el coche (todo con otra funcion de cristalab)

Espero que os guste! a ver si la proxima va en as3!
saludos!

archivo FLA[megaupload]

Código ActionScript :

stop();
//Variables de velocidad, angulo del coche y velocidad de giro
        //Velocidad maxima que pueden alcanzar los coches
rootVelocidad=15;

coche_mc.velocidad=0;
coche_mc.maxVelocidad=rootVelocidad;
coche_mc.angulo=270;
coche_mc.laps=0;
coche_mc.cP1=false;
coche_mc.cP2=false;
coche_mc.cP3=false;

coche2_mc.velocidad=0;
coche2_mc.maxVelocidad=rootVelocidad;
coche2_mc.angulo=270;
coche2_mc.laps=0;
coche2_mc.cP1=false;
coche2_mc.cP2=false;
coche2_mc.cP3=false;

velocidadRotacion=6;

//funcion que detecta las colisiones
function checkHit(a:MovieClip, b:MovieClip) {
   with (a) {
      if (b.hitTest(getBounds(_root).xMax, _y, true)) {
         return "left";
      } else if (b.hitTest(getBounds(_root).xMin, _y, true)) {
         return "right";
      } else if (b.hitTest(_x, getBounds(_root).yMax, true)) {
         return "up";
      } else if (b.hitTest(_x, getBounds(_root).yMin, true)) {
         return "down";
      } else {
         return false;
      }
   }
}

coche_mc.onEnterFrame=function(){    
    //Por cada frame ejecuta las siguientes condiciones
    
    // Un coche solo gira si esta en movimiento
    if(this.velocidad!=0){
        //por lo tanto solo girara si presiona la tecla correspondiente
        if (Key.isDown(Key.RIGHT)){            
            this.angulo += velocidadRotacion;
        }else if (Key.isDown(Key.LEFT)){            
            this.angulo += velocidadRotacion*(-1);
        }
    }
    
    //Velocidad y/o movimiento    
    //hacia adelante
    if (Key.isDown(Key.UP)){
        if(this.velocidad<rootVelocidad){
            this.velocidad+=0.5;                
        }
    }else{
        if(this.velocidad>0){
            this.velocidad-=0.5;
            if(this.velocidad<0.5){
                this.velocidad=0;
            }
        }
    }
    
    //hacia atras
    if (Key.isDown(Key.DOWN)){
        if(this.velocidad>-3){
            this.velocidad--;
        }
    }else{
        if (this.velocidad<0){
            this.velocidad+=0.1;
            if(this.velocidad>0.5){
                this.velocidad=0;            
            }
        }
    }
                
    
    //colisiones, condiciona al coche a ir por la carretera
    if(checkHit(this, circuito_mc)){    
        this.maxVelocidad=rootVelocidad;        
    }else{
        this.maxVelocidad=1;
        if(this.velocidad>1){
            this.velocidad-=1.5;
        }
    }
    
    //si cocha contra el otro coche
    if(checkHit(this, _root.coche2_mc)){        
        this.velocidad=1;
    }
    
    //Movemos el coche    
    //Direccion del coche
    radian = Math.PI/180*this.angulo;
    //posicion x = cos
    this._x += (this.velocidad*Math.cos(radian));
    //posicion y = sin
    this._y += (this.velocidad*Math.sin(radian));
    this._rotation = this.angulo;
    
    
    //Salidas de texto
    speed1_txt.text=Math.round(this.velocidad);
    
    if(checkHit(this, _root.checkpoint1_mc)){        
        this.cP1=true;
    }
    if(this.cP1){
        if(checkHit(this, _root.checkpoint2_mc)){        
            this.cP2=true;
        }
    }
    if(this.cP2){
        if(checkHit(this, _root.checkpoint3_mc)){        
            this.cP3=true;
        }
    }
    if(this.cP3){
        if(checkHit(this, _root.checkpoint4_mc)){        
            this.cP4=true;
        }
    }
    if(this.cP4){
        this.laps++;        
        _root.laps1_txt.text=this.laps;
        this.cP1=false;
        this.cP2=false;
        this.cP3=false;
        this.cP4=false;
    }
}


coche2_mc.onEnterFrame=function(){    
    //Por cada frame ejecuta las siguientes condiciones
    
    // Un coche solo gira si esta en movimiento
    if(this.velocidad!=0){
        //por lo tanto solo girara si presiona la tecla correspondiente
        if (Key.isDown(68)){            
            this.angulo += velocidadRotacion;
        }else if (Key.isDown(65)){            
            this.angulo += velocidadRotacion*(-1);
        }
    }
    
    //Velocidad y/o movimiento    
    //hacia adelante
    if (Key.isDown(87)){
        if(this.velocidad<rootVelocidad){
            this.velocidad+=0.5;                
        }
    }else{
        if(this.velocidad>0){
            this.velocidad-=0.5;
            if(this.velocidad<0.5){
                this.velocidad=0;
            }
        }
    }
    
    //hacia atras
    if (Key.isDown(83)){
        if(this.velocidad>-3){
            this.velocidad--;
        }
    }else{
        if (this.velocidad<0){
            this.velocidad+=0.1;
            if(this.velocidad>0.5){
                this.velocidad=0;            
            }
        }
    }
                
    
    //colisiones, condiciona al coche a ir por la carretera
    if(checkHit(this, circuito_mc)){    
        this.maxVelocidad=rootVelocidad;        

    }else{
        this.maxVelocidad=1;
        if(this.velocidad>1){
            this.velocidad-=1.5;
        }
    }
    //si cocha contra el otro coche
    if(checkHit(this, _root.coche_mc)){         
        this.velocidad=1;
    }
    
    //Movemos el coche    
    //Direccion del coche
    radian = Math.PI/180*this.angulo;
    //posicion x = cos
    this._x += (this.velocidad*Math.cos(radian));
    //posicion y = sin
    this._y += (this.velocidad*Math.sin(radian));
    this._rotation = this.angulo;
    
    //Salidas de texto
    speed2_txt.text=Math.round(this.velocidad);
    
    if(checkHit(this, _root.checkpoint1_mc)){        
        this.cP1=true;
    }
    if(this.cP1){
        if(checkHit(this, _root.checkpoint2_mc)){        
            this.cP2=true;
        }
    }
    if(this.cP2){
        if(checkHit(this, _root.checkpoint3_mc)){        
            this.cP3=true;
        }
    }
    if(this.cP3){
        if(checkHit(this, _root.checkpoint4_mc)){        
            this.cP4=true;
        }
    }
    if(this.cP4){
        this.laps++;        
        _root.laps2_txt.text=this.laps;
        this.cP1=false;
        this.cP2=false;
        this.cP3=false;
        this.cP4=false;
    }
}

Por theblabla

10 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Nov 2010 08:49 pm
Sí, estaría bien pasar este aporte a AS3. ver si te animas ;)

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

chrome
Citar            
MensajeEscrito el 15 Ene 2011 06:30 pm
Bueno aunque lo he metido todo en la misma clase, el asunto funciona :)

coches de carreras version AS 3.0 (dice que no esta disponible pero en unos dias lo estara, pues con el anterior paso lo mismo)

Os pego la clase

Código ActionScript :

package classes{//package
   
   import flash.display.*;
   import flash.events.*;
   import flash.utils.*;   
   import flash.ui.*;   
   import flash.net.*;
   
   public class Circuito extends Sprite{      
      //Velocidad maxima del coche
      private var maxCarSpeed:int = 10;
      //Velocidad a la que rota
      private var velocidadRotacion:int = 2;
      
      //Instancia del coche
      //Objeto que guarda las variables del coche 1
      private var carOne:Object = new Object();
      //Sprite que contiene el coche, el cual moveremos
      private var clipCarOne:Sprite = new Sprite();
      //Contenedor donde se carga la imagen del coche
      private var destinoCoche:Sprite = new Sprite();
      //Circuito creado en flash
      private var clipCircuito:MovieClip;
      //Instancia para el tiempo   
      private var timer:Timer;
      //variables para los botones presionados
      private var upPressed:Boolean;
      private var downPressed:Boolean;
      private var rightPressed:Boolean; 
      private var leftPressed:Boolean;
      //Instancia para el cargador
      var loader:Loader;
      //Instancia para la peticion URL
      var url:URLRequest;      
      
      //Constructor
      public function Circuito(circuito:MovieClip){//tenemos que pasarle el movieclip del circuito como parametro         
         this.clipCircuito = circuito;//aqui lo asociamos con la clase
         carOne.velocidad = 0;//velocidad inicial
         carOne.maxVelocidad = maxCarSpeed;//velocidad maxima que alcanza el coche 1
         carOne.angulo = 0;   //posicion (angulo del coche)
         
         clipCarOne.x = 150;//pos x
         clipCarOne.y = 200;//pos y
         
         //cargamos el coche
         loader = new Loader();            
         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, mostrarCoche);               
         url = new URLRequest("img/car.png");
         loader.load(url);         
         
         //Iniciamos el evento "tiempo"
         timer = new Timer(28, 0);// Timer(Milisegundos (50 = 20 veces por segundo), nº de llamadas al resultado (0 = infinito, 1 = una sola vez...) //Instancia del listener
         timer.addEventListener(TimerEvent.TIMER, moveCar);//Le asociamos funcion de resultado por cada ciclo de tiempo
         timer.start();//Iniciamos el listener         
      }//function
      
      private function keyUpListener(e:KeyboardEvent):void {            
         if (e.keyCode == Keyboard.RIGHT){
            rightPressed = false;
         }else if(e.keyCode == Keyboard.LEFT){
            leftPressed = false;
         }else if(e.keyCode == Keyboard.DOWN){
            downPressed = false;
         }else if(e.keyCode == Keyboard.UP){
            upPressed = false;
         }
      }
      
      private function keyDownListener(e:KeyboardEvent):void {            
         if (e.keyCode == Keyboard.RIGHT){            
            rightPressed = true;
         }else if(e.keyCode == Keyboard.LEFT){
            leftPressed = true;
         }else if(e.keyCode == Keyboard.DOWN){
            downPressed = true;
         }else if(e.keyCode == Keyboard.UP){
            upPressed = true;
         }      
      }
      
      private function mostrarCoche(e:Event){
         destinoCoche.addChild(e.target.content);         
         destinoCoche.y = (destinoCoche.height/2)*-1;//colocamos el clip para que gire delsde el eje central         
         clipCarOne.addChild(destinoCoche);//añadimos el coche al clip que se movera
         
         stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);//iniciamos los eventos del teclado
         stage.addEventListener(KeyboardEvent.KEY_UP, keyUpListener);
         addChild(clipCarOne);//añadimos el clip del coche al escenario
      }      
            
      //Funcion que mueve el coche
      public function moveCar(e:TimerEvent){ //Similar a enterframe, solo que hay que actualizar el objeto con e.updateAfterEvent(); //se para con timer.stop();
         //calculos para las teclas izquierda y derecha
         if(carOne.velocidad > 0.5 || carOne.velocidad < -0.5){            
            if(rightPressed){                           
               carOne.angulo += velocidadRotacion;                           
            }else if(leftPressed){                  
               carOne.angulo += velocidadRotacion*(-1);                     
            }            
         }         
         //calculos para las teclas arriba y abajo
         if(upPressed){            
            if(carOne.velocidad < maxCarSpeed){
               carOne.velocidad += 0.5;               
            }
         }else{
            if(carOne.velocidad > 0){
               carOne.velocidad -= 0.5;   
            }
         }
         
         if(downPressed){
            if(carOne.velocidad > -3){
               carOne.velocidad -= 0.5;                  
            }               
         }else{
            if(carOne.velocidad < 0){
               carOne.velocidad += 0.5;   
            }
         }
         //Obligamos al coche a ir por el circuito con hitTestPoint
         if(clipCircuito.hitTestPoint(clipCarOne.x, clipCarOne.y, true)){   
            carOne.maxVelocidad = maxCarSpeed;            
         }else{
            carOne.maxVelocidad = 2;
            if(carOne.velocidad > 2){
               carOne.velocidad -= 1.5;
            }
         }
         //calculos para la direccion del coche
         var radian:Number = Math.PI/180*carOne.angulo;                  
         clipCarOne.x += carOne.velocidad*Math.cos(radian);         
         clipCarOne.y += carOne.velocidad*Math.sin(radian);
         clipCarOne.rotation = carOne.angulo;         
         e.updateAfterEvent();         
      }//function
   }
}


Saludoos

Por theblabla

10 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Ene 2011 08:57 pm
Parece que ya esta disponible el archivo :)

Saludos!

Por theblabla

10 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.