Я делаю флеш-игру для своего курса в колледже, я слежу за учебником, но открутил его ради себя. Одна стена, которую я ударил, заключается в том, что когда я запускаю пулю, она стреляет только вправо, с небольшим движением вверх или вниз, я пытаюсь исправить ее какое-то время, но ничего не происходит, и ничего не работает.Пули стреляют только вправо?
пакет {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
public class Wizard extends MovieClip {
private var dx:Number;
private var dy:Number;
private var Bulletspeed:int;
public var Angle:Number;
public var newAngle:Number;
var shotCoolDown:int;
const MAX_COOLDOWN=20;
public function Wizard() {
//constructor
//Shot cool down
shotCoolDown=MAX_COOLDOWN;
addEventListener(Event.ENTER_FRAME, update);
//set up an event listener for when the turret is added to stage
addEventListener(Event.ADDED_TO_STAGE, initialise);
}
function initialise(e:Event) {
//reduce shot cool down by one
shotCoolDown=shotCoolDown-1;
//add a click listener to the stage
stage.addEventListener(MouseEvent.CLICK, fire);
}
function fire(m:MouseEvent) {
//Able to shoot
if (shotCoolDown<=0) {
//resets cool down
shotCoolDown=MAX_COOLDOWN;
//spawn bullet
var B = new Bullet();
//set position and rotation of the bullet
B.rotation=rotation;
B.x=x;
B.y=y;
//add the bullet the the wizard
parent.addChild(B);
}
}
function update():void {
//Shot cool down
shotCoolDown--;
//Make the Wizard face the mouse
if (parent!=null) {
dx=stage.mouseX-this.x;
dy=stage.mouseY-this.y;
Math.abs(dx);
Math.abs(dy);
var Angle=Math.atan2(dy,dx);
var newAngle = Angle * (180/Math.PI);
if ((0 < newAngle) && (newAngle <= 90)) {
gotoAndPlay("Right");
} else if ((90 < newAngle) && (newAngle <= 180)) {
gotoAndPlay("Down");
} else if ((-180 < newAngle) && (newAngle <= -90)) {
gotoAndPlay("Left");
} else if ((-90 < newAngle) && (newAngle <= 0)) {
gotoAndPlay("Up");
}
this.rotation=Angle;
}
}
}
}
Вот код для моего класса игрока, с такими вещами, как пули стрельбы, а что нет. Я думаю, что знаю проблему, мне нужно связать ее с остальной частью обновления Wizard. Но я не знаю, как, вот мой класс пули, если это необходимо.
пакет {
import flash.display.Sprite;
import flash.events.Event;
public class Bullet extends Sprite {
private var speed:int;
private var myCharacter:Wizard;
public function Bullet() {
//constructor
speed = 10;
addEventListener(Event.ENTER_FRAME, update);
}
function update (e:Event) {
//Move in the direction the bullet is facing
x=x+Math.cos(rotation/180*Math.PI)*speed;
y=y+Math.sin(rotation/180*Math.PI)*speed;
//Clears bullet once it leaves the stage
if (x<0 || x>500 || y<0 || y>500) {
//removes the update listner
removeEventListener(Event.ENTER_FRAME, update);
parent.removeChild(this);
}
}
}
}
попробуйте заменить 'B.rotation = rotation;' на 'B.rotation = this.rotation;' Я уверен, что 'rotation' не определено, и именно поэтому он идет правильно (всегда установлен в 0) попробуйте использовать 'trace (rotation)', чтобы посмотреть, какая переменная находится во время выполнения. – Waltzy
Я сделал это, но ничего, угол остается между 1 и -1 каждым выстрелом, где бы я ни двигался –
Вращение - это не радия. попробуйте thisx = x + Math.cos (вращение) * скорость; и это y = y + Math.sin (вращение) * скорость; –