Форум 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=149583)

GrafMine 28.01.2011 01:26

игра с фильма "Трон",нужна помощь
 
Решил попробовать сделать игру с фильма "Трон".

Кто не смотрел или не понял о чем именно речь:
1.На поле игры существует постоянно движущий объект который оставляет за собой след.
2.Суть игры заключается в том чтоб не пересечь свой\чужой след ,также границы игры.

вот код программы что я написал:
Код AS3:

package {
    import flash.display.*;
    import flash.events.*;
    import flash.ui.Keyboard;
    public class Main extends Sprite {
 
 
        private const m:Number = 200;
        private const fv:Number = 0.1;
        private const dv:Number = fv / 0.1;
 
        private var dr:Number = 0;
        private var ft:Number = 0;
 
        private var game:Boolean;
        private var fl:Boolean = false;
        private var fr:Boolean = false;
        private var f:Shape;
 
        public function Main() {
 
            graphics.beginFill(0x0000ff, 0.1);
            graphics.drawRect(0, 0, 400,400);
            graphics.endFill();   
 
            f = new Shape();
            f.graphics.beginFill(0x805000);
            f.graphics.drawCircle(0, 0, 1.5);
            f.graphics.endFill();
            f.x = m;
            f.y = m;
            addChild(f);
 
            stage.addEventListener(Event.ACTIVATE, start);
        }
 
        private function start(e:Event):void {
            stage.removeEventListener(Event.ACTIVATE, start);
            graphics.lineStyle(1, 0x000000, 0.5);
            graphics.moveTo(f.x, f.y);//начальная точка
            stage.addEventListener(KeyboardEvent.KEY_DOWN, kd);
            stage.addEventListener(KeyboardEvent.KEY_UP, ku);
            stage.addEventListener(Event.ENTER_FRAME, tick);
        }
 
        private function kd(e:KeyboardEvent):void {
            switch (e.keyCode) {
            case Keyboard.LEFT:
            case 'A':
                fl = true;
                break;
            case Keyboard.RIGHT:
            case 'D':
                fr = true;
                break;
            }
        }
 
        private function ku(e:KeyboardEvent):void {
            switch (e.keyCode) {
            case Keyboard.LEFT:
            case 'A':
                fl = false;
                break;
            case Keyboard.RIGHT:
            case 'D':
                fr = false;
                break;
            }
        }
 
        private function tick(e:Event):void {
            player1();
            f.x = m - dr * ft ;
            f.y = m - dr ; //<-- что мне сюда добавить чтоб по y крутился ?
            dr += dv;
            graphics.lineTo(f.x, f.y);//"след"
            if (game = false) {
                stage.removeEventListener(Event.ENTER_FRAME, tick);
                stage.removeEventListener(KeyboardEvent.KEY_DOWN, kd);
                stage.removeEventListener(KeyboardEvent.KEY_UP, ku);
                fl = fr = false;
            }
        }
 
        private function player1():void {
            if (fl && !fr)//если влево
                ft += fv;
            else if (fr && !fl)//если вправо
                ft -= fv;
        }
    }
}

Нужна помощь\совет в:
1.Как по Y заставить крутится точку.
2.Как сделать проверку на "след" от точки.

samana 28.01.2011 16:03

Игру не видел и не играл.
1) Но что вы подразумеваете под "крутился по Y" ? Поворачивался? Если да, то есть свойство - rotation.
2) Если след будет таким тонким, то придётся наверное через векторы просчитывать. А если бы был, по толще, то можно и через hitTest, hitTestPoint попробовать.

GrafMine 04.02.2011 23:29

Переделал весь код:
Код AS3:

package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
 
    public class Main extends Sprite {
 
        private var player:Player;
        private var inputArray:Array;
        private var drawing_area:Bitmap;
        private var trail_image:Shape;
                private var game:Boolean;
                private var checkA:Bitmap;
 
        public function Main() {
            initInput();
            initGame()
        }       
        private function initInput() : void {           
            inputArray = new Array();
            for(var i:uint =0;i < 256; i++) {
                inputArray.push(false)
            }           
            stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
            stage.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);
            this.addEventListener(Event.ENTER_FRAME, updateGame);
        }       
        public function onKeyDown(e:KeyboardEvent) : void {
            inputArray[e.keyCode] = true;                         
        }
        public  function onKeyUp(e:KeyboardEvent) : void {
            inputArray[e.keyCode] = false;                         
        }       
        public  function updateGame(e:Event) : void {
 
            if(inputArray[37]) {
                  player.rotation -= 3;
            }
            if(inputArray[39]) {
                  player.rotation += 3;
            }     
 
                        if( game = true  ) {
                                player.move();
                player.speed = Math.abs(player.speed);
                                trail_image.x = player.x;
                trail_image.y = player.y;
                drawing_area.bitmapData.draw(trail_image, trail_image.transform.matrix);
                        }
                        if (checkHit() == true){
                                trace('Готово');
            }
                }
        private function initGame() : void {           
 
            player = new Player();
            player.speed = 2;
            drawing_area = new Bitmap(new BitmapData(400, 400, false));
                        checkA = new Bitmap();
            addChild(drawing_area);
 
            trail_image = new Shape();
            trail_image.graphics.beginFill(0x00FF00);
            trail_image.graphics.drawCircle(0, 0, 2);
            trail_image.graphics.endFill();
 
            player.x = 400/2;
            player.y = 400/2;
        }
                private function checkHit():Boolean {
                        var check:Boolean;
                        check = trail_image.hitTestPoint(player.x, player.y, true);
                if (check == true) {
                                        trace(check);
                    return true;
                }
                        return false;
                }
    }
}

На одну проблему меньше, но вторая так и осталась =)
Посмотрите на мой hitTestPoint в конце исходника, не могу понять почему не реагирует на "след"...

samana 05.02.2011 00:21

Не могу понять в вашем коде некоторые вещи, вы проверяете на столкновения ни след, а какой-то кружочек. Покажите класс Player, что бы можно было запустить всё это дело, и увидеть воочию.

И некоторые замечания и советы:
Код AS3:

if( game = true  ) {....

вы делаете присваивание, а не проверку на true/false

Код AS3:

if (check == true) {...

так можно не писать, то же самое будет и так
Код AS3:

if (check) {


GrafMine 05.02.2011 01:24

Цитата:

Сообщение от samana (Сообщение 970518)
Не могу понять в вашем коде некоторые вещи, вы проверяете на столкновения ни след, а какой-то кружочек. Покажите класс Player, что бы можно было запустить всё это дело, и увидеть воочию.

Этот кружек как бы и есть след ;)
А вот класс Player:
Код AS3:

package {
            import flash.display.*;
                public class Player extends Sprite {
                        public var vx:Number=0;       
                        public var vy:Number=0;       
                        public var speed:Number = 1;         
        public function Player() {}
                public function updateVelocities():void{
            vx = Math.sin(Math.PI -this.rotation*0.0174532925);
            vy = Math.cos(Math.PI -this.rotation*0.0174532925);
        }
        public function move():void{
            updateVelocities();
            x -= (vx*speed);
            y -= (vy*speed);
        }
    }
}

сделал этот класс т.к. проще сделать player.move();player.rotation -= 3;
в противном случае двигается вся сцена :rolleyes:,знаю что можно сделать легче ну пока что "как-то так" =)
За советы спасибо, действительно недоглядел...

samana 05.02.2011 02:05

Вы ведь отрисовываете битмапу, а проверяете столкновения со спрайтом. Тогда вам нужно либо рисовать путь с помощью graphics, либо проверять пиксел бимтапдаты, и если он не белого цвета, то столкновение произошло.

GrafMine 05.02.2011 13:40

Цитата:

Сообщение от samana (Сообщение 970540)
Вы ведь отрисовываете битмапу, а проверяете столкновения со спрайтом.

Да это один из минусов создания класса Player(
Цитата:

Сообщение от samana (Сообщение 970540)
Тогда вам нужно либо рисовать путь с помощью graphics,

Если вы имеете ввиду :
Код AS3:

graphics.lineStyle(1, 0x000000, 0.5);
graphics.moveTo(player.x, player.y);

то я так делал в прошлом примере,и просто не представляю как на это сделать проверку...
Цитата:

Сообщение от samana (Сообщение 970540)
либо проверять пиксел бимтапдаты, и если он не белого цвета, то столкновение произошло.

Покопался в справочнике Adobe и нечего не нашол с проверкой кроме :
Код AS3:

compare(otherBitmapData:BitmapData):Object
Сравнивает два объекта BitmapData.

Но по примерам я понял что он мне не подходит т.к. размер следа через битмап я вовсе не задаю...

P.S.Не когда раньше с графикой так не сталкивался,и решил попробовать, но что-то не как не выходит...

samana 05.02.2011 15:07

По поводу первого способа с помощью graphics. Я набросал быстрый пример. Тут игрок просто двигается к курсору мышки, рисует за собой путь, и если сталкивается со своим путем то игрок становится красным. Посмотрите, может это поможет вам.
Класс Main:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.filters.GlowFilter;
 
        /**
        * ...
        * @author Samana
        */

        public class Main extends Sprite
        {
                private var player:Player;
                private var path:Sprite;
 
                public function Main():void
                {
                        player = new Player();
                        addChild(player);
                        //.....................
                        path = new Sprite();
                        path.graphics.lineStyle(3, 0x008000);
                        path.graphics.moveTo(player.x, player.y);
                        addChild(path);
                        //.....................
                        stage.addEventListener(Event.ENTER_FRAME,enter_frame)
                }
 
                private function enter_frame(e:Event):void
                {
 
                        player.move(mouseX, mouseY);
 
                        if (path.hitTestPoint(player.x, player.y, true))
                        { player.filters = [new GlowFilter(0xFF0000,1,10,10,50,3)] }
                        else { player.filters = [] }
 
                        drawPath();
 
                }
 
                private function drawPath():void
                {
                        path.graphics.lineTo(player.x, player.y);
                }
 
        }
 
}

И класс Player:
Код AS3:

package  
{
        import flash.display.Sprite;
 
        /**
        * ...
        * @author Samana
        */

        public class Player extends Sprite
        {
 
                public function Player()
                {
                        drawPlayer()
                }
 
                private function drawPlayer():void
                {
                        graphics.beginFill(0xFF8000);
                        graphics.drawCircle(0, 0, 2);
                        graphics.endFill()
                }
 
                public function move(targetX:Number,targetY:Number):void
                {
                        var dx:Number = targetX - x;
                        var dy:Number = targetY - y;
                        var ang:Number = Math.atan2(dy, dx);
 
                        x += Math.cos(ang) * 3;
                        y += Math.sin(ang) * 3;
                }
 
        }
 
}


GrafMine 05.02.2011 18:41

Цитата:

Сообщение от samana (Сообщение 970616)
Тут игрок просто двигается к курсору мышки, рисует за собой путь, и если сталкивается со своим путем то игрок становится красным. Посмотрите, может это поможет вам.

Да огромное вам спасибо,на весы клацнул :yahoo:
P.S.Уже практически доделал игру на несколько игроков ;)

samana 05.02.2011 18:47

Цитата:

Сообщение от GrafMine (Сообщение 970682)
Уже практически доделал игру на несколько игроков ;)

Это отлично! Рад за вас!


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

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