2016-06-28 1 views
0

J'essaie d'effectuer des contrôles de mouvement à la première personne pour un simple FPS. Je voudrais faire en flash, mais je me bats avec le mouvement directionnel.Création de contrôles à la première personne dans Actionscript 3

Résumé: Je voudrais être capable de créer des contrôles FPS en flash, mais je n'arrive pas à le faire correctement.

Détails: J'utilise une méthode par laquelle les rotations sont appliquées à un MovieClip (mc) qui reste stationnaire avec son point de pivotement sous votre point de vue, afin que le monde tourne apparemment autour de vous lorsque la souris est déplacé.

Ensuite, j'applique des mouvements directionnels à un mouvement de mouvement (box) imbriqué dans le mouvement de rotation du MovieClip (mc) pour donner l'illusion de se promener dans une vue à la première personne.

mc - Poignées rotation (un récipient pour box)

----- box - Poignées de traduction (box sert de plancher, de sorte que je l'ai comme un carré noir)

Le problème commence lorsque vous tournez mc et commencez à vous déplacer avec les touches fléchées. La traduction de box ne prend pas la rotation de mc en considération, et donc vous êtes toujours verrouillé sur les axes x et y de box donc, peu importe où vous faites face, vous êtes toujours verrouillé sur ces axes par opposition à la aller de l'avant traditionnel partout où vous faites face que la plupart des jeux FPS emploient. Je n'ai aucune idée de l'endroit où aller à partir d'ici, donc toute aide serait grandement appréciée.

Code Timeline:

//You’ll need a symbol named mc. With another symbol named box within it. 
//mc should be centered on the stage. 
//stage size 1920x1080 


var mL: Boolean = false; 
var mR: Boolean = false; 
var mD: Boolean = false; 
var mU: Boolean = false; 

var speed: int = 10; 

mc.rotationX=90; 
mc.y=1000; 

mc.x=932.1; 
mc.z=0; 
mc.width=980; 
mc.height=98; 



stage.addEventListener(Event.ENTER_FRAME, EF); 

function EF(e: Event): void { 
//Rotates mc based on distance of mouseX to the center of the stage. 
    if(mouseX<stage.stageWidth){ 
     mc.rotationY += speed*((mouseX-stage.stageWidth/2)*.0001); 
    } 
    if(mouseX>stage.stageWidth){ 
     mc.rotationY += speed*((mouseX-stage.stageWidth/2)*.0001); 
    } 


//Arrow key controls. 
    if (mL == true) { 
     mc.box.x += speed; 
    } 
    if (mR == true) { 
     mc.box.x -= speed; 
    } 
    if (mD == true) { 
     mc.box.y += speed; 
    } 
    if (mU == true) { 
     mc.box.y -= speed; 
    } 

} 

stage.addEventListener(KeyboardEvent.KEY_DOWN, kD); 
function kD(e: KeyboardEvent): void { 
//Key down conditionals. 
    if (e.keyCode == Keyboard.LEFT && mR == false && mD == false && mU == false) { 
     mL = true; 
    } 
    if (e.keyCode == Keyboard.LEFT && mR == false && mD == false && mU == true) { 
     mL = true; 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.UP && mR == false && mD == false && mL == true) { 
     mL = true; 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.LEFT && mR == false && mD == true && mU == false) { 
     mL = true; 
     mD = true; 
    } 
    if (e.keyCode == Keyboard.DOWN && mR == false && mU == false && mL == true) { 
     mL = true; 
     mD = true; 
    } 


    if (e.keyCode == Keyboard.RIGHT && mL == false && mD == false && mU == false) { 
     mR = true; 
    } 
    if (e.keyCode == Keyboard.RIGHT && mL == false && mD == false && mU == true) { 
     mR = true; 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.UP && mL == false && mD == false && mR == true) { 
     mR = true; 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.RIGHT && mL == false && mD == true && mU == false) { 
     mR = true; 
     mD = true; 
    } 
    if (e.keyCode == Keyboard.DOWN && mL == false && mU == false && mR == true) { 
     mR = true; 
     mD = true; 
    } 


    if (e.keyCode == Keyboard.UP && mR == false && mD == false && mL == false) { 
     mU = true; 
    } 
    if (e.keyCode == Keyboard.DOWN && mL == false && mR == false && mU == false) { 
     mD = true; 
    } 


} 

stage.addEventListener(KeyboardEvent.KEY_UP, kU); 
function kU(e: KeyboardEvent): void { 
//Key up conditionals. 
    if (e.keyCode == Keyboard.LEFT) { 
     mL = false; 
    } 
    if (e.keyCode == Keyboard.RIGHT) { 
     mR = false; 
    } 
    if (e.keyCode == Keyboard.UP) { 
     mU = false; 
    } 
    if (e.keyCode == Keyboard.DOWN) { 
     mD = false; 
    } 
} 

Répondre

0

Vous essayez de faire une simple pression sur la touche (avant) ajouter des quantités relatives de x et y positionnement. Vous aurez besoin d'une petite trigonométrie ici. Vous allez utiliser le mc.rotationY comme angle.

if (mU == true) { 
    mc.box._speed += speed; // instead of mc.box.y -= speed; 
    mc.box._ySpeed = Math.sin(mc.rotationY)*mc.box._speed; 
    mc.box._xSpeed = Math.cos(mc.rotationY)*mc.box._speed; 
} 

De même, mettez à jour vos autres instructions logiques.

Et puis ajoutez une fonction finale à mettre à jour des emplacements:

mc.box.y += mc.box._ySpeed; 
mc.box.x += mc.box._xSpeed; 

Telle est l'idée de base. Vous devrez peut-être faire quelques conversions entre radians et degrés, mais il y a beaucoup de ressources pour vous aider, et je me trompe toujours sans pouvoir tester, ce que je ne peux pas faire maintenant.