Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передвижение всех элементов массива по .x и .y координатам. (http://www.flasher.ru/forum/showthread.php?t=147500)

Lyso 06.12.2010 12:44

Передвижение всех элементов массива по .x и .y координатам.
 
Продолжаю улучшать урок, сейчас у меня проблема с передвижением всех шаров вверх и вниз.
Написал функцию:
Код AS3:

public function reportKeyUp() {
        for (var i=0; i<allBalls.length; i++) {
                var port = allBalls[i];
                port.y -=  10;
        }
}

Включил функцию и вроде должно всё работать, но мячи подлетают при нажатии кнопки мыши, а не "KeyUp". Что делать? И надо ли вообще использовать цикл для поднятия всех шаров?

iNils 06.12.2010 13:00

Цитата:

но мячи подлетают при нажатии кнопки мыши, а не "KeyUp".
А причем тут код выше? Значит подписались на клавиатуру, а не на мышь.
Цитата:

И надо ли вообще использовать цикл для поднятия всех шаров?
Если скорость у всех шаров одна, то можно поместить их в контейнер и поднимать его.

Lyso 06.12.2010 13:02

Каким образом, не доскажите? Скорость одна, а как засунуть все элементы массива в контейнер?

iNils 06.12.2010 13:05

Это зависит от того, как вы их создавали. Либо программно, либо на сцене Flash IDE.

Lyso 06.12.2010 13:12

Могу скинуть исходник:
http://*****************/files/6otbhyx0m

iNils 06.12.2010 13:20

1. Файлы надо выкладывать на форум, а не туда где постоянно пишут "ВНИМАНИЕ! Вы исчерпали лимит подключений! Попробуйте повторить через XX минут(ы). "
2. У меня CS3, поэтому, если у вас fla версии выше, то придется ждать кого-нибудь другого.

Lyso 06.12.2010 13:26

А как кинуть на форум? Вот код двух файлов:
1 (balls.fla)
Код AS3:

import flash.display.Sprite; 
import flash.text.*;
 
stage.addEventListener(MouseEvent.CLICK,addBall);
 
function addBall(e:MouseEvent):void{
        var ball:Ball=new Ball();
        addChild(ball);
        ball.x=mouseX;
        ball.y=mouseY;
    myText.text= Ball.allBalls.length.toString(); //Вывод длины массива в текст.
}

2 (Ball.as)
Код AS3:

package 
{
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.text.*;
        import flash.events.MouseEvent;
        import flash.geom.ColorTransform;
        import flash.events.MouseEvent;
        import flash.ui.Keyboard;
        import flash.events.KeyboardEvent;
 
        public class Ball extends MovieClip
        {
                public static var allBalls:Array = [];
                var xspeed:Number = -10 + Math.random() * 20;
                var yspeed:Number = -5;
                var grav:Number = 1;
                var radius:Number;
                public var up:Boolean = false;
                public var down:Boolean = false;
                public var left:Boolean = false;
                public var right:Boolean = false;
 
                public function Ball()
                {
                        var colorTransform:ColorTransform = new ColorTransform();
                        colorTransform.alphaMultiplier = 1;
                        colorTransform.redOffset = Math.random() * 4 + 7;
                        colorTransform.greenMultiplier = Math.random() * 3;
                        transform.colorTransform = colorTransform;
                        scaleX = scaleY = Math.random() * 0.5 + 0.5;
                        radius = width / 2;
                        allBalls.push(this);
                        addEventListener(Event.ENTER_FRAME,onFrame);//Слушатель событый, в каждый кадр.
                }
 
                }
                public function onFrame(e:Event):void
                {
                        yspeed +=  grav;
                        xspeed * +0.9;
                        y +=  yspeed;
                        x +=  xspeed;
                        rotation = x * 2;
 
                        hitBall();
                        hitStage();
                }
 
                public function hitBall():void
                {
                        for (var i=0; i<allBalls.length; i++)
                        {
                                var curBall = allBalls[i];
                                var minDist = curBall.radius + radius;
                                var dist = distance(curBall);
                                if (curBall != this && dist < minDist)
                                {
                                        var collisionDist=(dist-minDist)/2;
                                        var dx=(curBall.x-x)/dist*collisionDist;
                                        var dy=(curBall.y-y)/dist*collisionDist;
 
                                        x +=  dx;
                                        xspeed +=  dx;
                                        y +=  dy;
                                        yspeed +=  dy;
 
                                        curBall.x -=  dx;
                                        curBall.xspeed -=  dx;
                                        curBall.y -=  dy;
                                        curBall.yspeed -=  dy;
                                }
                        }
                }
 
                public function distance(obj:Ball):Number
                {
                        var dx = obj.x - x;
                        var dy = obj.y - y;
                        return Math.sqrt(dx*dx+dy*dy);
                }
 
                public function hitStage():void
                {
                        if (x > 300 - radius)
                        {
                                x = 300 - radius;
                                xspeed = 0;
                        }
                        if (x < radius)
                        {
                                x = radius;
                                xspeed = 0;
                        }
                        if (y > 300 - radius)
                        {
                                y = 300 - radius;
                                yspeed =  -  yspeed * 0.2;
                                xspeed = 0;
                        }
                }
        }
}

Как сделать чтобы весь массив при нажатии на стрелки поднимался или двигался по сторонам? То есть координаты .y и .x...

medvedya2 06.12.2010 13:46

прочитайте:
http://help.adobe.com/ru_RU/ActionSc...0204-7e54.html

http://help.adobe.com/ru_RU/AS3LCR/F...ventListener()

http://help.adobe.com/ru_RU/AS3LCR/F...oardEvent.html

Lyso 06.12.2010 15:12

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

medvedya2 06.12.2010 15:22

Вы хотите сделать что шары на кнопку клавиатуры вниз спускались, а на кнопку верх поднимались?

Lyso 06.12.2010 15:23

Да, а так же влево и вправо. Именно все шары из массива.

medvedya2 06.12.2010 15:34

Код AS3:

stage.addEventListener(KeyboardEvent.KEY_DOWN,onKey);
function onKey(e:KeyboardEvent):void
                {
                        trace(e.keyCode);
                        var dy:int=0;
                        var dx:int=0;
                        var speed:int=10;
                        //здесь можно case сделать, но боюсь не поймете.
                                  if(e.keyCode=37)dx-=speed;
                        if(e.keyCode=38)dy-=speed;
                        if(e.keyCode=39)dx+=speed;
                        if(e.keyCode=40)dy+=speed;
 
                                for (var i=0; i<Ball.allBalls.length; i++) {
                                var port:Ball = Ball.allBalls[i];//по возможности указывайте тип
                                port.x +=  dx;
                                port.y +=  dy;
                        }
 
                }

подправил

Lyso 06.12.2010 15:51

Спасибо большое! case я отлично знаю :) Я хоть и нуб, но Мука читал ))

Добавлено через 2 минуты
Вылезло 4 ошибки:
строка 39 Warning: 1100: Присвоение внутри условного выражения. Вы имели в виду ==, а не =?

Все 4 такие же... Что делать?

medvedya2 06.12.2010 15:58

Код AS3:

       if(e.keyCode==37)dx-=speed;
      if(e.keyCode==38)dy-=speed;
      if(e.keyCode==39)dx+=speed;
      if(e.keyCode==40)dy+=speed;

30 мин назад на другом языке писал, перепутал синтаксис :)

Lyso 06.12.2010 16:01

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Ball()
at balls_fla::MainTimeline/addBall()

Час от часу не легче... Я раньше понимал в чём ошибка, но не знал как исправить. А сейчас я просто в тупике...

medvedya2 06.12.2010 16:05

Код AS3:

import flash.display.Sprite; 
import flash.text.*;
import flash.events.KeyboardEvent;
 
stage.addEventListener(MouseEvent.CLICK,addBall);
 
function addBall(e:MouseEvent):void{
        var ball:Ball=new Ball();
        addChild(ball);
        ball.x=mouseX;
        ball.y=mouseY;
    myText.text= Ball.allBalls.length.toString(); //Вывод длины массива в текст.
}
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKey);
function onKey(e:KeyboardEvent):void
                {
                        trace(e.keyCode);
                        var dy:int=0;
                        var dx:int=0;
                        var speed:int=10;
                        //здесь можно case сделать, но боюсь не поймете.
                                  if(e.keyCode==37)dx-=speed;
                                  if(e.keyCode==38)dy-=speed;
                                  if(e.keyCode==39)dx+=speed;
                                  if(e.keyCode==40)dy+=speed;
 
                                for (var i=0; i<Ball.allBalls.length; i++) {
                                var port:Ball = Ball.allBalls[i];//по возможности указывайте тип
                                port.x +=  dx;
                                port.y +=  dy;
                        }
 
                }

у вас так?

Lyso 06.12.2010 16:10

Теперь всё нормально, остался всего один небольшой нюанс :) Как сделать чтобы при задержании клавиш, функция выполнялась многократно, то есть если держать вверх, то лететь будет вверх пока не отпустишь...
Извините, я наглею, но очень хочу узнать!

medvedya2 06.12.2010 16:18

подсказки :)
Код AS3:

1.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);
2.addEventListener(Event.ENTER_FRAME,onFrame);
3.dx и dy в глобальные переменые.


Lyso 06.12.2010 16:22

В смысле этот код засунуть в Ball.as? Я не понял подсказки :)

medvedya2 06.12.2010 16:23

Цитата:

Сообщение от Lyso (Сообщение 955349)
но очень хочу узнать!

тут не надо узнавать, тут надо придумывать алгоритм, и понимать принципы языка

Lyso 06.12.2010 16:25

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

Добавлено через 17 минут
Ау..?

medvedya2 06.12.2010 16:54

Там надо коварять класс Ball, я не буду в его логике разбираться.

Lyso 06.12.2010 16:56

Ладно, подожду кого-нибудь ещё... Просто это последние что я хотел добавить в дополнение к уроку. И тут проблема, которую уже не решить.

medvedya2 06.12.2010 17:10

Вот, это должно работать, но это не лучший вариант
Код AS3:

import flash.display.Sprite;
import flash.text.*;
import flash.events.KeyboardEvent;
import flash.events.Event;
 
var speed:int = 20;
var dy:int = 0;
var dx:int = 0;
stage.addEventListener(MouseEvent.CLICK,addBall);
function addBall(e:MouseEvent):void
{
        var ball:Ball=new Ball();
        addChild(ball);
        ball.x = mouseX;
        ball.y = mouseY;
        myText.text = Ball.allBalls.length.toString();//Вывод длины массива в текст.
}
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown);
function keyDown(e:KeyboardEvent):void
{
        trace(e.keyCode);
 
 
        if (e.keyCode == 37)
        {
                dx =  (-1)* speed;
        }
        if (e.keyCode == 38)
        {
                dy =  (-1)*  speed;
        }
        if (e.keyCode == 39)
        {
                dx =    speed;
        }
        if (e.keyCode == 40)
        {
                dy =    speed;
        }
 
 
 
}
stage.addEventListener(KeyboardEvent.KEY_UP,keyUp);
function keyUp(e:KeyboardEvent):void
{
        if (e.keyCode == 37)
        {
                dx = 0;
        }
        if (e.keyCode == 38)
        {
                dy = 0;
        }
        if (e.keyCode == 39)
        {
                dx = 0;
        }
        if (e.keyCode == 40)
        {
                dy = 0;
        }
 
 
}
this.addEventListener(Event.ENTER_FRAME,onFrame);
function onFrame(e:Event):void
{
 
        for (var i=0; i<Ball.allBalls.length; i++)
        {
                var port:Ball = Ball.allBalls[i];
                port.x +=  dx;
                if(dy!=0)
                port.y +=  dy-port.yspeed;
        }
}

Код AS3:

package{
        import flash.display.MovieClip;
        import flash.events.Event;
        public class Ball extends MovieClip{
                public static var allBalls:Array=[];
                var xspeed:Number=-10+Math.random()*20;
                public var yspeed:Number=-5;
                var grav:Number=1;
                var radius:Number;
                public function Ball(){
                        scaleX=scaleY=Math.random()*0.5+0.5;
                        radius=width/2
                        allBalls.push(this);
                        addEventListener(Event.ENTER_FRAME,onFrame);
                        trace(allBalls.length)
                }
 
                public function onFrame(e:Event):void{
                        yspeed+=grav;
                        xspeed*=0.9;
 
                        y+=yspeed;
                        x+=xspeed;
 
                        hitSelf()
                        hitStage()
 
                }
 
                public function hitSelf():void{
                        for(var i=0;i<allBalls.length;i++){
                                var currentBall=allBalls[i];
                                if(currentBall!=this){
                                        var dx=currentBall.x-x;
                                        var dy=currentBall.y-y;
                                        var dis=Math.sqrt(dx*dx+dy*dy);
 
                                        var needDist=radius+currentBall.radius;
                                        if(dis<needDist){
                                                var ang1=Math.atan2(currentBall.y-y,currentBall.x-x)
                                                var ang2=Math.atan2(y-currentBall.y,x-currentBall.x)
 
                                                x += Math.cos(ang1) * ((dis-needDist)/2)
                                                y += Math.sin(ang1) * ((dis-needDist)/2)
 
                                                xspeed += Math.cos(ang1) * ((dis-needDist)/2)
                                                yspeed += Math.sin(ang1) * ((dis-needDist)/2)
 
                                                currentBall.x += Math.cos(ang2) * ((dis-needDist)/2)
                                                currentBall.y += Math.sin(ang2) * ((dis-needDist)/2)
 
                                                currentBall.xspeed += Math.cos(ang2) * ((dis-needDist)/2)
                                                currentBall.yspeed += Math.sin(ang2) * ((dis-needDist)/2)
 
                                        }
                                }
                        }
                }
 
 
 
                public function hitStage():void{
                        if(x>300-radius){
                                x=300-radius
                                xspeed=0;
                        }
                        if(x<radius){
                                x=radius
                                xspeed=0;
                        }
                        if(y>300-radius){
                                y=300-radius;
                                yspeed=-yspeed*0.2
                        }
                }
        }
}


Lyso 06.12.2010 17:34

Всё работает, большое спасибо! Я понял, что надо сделать доступ к переменной "public" и добавить
Код AS3:

this.addEventListener(Event.ENTER_FRAME,onFrame);
function onFrame(e:Event):void
{
 
        for (var i=0; i<Ball.allBalls.length; i++)
        {
                var port:Ball = Ball.allBalls[i];
                port.x +=  dx;
                if(dy!=0)
                port.y +=  dy-port.yspeed;
        }
}

Который будет выполнять постоянное поднятие шаров!

Спасибо!


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

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