Просмотр полной версии : направление шарика в сторону курсора мыши
Gonsalez
14.03.2011, 21:11
есть шарик с именем mc который можно двигать с помощью клавиатуры.. при нажатии клавиши А либо левой кнопки мыши этот шарик стреляет другим шариком но лишь в одном направлении..
вот код:
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
var dist:Number = 0;
var Balls:Array = new Array();
var fire:MovieClip;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyboardF);
//событие клавиатуры;
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouse);
stage.addEventListener(Event.ENTER_FRAME, moveBall);
// событие обновления экрана;
fire= new MovieClip();
fire.x = 0;
fire.y = 0;
function mouse(e:MouseEvent):void
{
var Ball:ball = new ball();
addChild(fire);
fire.addChild(Ball);
Ball.x = mc.x;
Ball.y = mc.y;
}
function keyboardF(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.A)
{
var Ball:ball = new ball();
addChild(fire);
fire.addChild(Ball);
Ball.x = mc.x;
Ball.y = mc.y;
}
if (e.keyCode == Keyboard.DOWN)
{
mc.y += 4;
}
else if (e.keyCode == Keyboard.UP)
{
mc.y -= 4;
}
if (e.keyCode == Keyboard.RIGHT)
{
mc.x += 4;
}
else if (e.keyCode == Keyboard.LEFT)
{
mc.x -= 4;
}
}
function moveBall(e:Event):void
{
for (var i=0; i<fire.numChildren; i++)
{
var Ball:DisplayObject = fire.getChildAt(i);
Ball.y -= 5;
if (Ball.y < 0)
{
fire.removeChildAt(i);
trace("Шарик удален");
}
}
}
нужно сделать чтобы при выстреле шарик летел в ту сторону где находится курсор мыши.. помогите советом как такое можно осуществить, с помощью чего, как действовать дальше?
Добавлено через 3 часа 16 минут
нашел такой кодfunction enterFrame(event:Event):void {
object.x+= speed;
object.y+= speed;
object.x+= speed*Math.cos(angle);
object.y+= speed*Math.sin(angle);
object.rotation=Math.atan2(mouseY-object.y,mouseX-object.x)*180/Math.PI;
}
работает но шарик летит в сторону курсора но если сдвинуть курсор шарик меняет направление и продолжает лететь к курсору и останавливается рядом с ним, а нужно чтобы летел в прямом направлении в ту сторону где находился курсор при выстреле не меняя направления.. помогите разобраться
расчитывай "найденный" код по ивенту MOUSE_DOWN
чтот вроде:
var dx:Number;
var dy:Number;
function mouseDownHandler(event:MouseEvent):void {
var angle:Number = Math.atan2(mouseY-object.y, mouseX-object.x);
this.dx = speed*Math.cos(angle);
this.dy = speed*Math.sin(angle);
}
function enterFrame(event:Event):void {
object.x += this.dx;
object.y += this.dy;
}
Gonsalez
16.03.2011, 13:57
сделал по этому методу шарики при выстреле не прилипают к курсору но все равно продолжают менять направление в сторону где находился курсор при повторном выстреле
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
var dist:Number = 0;
var Balls:Array = new Array();
var speed:Number = 10;
var angle:Number;
var dx:Number;
var dy:Number;
var fire:MovieClip;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyboardF);
//событие клавиатуры;
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouse);
stage.addEventListener(Event.ENTER_FRAME, moveBall);
// событие обновления экрана. Об этом смотри ниже;
fire= new MovieClip();
fire.x = 0;
fire.y = 0;
function mouse(e:MouseEvent):void
{//тип String. Пояснение ниже
var Ball:ball = new ball();
var angle:Number = Math.atan2(mouseY - mc.y,mouseX - mc.x);
this.dx = speed * Math.cos(angle);
this.dy = speed * Math.sin(angle);
addChild(fire);
fire.addChild(Ball);
Ball.x = mc.x;
Ball.y = mc.y;
trace(angle);
trace(dx, dy);
}
function keyboardF(e:KeyboardEvent):void
{//тип String. Пояснение ниже
if (e.keyCode == Keyboard.A)
{
var Ball:ball = new ball();
addChild(fire);
fire.addChild(Ball);
Ball.x = mc.x;
Ball.y = mc.y;
}
if (e.keyCode == Keyboard.DOWN)
{//проверяется, какая клавиша нажата
mc.y += 4;
}
else if (e.keyCode == Keyboard.UP)
{
mc.y -= 4;
}
if (e.keyCode == Keyboard.RIGHT)
{//проверяется, какая клавиша нажата
mc.x += 4;
}
else if (e.keyCode == Keyboard.LEFT)
{
mc.x -= 4;
}
}
function moveBall(e:Event):void
{
for (var i=0; i<fire.numChildren; i++)
{
var Ball:DisplayObject = fire.getChildAt(i);
Ball.x += dx;
Ball.y += dy;
if (Ball.y < dy,Ball.x < dx)
{
fire.removeChildAt(i);
trace("Шарик удален");
}
}
}
помогите разобраться найти ошибку
Gonsalez
19.03.2011, 20:59
проблема так и не решена((
пробовал сделать еще таким методом
var dist:Number = 0;
var mc_speedXFROM: Array=new Array();
var mc_speedYFROM: Array=new Array();
var mc_angle;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyboardF);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouse);
stage.addEventListener(Event.ENTER_FRAME, moveBall);
function mouse(e:MouseEvent):void
{
for (var i=0; i<fire.numChildren; i++)
{
mc_angle = Math.atan2(mouseY - mc.y,mouseX - mc.x);
mc_speedXFROM[i] = Math.cos(mc_angle);
mc_speedYFROM[i] = Math.sin(mc_angle);
trace(i);
}
var Ball:ball = new ball();
Ball.x = mc.x;
Ball.y = mc.y;
fire.addChildAt(Ball,0);
}
function keyboardF(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.DOWN)
{
mc.y += 4;
}
else if (e.keyCode == Keyboard.UP)
{
mc.y -= 4;
}
if (e.keyCode == Keyboard.RIGHT)
{
mc.x += 4;
}
else if (e.keyCode == Keyboard.LEFT)
{
mc.x -= 4;
}
}
function moveBall(e:Event):void
{
for (var s=0; s<fire.numChildren; s++)
{
var Ball:DisplayObject = fire.getChildAt(s);
Ball.x += mc_speedXFROM[s] * 5;
Ball.y += mc_speedYFROM[s] * 5;
if (Ball.y < 0)
{
fire.removeChildAt(s);
trace("Шарик удален");
}
}
} но проблема все та же остается(( помогите разобраться что не правильно
ты при каждом нажатии на кнопку мышки переопределяешь направление для всех шариков
for (var i=0; i<fire.numChildren; i++)
{
mc_angle = Math.atan2(mouseY - mc.y,mouseX - mc.x);
mc_speedXFROM[i] = Math.cos(mc_angle);
mc_speedYFROM[i] = Math.sin(mc_angle);
trace(i);
}
Gonsalez
19.03.2011, 23:05
как это исправить?? задать параметр для i правильно понимаю?
там вообще цикл не нужен
mc_angle = Math.atan2(mouseY - mc.y,mouseX - mc.x);
mc_speedXFROM.push = Math.cos(mc_angle);
mc_speedYFROM.push = Math.sin(mc_angle);
естественно это решение не лучшее, я бы шар выделил в отдельный класс.
Gonsalez
20.03.2011, 01:57
я новичок во флеше поэтому делаю тем методом который более менее понятен..
кому не сложно посмотрите пожалуйста исходный файл помогите исправить уже неделю мучаюсь с этим шаром((
у меня твой файл не открывается, наверно CS5.
я без классов писать не умею.
Попробуйте так:
function mouse(e:MouseEvent):void {
var Ball:ball = new ball();
fire.addChildAt(Ball,0);
Ball.x = mc.x;
Ball.y = mc.y;
mc_angle = Math.atan2(mouseY - mc.y,mouseX - mc.x);
Ball["mc_speedXFROM"] = Math.cos(mc_angle);
Ball["mc_speedYFROM"] = Math.sin(mc_angle);
}
хранить speedXFROM и speedYFROM в шарике
и затем брать их из шарика в цикле
function moveBall(e:Event):void {
for (var s=0; s<fire.numChildren; s++) {
var Ball:DisplayObject = fire.getChildAt(s);
Ball.x += Ball["mc_speedXFROM"] * 5;
Ball.y += Ball["mc_speedYFROM"] * 5;
if (Ball.y < 0) {
fire.removeChildAt(s);
trace("Шарик удален");
}
}
}
2kseniya, а есть разница между кодом в кадре и кодом в классе? Ну всмысле в чем плюсы, минусы?
писать в кадрах зло)
конечно лучше в классе, например:
package {
import flash.display.Sprite;
public class Ball extends Sprite {
public var mc_speedXFROM:Number = 0;
public var mc_speedYFROM:Number = 0;
public function Ball() {
}
}
}
такой способ хранения лучше чем хранить в массиве. меньше путаницы и проблем.
Не смог открыть твой пример.
Написал свой.
package{
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.utils.Dictionary;
import flash.ui.Keyboard;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flashx.textLayout.formats.Direction;
import flash.geom.Point;
import flash.events.MouseEvent;
public class Main extends MovieClip {
private var _keys : Array = new Array();
private var _ball : MovingObject;
private var _bullets : Vector.<MovingObject> = new Vector.<MovingObject>();
public function Main() {
_ball = new MovingObject(createBall());
_ball.speed = 5;
addChild(_ball);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(MouseEvent.CLICK, clickHandler);
}
private function createBall(radius : Number = 10, color : uint = 0x0):Sprite{
var ball : Sprite = new Sprite();
ball.graphics.beginFill(color, 0.5);
ball.graphics.drawCircle(0,0, radius);
return ball;
}
private function clickHandler(event : MouseEvent):void{
makeShot();
}
private function makeShot():void{
var bullet : MovingObject = new MovingObject(createBall(5, 0xFF));
var vector : Point = new Point();
addChild(bullet);
_bullets.push(bullet);
// задаем начальные координаты пули
bullet.x = _ball.x;
bullet.y = _ball.y;
// получаем вектор движения пули
vector.x = stage.mouseX - _ball.x;
vector.y = stage.mouseY - _ball.y;
// нормализуем вектор
vector.normalize(1);
// задаем направление пули найденным вектором
bullet.direction = vector;
bullet.speed = 10;
}
private function keyDownHandler(event : KeyboardEvent):void{
_keys[event.keyCode] = true;
}
private function keyUpHandler(event : KeyboardEvent):void{
_keys[event.keyCode] = false;
}
private function enterFrameHandler(event : Event):void{
handleKeys();
refreshPositions();
}
private function refreshPositions():void{
refreshPosition(_ball);
for(var i : int = 0; i < _bullets.length; i++){
var bullet : MovingObject = _bullets[i];
refreshPosition(bullet, true);
}
}
private function refreshPosition(object : MovingObject, noReturn : Boolean = false):void{
object.x += object.direction.x * object.speed;
object.y += object.direction.y * object.speed;
if(noReturn){
return;
}
if(object.x < 0){
object.x = stage.stageWidth;
} else if(object.x > stage.stageWidth){
object.x = 0;
}
if(object.y < 0){
object.y = stage.stageHeight;
} else if(object.y > stage.stageHeight){
object.y = 0;
}
}
private function handleKeys():void{
_ball.direction = new Point(0,0);
for(var key : String in _keys){
if(!_keys[key]){
continue;
}
switch(parseInt(key)){
case Keyboard.DOWN:
_ball.direction.y += 1 ;
break;
case Keyboard.UP:
_ball.direction.y -= 1;
break;
case Keyboard.LEFT:
_ball.direction.x -= 1;
break;
case Keyboard.RIGHT:
_ball.direction.x += 1;
break;
}
}
}
}
}
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.geom.Point;
internal class MovingObject extends Sprite{
private var _direction : Point = new Point(0,0);
private var _view : DisplayObject;
private var _speed : Number;
public function MovingObject(view : DisplayObject = null){
setView(view);
}
public function setView(view : DisplayObject):void{
if(_view){
removeChild(_view);
}
_view = view;
if(_view){
addChild(_view);
}
}
public function set speed(speed : Number):void{
_speed = speed;
}
public function get speed():Number{
return _speed;
}
public function set direction(direction : Point):void{
_direction = direction;
}
public function get direction():Point{
return _direction;
}
}
писать в кадрах зло)
конечно лучше в классе
я все время пишу в классах, поэтому и спрашиваю в чем разница и ответ "писать в кадрах - зло" просто умиляет :)
Добавлено через 17 минут
package {
import flash.display.Sprite;
public class Ball extends Sprite {
public var mc_speedXFROM:Number = 0;
public var mc_speedYFROM:Number = 0;
public function Ball() {
}
}
}
такой способ хранения лучше чем хранить в массиве. меньше путаницы и проблем.
я понял о каком массиве идет речь, но спрашивал о другом - есть ли разница между размещением кода из твоего примера в отдельном классе и записью этого же кода в кадр.
пишу обобщенно, к словам не придираться имеется ввиду что код притерпевает некоторые изменения при перенесении в класс ("package{" и т.д.)
я все время пишу в классах, поэтому и спрашиваю в чем разница и ответ "писать в кадрах - зло" просто умиляет :)
Плюсы:
- нет строгости к import'у экземпляров предопределённых классов
- нет строгости к объявлению типов переменных
что есть хорошо когда эксперементируешь
Минусы:
- Код в кадрах компилируется в динамический класс MainTimeline, что есть плохо, не правильно, затрата ресурсов процессора
- Код в кадрах только для Flash IDE, разработчики с FB или FD не смогут его править.
- Не будет чёткой архитектуры проекта, более 2к строчек кода на одном кадре и разбираться будет сложновато
Вы такой ответ ожидали?
А вобще из сообщения выше
Ball["mc_speedXFROM"] = Math.cos(mc_angle);
Ball["mc_speedYFROM"] = Math.sin(mc_angle);
этого достаточно чтобы запихать переменные в Ball, ничего создавать или писать ещё не нужно.
Вы такой ответ ожидали?
да, все ясно, спасибо)
А вообще, автору неплохо было бы почитать какую-нибудь правильную литературу например "Колин Мук - Actionscript 3.0 для Flash"
и подобные темы как данный топик его уж точно не привели бы в ступор.
Gonsalez
20.03.2011, 13:53
+1,
спасибо.. проблема решилась
хранить speedXFROM и speedYFROM в шарике тоже была такая идея но не знал как правильно осуществить..
сейчас все получилось.. спасибо за помощь
А все же хранить отдельно скорость, а отдельно направление куда правильнее имхо.
А все же хранить отдельно скорость, а отдельно направление куда правильнее имхо.
все зависит от ситуации, но по большому счету согласен.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.