Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.01.2011, 01:26
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 1  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Cool игра с фильма "Трон",нужна помощь

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

Кто не смотрел или не понял о чем именно речь:
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.Как сделать проверку на "след" от точки.

Старый 28.01.2011, 16:03
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 2  
Ответить с цитированием
samana
 
Аватар для samana

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

Старый 04.02.2011, 23:29
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 3  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Переделал весь код:
Код 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 в конце исходника, не могу понять почему не реагирует на "след"...

Старый 05.02.2011, 00:21
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 4  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Не могу понять в вашем коде некоторые вещи, вы проверяете на столкновения ни след, а какой-то кружочек. Покажите класс Player, что бы можно было запустить всё это дело, и увидеть воочию.

И некоторые замечания и советы:
Код AS3:
if( game = true  ) {....
вы делаете присваивание, а не проверку на true/false

Код AS3:
if (check == true) {...
так можно не писать, то же самое будет и так
Код AS3:
if (check) {


Последний раз редактировалось samana; 05.02.2011 в 00:28.
Старый 05.02.2011, 01:24
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 5  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Цитата:
Сообщение от samana Посмотреть сообщение
Не могу понять в вашем коде некоторые вещи, вы проверяете на столкновения ни след, а какой-то кружочек. Покажите класс 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;
в противном случае двигается вся сцена ,знаю что можно сделать легче ну пока что "как-то так" =)
За советы спасибо, действительно недоглядел...

Старый 05.02.2011, 02:05
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 6  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Вы ведь отрисовываете битмапу, а проверяете столкновения со спрайтом. Тогда вам нужно либо рисовать путь с помощью graphics, либо проверять пиксел бимтапдаты, и если он не белого цвета, то столкновение произошло.

Старый 05.02.2011, 13:40
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 7  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Цитата:
Сообщение от samana Посмотреть сообщение
Вы ведь отрисовываете битмапу, а проверяете столкновения со спрайтом.
Да это один из минусов создания класса Player(
Цитата:
Сообщение от samana Посмотреть сообщение
Тогда вам нужно либо рисовать путь с помощью graphics,
Если вы имеете ввиду :
Код AS3:
graphics.lineStyle(1, 0x000000, 0.5);
graphics.moveTo(player.x, player.y);
то я так делал в прошлом примере,и просто не представляю как на это сделать проверку...
Цитата:
Сообщение от samana Посмотреть сообщение
либо проверять пиксел бимтапдаты, и если он не белого цвета, то столкновение произошло.
Покопался в справочнике Adobe и нечего не нашол с проверкой кроме :
Код AS3:
compare(otherBitmapData:BitmapData):Object
Сравнивает два объекта BitmapData.
Но по примерам я понял что он мне не подходит т.к. размер следа через битмап я вовсе не задаю...

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

Старый 05.02.2011, 15:07
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 8  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
По поводу первого способа с помощью 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;
		}
 
	}
 
}

Старый 05.02.2011, 18:41
GrafMine вне форума Посмотреть профиль Отправить личное сообщение для GrafMine Найти все сообщения от GrafMine
  № 9  
Ответить с цитированием
GrafMine
 
Аватар для GrafMine

Регистрация: Jan 2011
Сообщений: 247
Цитата:
Сообщение от samana Посмотреть сообщение
Тут игрок просто двигается к курсору мышки, рисует за собой путь, и если сталкивается со своим путем то игрок становится красным. Посмотрите, может это поможет вам.
Да огромное вам спасибо,на весы клацнул
P.S.Уже практически доделал игру на несколько игроков

Старый 05.02.2011, 18:47
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 10  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
Сообщение от GrafMine Посмотреть сообщение
Уже практически доделал игру на несколько игроков
Это отлично! Рад за вас!

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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