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

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

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

Регистрация: Mar 2012
Сообщений: 29
По умолчанию Кнопка перестаёт реагировать на events после потери фокуса на stage.

Подскажите пожалуйста как решить проблемку. При добавлении event listener (например MouseEvent.MOUSE_UP). После того как stage теряет фокус (пользователь перешёл на другую страничку, наприер), а потом возвращается на stage и нажимает на зарегистрированную кнопку, она уже не реагирует на event MouseEvent.MOUSE_UP. ?

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

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Кнопка, после возвращения пользователя на страницу, не реагирует на нажатие только один раз или совсем перестает реагировать? Если один раз, то это нормально. Флешка, как элемент страницы, должна получить фокус, прежде чем отправлять мышиные события кнопкам.

Старый 13.03.2012, 16:55
Feigi вне форума Посмотреть профиль Отправить личное сообщение для Feigi Найти все сообщения от Feigi
  № 3  
Ответить с цитированием
Feigi

Регистрация: Mar 2012
Сообщений: 29
Перестаёт реагировать впринципе. Вообще-то это кнопка должна отреагировать только один раз за игру (кнопка рестарт гейм).
Код AS3:
	private function game_over_func():void{
			paused=true;
			pause_button.removeEventListener(MouseEvent.MOUSE_UP,pause_game);
			//head.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
			//stage.removeEventListener(KeyboardEvent.KEY_DOWN, reactToKey);
			//trace("game over");
 
			game_over=new Game_over();
			game_over.x=300;
			game_over.y=100;
			sprite.addChild(game_over);
 
			new_game=new New_game();
			new_game.x=290;
			new_game.y=200;
			sprite.addChild(new_game);
			new_game.addEventListener(MouseEvent.MOUSE_UP,onBtnUp);	
		}
 
		private function onBtnUp(event:MouseEvent):void{
			new_game.removeEventListener(MouseEvent.MOUSE_UP, onBtnUp);	
			var myEvent:MyEvent;
			//we set the type of the event we want to dispatch.
			myEvent = new MyEvent( "onEndGame" );
			//We set the customMessage for display
			myEvent.customMessage = "Games is finnished...!";
			//Finally we dispatch to notice the app one contact was removed
			dispatchEvent(myEvent)
		}
Что странно, есть ещё пара кнопок (плей, пауз), которые написаны один к одному также, и с ними нет проблем.

Вот весь код игры.

Код AS3:
package{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
 
	public class Game extends EventDispatcher{
		private var head:Snake_head;
		private var map:Array;
		private var turnQueue:Array;
		private var direction:uint=40;
		private var sprite:Sprite;
		private var stage:Stage;
		private var paused:Boolean=true;
		private var snake:Vector.<Snake_body>;
		private var bonus:Bonus;
		private var sun:Sunny;
		private var palm:Palm;
		private var score:int=0;
		private var myText:TextField;
		private var myFormat:TextFormat;
		private var play_pause:Play_pause;
		private var pause_button:Pause_button;
		private var play_button:Play_button;
		private var game_over:Game_over;
		private var new_game:New_game;
 
 
		public function Game(stage:Stage){
			bonus = new Bonus();
			snake = new Vector.<Snake_body>();
			this.stage=stage;
			sprite=new Sprite();
			stage.addChild(sprite);
			sprite.graphics.lineStyle(6,0x000000);
			sprite.graphics.beginFill(0xFFFFFF);
			sprite.graphics.drawRect(0, 0, 600,600); 
			sprite.graphics.endFill();
 
 
			sprite.graphics.lineStyle(6,0x000000);
			sprite.graphics.beginFill(0xABDCF8);
			sprite.graphics.drawRect(0, 0, 600,560); 
			sprite.graphics.endFill();
 
			sun=new Sunny();
			sprite.addChild(sun);
			sun.x=100;
			sun.y=100;
			sun.scaleX = .5;
			sun.scaleY = .5;
			sun.alpha=0.5;
			sun.stop();
 
			palm=new Palm();
			sprite.addChild(palm);
			palm.x=260;
			palm.y=514.5;
			palm.scaleX = .88;
			palm.alpha=0.7;
			palm.stop();
 
			play_pause = new Play_pause();
			play_pause.x=100;
			play_pause.y=580;
			sprite.addChild(play_pause);
 
			play_button=new Play_button();
			play_button.x=180;
			play_button.y=580;
			sprite.addChild(play_button);
			play_button.addEventListener(MouseEvent.MOUSE_UP,un_pause_game);
 
			myText = new TextField();
			myText.width = 80;
			myText.height = 25;
			myText.border = true;
			myText.background= true;
			myText.backgroundColor= 0xBFC7CA;
			myText.x = 500;
			myText.y = 567;
			myText.selectable = false;
			myFormat = new TextFormat("Arial", 20, 0x000000, true);
			myText.defaultTextFormat = myFormat;
			sprite.addChild(myText);
			myText.text = "0";
 
 
 
			map=new Array(31);
			for (var i:int = 0; i < 31; i++) {
				map[i] = new Array(31);
			}
 
			turnQueue=new Array();
 
			stage.addEventListener(KeyboardEvent.KEY_DOWN, reactToKey);
			head=new Snake_head;
			sprite.addChild(head);
			head.x=310;
			head.y=10;
			map[15][0]=head;
			place_food();
			head.addEventListener(Event.ENTER_FRAME,onEnterFrame);
 
 
		}
 
		private function onEnterFrame(event:Event):void{
			if (!paused){
				var x_:int=head.x;
				var y_:int=head.y;
 
				if (turnQueue.length!=0)
					direction=turnQueue.shift();
 
				if (direction==37){
					head.x-=20;
				}
				if (direction==38){
					head.y-=20;
				}
				if (direction==39){
					head.x+=20;
				}
				if (direction==40){
					head.y+=20;
				}
				if(head.x<10 || head.x>590 || head.y<10 || head.y>550){
					sprite.removeChild(head);
					moveSnake(x_,y_);
					game_over_func();
					return;
				}
 
				if (map[(head.x-10)/20][(head.y-10)/20]==1){
					moveSnake(x_,y_);
					game_over_func();
					return;
				}
 
				if (map[(head.x-10)/20][(head.y-10)/20]==2){//food..
					var segment:Snake_body=new Snake_body();
					sprite.removeChild(bonus);
					segment.x=x_;
					segment.y=y_;
					map[(x_-10)/20][(y_-10)/20]=1;
					snake.push(segment);
					sprite.addChild(segment);
					place_food();
					score+=10;
					myText.text=score.toString();
				}
				else
					moveSnake(x_,y_);
			}
		}
 
		private function moveSnake(x_:int,y_:int):void{
			if (snake.length>0){ 
				map[(snake[0].x-10)/20][(snake[0].y-10)/20]=0;
				map[(x_-10)/20][(y_-10)/20]=1;
				var segment:Snake_body=new Snake_body();
				segment.x=x_;
				segment.y=y_;
				map[(x_-10)/20][(y_-10)/20]=1;
				snake.push(segment);
				sprite.addChild(segment);
				sprite.removeChild(snake[0]);
				snake.shift();
			}
		}
		private function reactToKey(event:KeyboardEvent):void{
			var keyCode:uint=event.keyCode;
			if ( Math.abs(direction - keyCode)!=2 &&
				 keyCode > 36 && keyCode < 41 && keyCode!=turnQueue[turnQueue.length-1]){ 
				 turnQueue.push(keyCode);
 
			 } // arrow keys pressed (37 = left, 38 = up, 39 = right, 40 = down)... 
 
		}
 
		private function place_food():void{
			var x_:int;
			var y_:int;
 
			do{
				x_= Math.round((Math.random()*29));
				y_= Math.round((Math.random()*27));
			}while(map[x_][y_]==1 || (x_*20+10==head.x &&  y_*20+10==head.y) );
			bonus.x=x_*20+10;
			bonus.y=y_*20+10;
			map[x_][y_]=2;
			sprite.addChild(bonus);
		}
 
		private function pause_game(event:MouseEvent):void{
			paused=true;
			sun.stop();
			palm.stop();
			pause_button.removeEventListener(MouseEvent.MOUSE_UP,pause_game);
			sprite.removeChild(pause_button);
			play_button=new Play_button();
			play_button.x=180;
			play_button.y=580;
			sprite.addChild(play_button);
			play_button.addEventListener(MouseEvent.MOUSE_UP,un_pause_game);
		}
 
		private function un_pause_game(event:MouseEvent):void{
			stage.focus=stage;
			play_button.removeEventListener(MouseEvent.MOUSE_UP,un_pause_game);
			sprite.removeChild(play_button);
			pause_button=new Pause_button();
			pause_button.x=180;
			pause_button.y=580;
			sprite.addChild(pause_button);
			pause_button.addEventListener(MouseEvent.MOUSE_UP,pause_game);
			sun.play();
			palm.play();
			paused=false;
		}	
 
		private function game_over_func():void{
			paused=true;
			pause_button.removeEventListener(MouseEvent.MOUSE_UP,pause_game);
			//head.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
			//stage.removeEventListener(KeyboardEvent.KEY_DOWN, reactToKey);
			//trace("game over");
 
			game_over=new Game_over();
			game_over.x=300;
			game_over.y=100;
			sprite.addChild(game_over);
 
			new_game=new New_game();
			new_game.x=290;
			new_game.y=200;
			sprite.addChild(new_game);
			new_game.addEventListener(MouseEvent.MOUSE_UP,onBtnUp);	
		}
 
		private function onBtnUp(event:MouseEvent):void{
			new_game.removeEventListener(MouseEvent.MOUSE_UP, onBtnUp);	
			var myEvent:MyEvent;
			//we set the type of the event we want to dispatch.
			myEvent = new MyEvent( "onEndGame" );
			//We set the customMessage for display
			myEvent.customMessage = "Games is finnished...!";
			//Finally we dispatch to notice the app one contact was removed
			dispatchEvent(myEvent)
		}
	}
}
Код AS3:
package{
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.Event;
 
	[SWF(width=600,height=600,backgroundColor=0XD3D1D1,frameRate=5)]
 
 
	public class snakeGame extends Sprite{
		private var stage_:Stage;
		private var sprite:Sprite;
		private var game:Game;
		public function snakeGame(){ 
			this.stage_=stage;
			game=new Game(stage_);
			game.addEventListener( MyEvent.ON_END_GAME,endGame);
 
		}
 
		private function endGame(event:MyEvent):void{
			game=new Game(stage_);
		}
	}
}
Код AS3:
package{
	import flash.events.Event;
	public class MyEvent extends Event{
		public static const ON_END_GAME:String = "onEndGame";
		private var myEvent:MyEvent;
		public var customMessage:String = "";
 
		public function MyEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false){
			//we call the super class Event
			super(type, bubbles, cancelable);
		}
 
 
	}
}
Добавлено через 55 минут
Спасибо, уже разобралась. Был баг в коде, не связанный с кнопкой. Исправила.

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

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

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


 


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


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