![]() |
|
||||||||||
|
|||||
|
Регистрация: Nov 2010
Сообщений: 12
|
Вообщем как обычно, после долгих часов раздумий, обращаюсь за помощью.
Весь код перерыл, но так и не дошло до меня в чем же проблема. Короче, персонаж двигается согласно заданным параметрам,но после возвращается в прежнее положение. 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; } } } |
|
|||||
|
У вас в функции onTick, которая вызывается каждые 25 миллисекунд, ясно сказано:
Если вы хотели, чтобы Арчибальд возвращался в исходное положение только 1% случаев, вам нужно поставить эти две строки в соответствующий блок кода. Добавлено через 4 минуты Еще нужно определить фигурными скобками границы цикла: Последний раз редактировалось bav; 25.11.2010 в 23:01. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 12
|
Хм.Что-то после предыдущих действий с падающими объектами арчи вообще уже не ходит=)
Мне нужно сделать так, чтобы он вообще не возвращался в исходное положение. |
|
|||||
|
Бедный Арчи...
Попробуйте перенести логику движения Арчибальда в его собственный класс, чтобы он не путался с кем попало в одной функции. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 12
|
Дык логика движений внутри класса персонажа.
|
|
|||||
|
Написал следующее:
Класс Main: 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; } } } } 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; } } } 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; } } } 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(); } } } Добавлено через 1 минуту Еще в сточке у переменной newAlien не объявлен тип (var newAlien:Alien = new Alien (randomX,50)) Добавлено через 14 минут Хотя, нет. Строчка с else if (...) если и была ошибочной, то на перемещение Арчи в данной реализации никак не влияет, потому что он пока может ходить только влево. Последний раз редактировалось bav; 25.11.2010 в 23:58. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 12
|
Мде. Впринципе все работало, просто после GameTimer.start стоял флаг. Вот изза него ничего и не работало.
Мне вот что не понятно: 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 файле - нет. Как обратиться к фрейму посредством нажатия клавиши? |
|
|||||
|
Это проверка на случай, если нашу флешку будут добавлять в другую флешку. И если мы сразу собираемся обращаться к stage, например вешать на него каких-нибудь слушателей.
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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|