Форум 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 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, время: 15:27.

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