Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   hitTest для игры, а также упрощенная версия моего кода (http://www.flasher.ru/forum/showthread.php?t=187752)

vitamin4er 23.11.2012 16:11

hitTest для игры, а также упрощенная версия моего кода
 
Здравствуйте! Вопрос будет довольно обширный и всесторонний...
Начну с кода. Оставляйте пожалуйста примечания (как можно было бы сделать лучше), если такие возникнут...А они возникнут!!!

Main.as
Код AS3:

package {
 
        import flash.display.*;
        import flash.events.*;
 
        public class Main extends MovieClip {
                        var player:Sprite;
                        var line:Sprite;
                        var lineArray:Array = new Array();
                                        var right:Boolean;
                                        var left:Boolean;
                                        var stay:Boolean;
                                        var speed:int = 5;
 
                function Main() {
                        createPlayer() //Создаем игрока
                        CONTROLER() //Управление для игрока
                }
 
                function createPlayer() {
                        player = new Sprite();
                                player.graphics.lineStyle(1,0xFF0000,1);
                                player.graphics.drawCircle(0,0,16);
                        player.x = 200;
                        player.y = 200;
                        addChild(player);
 
                                        var numRotation:int = 0;
                        for(var i = 0; i <= 7; i++) {
                                line = new Sprite();
                                        line.graphics.lineStyle(1,0x000000,1);
                                        line.graphics.lineTo(0,200);
                                line.x = player.x;
                                line.y = player.y;
                                addChild(line);
 
                                lineArray.unshift(line);
                                lineArray[0].rotation += numRotation;
                                numRotation += 45;
                        }
 
                        addEventListener(Event.ENTER_FRAME, linesListener);
                }
 
                function linesListener(e:Event) {
                        for(var j = 0; j < lineArray.length; j++) {
                                lineArray[j].x = player.x;
                                lineArray[j].y = player.y;
                        }
                }
 
                //УПРАВЛЕНИЕ------------------------
                function CONTROLER() {
                                stage.addEventListener(KeyboardEvent.KEY_DOWN,key_down);
                                stage.addEventListener(KeyboardEvent.KEY_UP,key_up);
                                stage.addEventListener(Event.ENTER_FRAME,updateMove);
                }
 
                function key_down(e:KeyboardEvent) {
                        if(e.keyCode == 39) {
                                right = true;
                        }
                        if(e.keyCode == 37) {
                                left = true; 
                        }
                        if(right && left) {
                                stay = true;
                        }
                }
                function key_up(e:KeyboardEvent) {
                        if(e.keyCode == 39) {
                                right = false;
                        }
                        if(e.keyCode == 37) {
                                left = false; 
                        }
                        if(right && left) {
                                stay = false;
                        }
                }
                function updateMove(e:Event) {
                        if(right) {
                                player.x += speed;
                        }
                        if(left) {
                                player.x -= speed;
                        }
                        if(stay) {
                                //СТОИМ
                        }
                }
        }
}

Линии(потом они будут невидимы, это как бы "зона видимости" в игре), я хочу сделать так, чтобы натыкаясь на "препятствия"(стены) линии бы уменьшались, уменьшая тем самым "зону видимости". Но так как я мало знаком с методом hitTest( ), реализовать это я не могу...Подскажите пожалуйста, как это сделать? Ранее я пытался сделать это с hitTestObject( ), но естественно диагональные линии сокращались (scaleY -), не касаясь препятствий... И еще...они сокращались как бы постепенно, то есть, если зайти за "стену", где линия будет соприкасаться центром, получался казус. Еще я думал убрать этот изъян с помощью циклов(но так и не взялся за это), то есть при соприкосновении со стеной в любой точки... запускается цикл, который уменьшает линию и выводит только итоговый результат, так как это цикл...Тогда как избежать бесконечного цикла?!

Спасибо за внимание...И заранее спасибо за любую помощь, а также громадные плюсы тем, кто поможет улучшить код и отписывать "примечания"...:)

AlexCooper 23.11.2012 16:52

Вам нужно рисовать не линии и поворачивать их, а векторы. Тогда вы указываете массив векторов препятствий, и через операции над векторами(возможно требуется дополнить класс) проверяете пересекаются ли вектора. После этого при получении информации об пересечении двух векторов уменьшаете длину скан-вектора.

Добавлено через 37 минут
По логике примерно так. Берете центр к примеру отсчёта координат 0х0, игрок у Вас находиться в позиции 20х0 и от него пошли вектора. Есть массив в виде векторов которые описывают края препятствий. Для проведения исчислений вам нужно нормализировать все вектора, потом перевести их в одну систему координат, после чего производить операции над ними. Было б немножко больше сегодня времени составил бы пример.

Добавлено через 42 минуты
полезно

Добавлено через 44 минуты
полезно

vitamin4er 24.11.2012 01:54

Спасибо огромное за обширный ответ, так как програмированнием я решил заняться самостоятельно и довольно недавно, то больше половины непонял...хотя общий смысл и реализацию вроде разобрал. Буду копаться в этом направлении. И еще отдельное спасибо за ссылки!


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

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