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

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

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

Регистрация: Nov 2010
Сообщений: 12
Question Персонаж некорректно передвигается.

Вообщем как обычно, после долгих часов раздумий, обращаюсь за помощью.
Весь код перерыл, но так и не дошло до меня в чем же проблема.
Короче, персонаж двигается согласно заданным параметрам,но после возвращается в прежнее положение.
Код AS3:
package
{
 
	import flash.display.*;
    import flash.events.*;
    import flash.ui.*;
    import flash.utils.*;
 
	public class ScotlandCheer extends MovieClip
	{
		public var ground:Ground;
		public var army:Array;
		public var alien:Alien;
		public var gameTimer:Timer;
		public var archibald:Archibald;
		public var grounded:Boolean;
		public var downKeyIsBeingPressed:Boolean;
		public var upKeyIsBeingPressed:Boolean;
		public var leftKeyIsBeingPressed:Boolean;
		public var rightKeyIsBeingPressed:Boolean;
 
 
 
		public function ScotlandCheer()
		{
			leftKeyIsBeingPressed = false;
			rightKeyIsBeingPressed = false;
			downKeyIsBeingPressed = false;
			upKeyIsBeingPressed = false;
 
 
 
			ground = new Ground();
			addChild(ground);
 
			army = new Array();
			var newAlien = new Alien (200,50);
			army.push (newAlien);
			addChild(newAlien);
 
 
 
			archibald = new Archibald();
			addChild(archibald);
			archibald.x = mouseX;
			archibald.y = mouseY;
 
 
			gameTimer = new Timer(25);
			gameTimer.addEventListener (TimerEvent.TIMER,onTick);
			gameTimer.start();
			grounded = true;
			addEventListener( Event.ADDED_TO_STAGE, onAddToStage );
			return;
 
 
 
 
 
 
 
		}
 
 
 
 
 
 
		public function onTick(timerEvent:TimerEvent):void
		{
 
			if (Math.random() <0.01)
			{
			var randomX:Number = Math.random()* 550;
			var newAlien = new Alien (randomX,50);
			army.push (newAlien);
			addChild(newAlien);
			}
			archibald.x = 400;
			archibald.y = 500;
 
			for each( var alien:Alien in army)
 
			if (grounded) alien.MoveABit();
 
			if(alien.hitTestObject(ground))
			{
				alien.MoveABit();
				grounded = false;
 
			}
			if (leftKeyIsBeingPressed)
			{
				archibald.moveABit(-3,0);
			}
 
			// ГраницаЭкрана
 
			if (archibald.x <(archibald.width / 2))
			{
				archibald.x = archibald.width / 2;
			}
			else if (archibald.x > 800 - (archibald.width / 2))
					 {
						 archibald.x = 800 - (archibald.width / 2)
					 }
 
 
		}//Конец функции
 
		public function onKeyPress(event:KeyboardEvent):void
		{
			if (event.keyCode == Keyboard.LEFT)
			{
				leftKeyIsBeingPressed = true;
			}
			else if (event.keyCode == Keyboard.RIGHT)
			{
				rightKeyIsBeingPressed = true;
			}
			else if (event.keyCode == Keyboard.DOWN)
			{
				downKeyIsBeingPressed = true;
			}
			else if (event.keyCode == Keyboard.UP)
			{
				upKeyIsBeingPressed = true;
			}
			return;
		}
		public function onAddToStage( event:Event ):void
{
	stage.addEventListener( KeyboardEvent.KEY_DOWN, onKeyPress );
	stage.addEventListener( KeyboardEvent.KEY_UP, onKeyRelease );
	return;
}
 
			public function onKeyRelease(event:KeyboardEvent):void
		{
			if (event.keyCode == Keyboard.LEFT)
			{
				leftKeyIsBeingPressed = false;
			}
			else if (event.keyCode == Keyboard.RIGHT)
			{
				rightKeyIsBeingPressed = false;
			}
			else if (event.keyCode == Keyboard.DOWN)
			{
				downKeyIsBeingPressed = false;
			}
			else if (event.keyCode == Keyboard.UP)
			{
				upKeyIsBeingPressed = false;
			}
			return;
		}
 
 
 
 
	}
 
 
}
Вообщем-то вот. Ума не приложу, в чем же тут проблема?

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
У вас в функции onTick, которая вызывается каждые 25 миллисекунд, ясно сказано:
Код AS3:
archibald.x = 400;
archibald.y = 500;
Если вы хотели, чтобы Арчибальд возвращался в исходное положение только 1% случаев, вам нужно поставить эти две строки в соответствующий блок кода.
Код AS3:
if (Math.random() <0.01)
{
    archibald.x = 400;
    archibald.y = 500;
    ...
}
Добавлено через 4 минуты
Еще нужно определить фигурными скобками границы цикла:
Код AS3:
for each( var alien:Alien in army)
{
    ...
}


Последний раз редактировалось bav; 25.11.2010 в 23:01.
Старый 25.11.2010, 23:05
al0ne вне форума Посмотреть профиль Отправить личное сообщение для al0ne Найти все сообщения от al0ne
  № 3  
Ответить с цитированием
al0ne

Регистрация: Nov 2010
Сообщений: 12
Хм.Что-то после предыдущих действий с падающими объектами арчи вообще уже не ходит=)
Мне нужно сделать так, чтобы он вообще не возвращался в исходное положение.

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Бедный Арчи...
Попробуйте перенести логику движения Арчибальда в его собственный класс, чтобы он не путался с кем попало в одной функции.

Старый 25.11.2010, 23:16
al0ne вне форума Посмотреть профиль Отправить личное сообщение для al0ne Найти все сообщения от al0ne
  № 5  
Ответить с цитированием
al0ne

Регистрация: Nov 2010
Сообщений: 12
Дык логика движений внутри класса персонажа.

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Написал следующее:
Класс Main:
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	import flash.ui.Keyboard;
 
	public class Main extends Sprite 
	{
		public var ground:Ground;
		public var army:Array;
		public var alien:Alien;
		public var gameTimer:Timer;
		public var archibald:Archibald;
		public var downKeyIsBeingPressed:Boolean;
		public var upKeyIsBeingPressed:Boolean;
		public var leftKeyIsBeingPressed:Boolean;
		public var rightKeyIsBeingPressed:Boolean;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		private function init(event:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			leftKeyIsBeingPressed = false;
			rightKeyIsBeingPressed = false;
			downKeyIsBeingPressed = false;
			upKeyIsBeingPressed = false;
 
			ground = new Ground(stage.stageWidth, 100);
			ground.y = stage.stageHeight - ground.height;
			addChild(ground);
 
			army = new Array();
			var newAlien:Alien = new Alien(200, 50);
			army.push(newAlien);
			addChild(newAlien);
 
			archibald = new Archibald();
			addChild(archibald);
			archibald.x = mouseX;
			archibald.y = mouseY;
 
			gameTimer = new Timer(25);
			gameTimer.addEventListener(TimerEvent.TIMER, onTick);
			gameTimer.start();
 
			stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress);
			stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
		}
 
		public function onTick(timerEvent:TimerEvent):void
		{
			if (Math.random() < 0.01)
			{
				var randomX:Number = Math.random() * stage.stageWidth;
				var newAlien:Alien = new Alien (randomX, 50);
				army.push(newAlien);
				addChild(newAlien);
			}
 
			for each(var alien:Alien in army)
			{
				if (alien.grounded && alien.hitTestObject(ground)) alien.grounded = false;
				alien.grounded ? alien.moveABit(0,3) : alien.moveABit(3,0);
			}
			if (leftKeyIsBeingPressed)
			{
				archibald.moveABit(-3,0);
			}
 
			if (archibald.x < (archibald.width / 2))
			{
				archibald.x = archibald.width / 2;
			}
			else if (archibald.x > (stage.stageWidth - (archibald.width / 2)))
			{
				archibald.x = stage.stageWidth - (archibald.width / 2);
			}
		}
 
		public function onKeyPress(event:KeyboardEvent):void
		{
			if (event.keyCode == Keyboard.LEFT)
			{
				leftKeyIsBeingPressed = true;
			}
			else if (event.keyCode == Keyboard.RIGHT)
			{
				rightKeyIsBeingPressed = true;
			}
			else if (event.keyCode == Keyboard.DOWN)
			{
				downKeyIsBeingPressed = true;
			}
			else if (event.keyCode == Keyboard.UP)
			{
				upKeyIsBeingPressed = true;
			}
			return;
		}
 
		public function onKeyRelease(event:KeyboardEvent):void
		{
			if (event.keyCode == Keyboard.LEFT)
			{
				leftKeyIsBeingPressed = false;
			}
			else if (event.keyCode == Keyboard.RIGHT)
			{
				rightKeyIsBeingPressed = false;
			}
			else if (event.keyCode == Keyboard.DOWN)
			{
				downKeyIsBeingPressed = false;
			}
			else if (event.keyCode == Keyboard.UP)
			{
				upKeyIsBeingPressed = false;
			}
		}
	}
}
Класс Archibald:
Код AS3:
package  
{
	import flash.display.Sprite;
 
	public class Archibald extends Sprite
	{
		public function Archibald() 
		{
			graphics.lineStyle(1, 0x000000);
			graphics.beginFill(0xFF0000);
			graphics.drawCircle(0, 0, 25);
			graphics.endFill();
		}
 
		public function moveABit(_x:int, _y:int):void
		{
			x += _x;
			y += _y;
		}
	}
}
Класс Alien:
Код AS3:
package  
{
	import flash.display.Sprite;
 
	public class Alien extends Sprite
	{
		public var grounded:Boolean = true;
		public function Alien(_x:int, _y:int) 
		{
			graphics.lineStyle(1, 0x000000);
			graphics.beginFill(0x00FF00);
			graphics.drawCircle(0, 0, 25);
			graphics.endFill();
			x = _x;
			y = _y;
		}
 
		public function moveABit(_x:int, _y:int):void
		{
			x += _x;
			y += _y;
		}
	}
}
Класс Ground:
Код AS3:
package  
{
	import flash.display.Sprite;
	public class Ground extends Sprite
	{
		public function Ground(w:int, h:int) 
		{
			graphics.lineStyle(1, 0x000000);
			graphics.beginFill(0x666666);
			graphics.drawRect(0, 0, w, h);
			graphics.endFill();
		}
	}
}
Арчибальд бодро реагирует на клавишу LEFT. Видимо у вас была ошибка в строчке
Код AS3:
else if (archibald.x > 800 - (archibald.width / 2))
надо, видимо, так:
Код AS3:
else if (archibald.x > (800 - (archibald.width / 2)))
Добавлено через 1 минуту
Еще в сточке
Код AS3:
var newAlien = new Alien (randomX,50);
у переменной newAlien не объявлен тип (var newAlien:Alien = new Alien (randomX,50))

Добавлено через 14 минут
Хотя, нет. Строчка с else if (...) если и была ошибочной, то на перемещение Арчи в данной реализации никак не влияет, потому что он пока может ходить только влево.


Последний раз редактировалось bav; 25.11.2010 в 23:58.
Старый 26.11.2010, 00:43
al0ne вне форума Посмотреть профиль Отправить личное сообщение для al0ne Найти все сообщения от al0ne
  № 7  
Ответить с цитированием
al0ne

Регистрация: Nov 2010
Сообщений: 12
Мде. Впринципе все работало, просто после GameTimer.start стоял флаг. Вот изза него ничего и не работало.
Мне вот что не понятно:
Код AS3:
public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		private function init(event:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
Зачем это?И как это работает?

Добавлено через 17 минут
Вот еще вопрос. Скажем, в mc с Арчи есть анимация(прыгает приседает бегает и тд.)
Как к ней обращаться?В самом mc то знаю как проигрывать и останавливать анимацию, а вот в .as файле - нет.
Как обратиться к фрейму посредством нажатия клавиши?

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Это проверка на случай, если нашу флешку будут добавлять в другую флешку. И если мы сразу собираемся обращаться к stage, например вешать на него каких-нибудь слушателей.
Код AS3:
public function Main():void 
{
    // Смотрим, добавлены ли мы на stage
    // (в данном случае stage – то же что this.stage,
    // то есть ссылка на [Object Stage])
    if (stage) init();
    // если нет, ждем пока нас добавят.
    else addEventListener(Event.ADDED_TO_STAGE, init);
}
// Здесь, параметр event должен иметь значение по-умолчанию,
// чтобы мы могли вызвать функцию init() без генерации события.
// Или можно отказаться от использования значения по-умолчанию
// и вызывать init(null);
private function init(event:Event = null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, init);
    ...
}


Последний раз редактировалось bav; 26.11.2010 в 01:06.
Создать новую тему Ответ Часовой пояс GMT +4, время: 22:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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