Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   направление шарика в сторону курсора мыши (http://www.flasher.ru/forum/showthread.php?t=152263)

Gonsalez 14.03.2011 21:11

направление шарика в сторону курсора мыши
 
есть шарик с именем mc который можно двигать с помощью клавиатуры.. при нажатии клавиши А либо левой кнопки мыши этот шарик стреляет другим шариком но лишь в одном направлении..

вот код:
Код AS3:

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 минут
нашел такой код
Код AS3:

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

работает но шарик летит в сторону курсора но если сдвинуть курсор шарик меняет направление и продолжает лететь к курсору и останавливается рядом с ним, а нужно чтобы летел в прямом направлении в ту сторону где находился курсор при выстреле не меняя направления.. помогите разобраться

nuToH 15.03.2011 01:11

расчитывай "найденный" код по ивенту MOUSE_DOWN
чтот вроде:
Код AS3:

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

сделал по этому методу шарики при выстреле не прилипают к курсору но все равно продолжают менять направление в сторону где находился курсор при повторном выстреле
Код AS3:

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

проблема так и не решена((

пробовал сделать еще таким методом
Код AS3:

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("Шарик удален");
                }
        }
}

но проблема все та же остается(( помогите разобраться что не правильно

cr0w312 19.03.2011 22:39

ты при каждом нажатии на кнопку мышки переопределяешь направление для всех шариков
Код AS3:

     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 правильно понимаю?

cr0w312 19.03.2011 23:47

там вообще цикл не нужен

Код AS3:

                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

Вложений: 1
я новичок во флеше поэтому делаю тем методом который более менее понятен..
кому не сложно посмотрите пожалуйста исходный файл помогите исправить уже неделю мучаюсь с этим шаром((

cr0w312 20.03.2011 12:42

Вложений: 1
у меня твой файл не открывается, наверно CS5.
я без классов писать не умею.

kseniya 20.03.2011 12:54

Попробуйте так:
Код AS3:

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 в шарике
и затем брать их из шарика в цикле
Код AS3:

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("Шарик удален");
                }
        }
}


cr0w312 20.03.2011 13:02

2kseniya, а есть разница между кодом в кадре и кодом в классе? Ну всмысле в чем плюсы, минусы?

kseniya 20.03.2011 13:07

писать в кадрах зло)
конечно лучше в классе, например:
Код AS3:

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() {
                }
        }
 
}

такой способ хранения лучше чем хранить в массиве. меньше путаницы и проблем.

ChuwY 20.03.2011 13:11

Вложений: 1
Не смог открыть твой пример.
Написал свой.

Код AS3:

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


cr0w312 20.03.2011 13:13

Цитата:

Сообщение от kseniya (Сообщение 982040)
писать в кадрах зло)
конечно лучше в классе

я все время пишу в классах, поэтому и спрашиваю в чем разница и ответ "писать в кадрах - зло" просто умиляет :)

Добавлено через 17 минут
Цитата:

Сообщение от kseniya (Сообщение 982040)
Код AS3:

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{" и т.д.)

kseniya 20.03.2011 13:34

Цитата:

Сообщение от cr0w312 (Сообщение 982043)
я все время пишу в классах, поэтому и спрашиваю в чем разница и ответ "писать в кадрах - зло" просто умиляет :)

Плюсы:
- нет строгости к import'у экземпляров предопределённых классов
- нет строгости к объявлению типов переменных
что есть хорошо когда эксперементируешь
Минусы:
- Код в кадрах компилируется в динамический класс MainTimeline, что есть плохо, не правильно, затрата ресурсов процессора
- Код в кадрах только для Flash IDE, разработчики с FB или FD не смогут его править.
- Не будет чёткой архитектуры проекта, более 2к строчек кода на одном кадре и разбираться будет сложновато

Вы такой ответ ожидали?
А вобще из сообщения выше
Код AS3:

        Ball["mc_speedXFROM"] = Math.cos(mc_angle);
        Ball["mc_speedYFROM"] = Math.sin(mc_angle);

этого достаточно чтобы запихать переменные в Ball, ничего создавать или писать ещё не нужно.

cr0w312 20.03.2011 13:42

Цитата:

Сообщение от kseniya (Сообщение 982047)
Вы такой ответ ожидали?

да, все ясно, спасибо)
А вообще, автору неплохо было бы почитать какую-нибудь правильную литературу например "Колин Мук - Actionscript 3.0 для Flash"
и подобные темы как данный топик его уж точно не привели бы в ступор.

Gonsalez 20.03.2011 13:53

+1,
спасибо.. проблема решилась
хранить speedXFROM и speedYFROM в шарике тоже была такая идея но не знал как правильно осуществить..
сейчас все получилось.. спасибо за помощь

ChuwY 20.03.2011 18:47

А все же хранить отдельно скорость, а отдельно направление куда правильнее имхо.

cr0w312 20.03.2011 19:29

Цитата:

Сообщение от ChuwY (Сообщение 982176)
А все же хранить отдельно скорость, а отдельно направление куда правильнее имхо.

все зависит от ситуации, но по большому счету согласен.


Часовой пояс GMT +4, время: 18:32.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.