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;
}
}