Error 5006: can't have more than one externally visible definition
Hi
I'm getting this error:
5006: An ActionScript file can not have more than one
externally visible definition: AMReports, playSound.
playSound is a function in my main document class
The error occured after I added a MovieClip and FLV component
to my the same framemain timeline. This Movie Clip has 3 frames.
I'll be using cue points added to the FLV component to move this
from frame to frame in that MovieClip.
Any one have an idea why this is happening?
Thanks.
I fixed this problem: a brace was in the wrong place.
Similar Messages
-
Actionscript help: can not have more than one externally visable def
package {
// these are flash built in classes
import flash.display.MovieClip;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.events.Event;
//Our own custom class
import MainTimer;
import flash.events.KeyboardEvent;
public class MainDocument extends MovieClip{
//initial variable values
private var currentNumberOfEnemiesOnstage:int;
private var initialNumberOfEnemiesToCreate:int = 2;
private var enemyKills:int;
private var childToRemove:int;
private var level:int = 1;
private var makeNewEnemyTimer:Timer = new Timer(3000,1);
private var finishOffEnemy:Timer = new Timer (500, 1);
private var gameTimer:MainTimer
private var thePlayer:Player;
private var theEnemy:Enemy;
private var maxEnemies:int = 3;
private var e:int = 0;
private var childrenOnStage:int;
private var lastX:int;// variable to determine where the last x of the player was.
private var theStageNeedsToScroll:Boolean=false;// flag for scrolling
private var numChildrenInGameStage:int;
private var jump:JumpSound = new JumpSound();
private var slap:SlapSound = new SlapSound();
private var token:TokenSound = new TokenSound();
public function MainDocument() {
// constructor code
trace("the main document is alive");
makeNewEnemyTimer.addEventListener(TimerEvent.TIMER_COMPLETE,makeNewEnemyHandler);
makeNewEnemyTimer.start();
//new instance of the MainTimer class
gameTimer = new MainTimer();
//must add it to the stage
addChild(gameTimer);
//adjust its position on the stage
gameTimer.x = 20;
gameTimer.y = 20;
//add the player
thePlayer = new Player();
addChild(thePlayer);
// adjust its position on the stage
thePlayer.x = stage.stageWidth * 0.5;
// assign the name property
thePlayer.name = "player";
while (e< initialNumberOfEnemiesToCreate){
createEnemy();
e++;
} //end while
// init variable for tracking "kills"
enemyKills = 0;
killScoreBox.text = String (enemyKills) + " KILLS ";
// Update this variable every time a child is added to the stage
childrenOnStage = this.numChildren;
//Add event listener to control timing of main game loop
addEventListener (Event.ENTER_FRAME,mainGameLoop);
// Prepare for the keystroke listeners
stage.focus = stage;
stage.addEventListener (KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener (KeyboardEvent.KEY_UP, keyUpHandler);
} //end public function MainDocument
private function keyDownHandler(e:KeyboardEvent):void {
switch ( e.keyCode) {
case 37: // left
thePlayer.moveLeft();
break;
case 38://up
jump.play();
thePlayer.startJumping();
break;
case 39: //right
thePlayer.moveRight();
break;
case 40: //down to attack
slap.play();
thePlayer.attack();
break;
}// end switch
}// end function keyDownHandler
private function keyUpHandler(e:KeyboardEvent):void {
switch (e.keyCode) {
case 37: // left
case 39: // right
thePlayer.standStill();
break;
case 38: //jump
break;
case 40: // down to attack
break;
default:
//anything
} //end switch
} // end function keyUpHandler
private function createEnemy():void{
trace("create enemy");
theEnemy = new Enemy((Math.random() * 5) + 1 );
addChild(theEnemy);
// Place in a random spot on stage
theEnemy.x = (Math.random() * stage.stageWidth);
theEnemy.y = 0;
// assign the "name" property
theEnemy.name = "enemy";
//Update this variable everytime a child is added to the stage
childrenOnStage = this.numChildren;
} //end function createEnemy
//the main loop for the game!!!!!
private function mainGameLoop (event:Event):void{
checkForGameReset();
removeOrCreateNewEnemies();
processCollisions();
scrollStage();
} //end function mainGameLoop
private function checkForGameReset():void{
//define conditions
if(gameTimer.timerHasStopped == true){
resetBoard();
}else if(thePlayer.y > stage.stageHeight){
resetBoard();
}else if (theGameStage.theFish.hitTestPoint(thePlayer.x,thePlayer.y,true)
&& theStageNeedsToScroll == false){
resetBoard();
}else if (health.width <= 2){
resetBoard();
} //end function CheckForGameReset
private function resetBoard():void{
health.width = 300;
thePlayer.x = stage.stageWidth * 0.5;
theGameStage.x = stage.stageWidth * 0.5;
thePlayer.y = 0;
theGameStage.y = 0;
enemyKills = 0;
gameTimer.resetTimer();
} //end function
private function processCollisions():void{
// set up main loop to look through all collidable objects on stage
for(var c:int;c < childrenOnStage;c++){
//trace ("Children on stage c= " + c +
// test for a player or enemy child on stage
if (getChildAt(c).name == "player" || getChildAt(c).name == "enemy"){
// see if ovject is touching the game stage
if( theGameStage.hitTestPoint(getChildAt(c).x,getChildAt(c).y,true)){
// while it is still touching inch it up just until it stops
while ( theGameStage.hitTestPoint(getChildAt(c).x,getChildAt(c).y,true)==true){
// called from CollisionObject Class, so force the connectioin
CollisionObject (getChildAt(c)).incrementUpward();
if (theGameStage.hitTestPoint(getChildAt(c).x,getChildAt(c).y,true)==false){
CollisionObject(getChildAt(c)).keepOnBoundary(); //make it stick
} // end if
} //end while
} //end if touching
}//end if player or enemy
///////////////////////Collision with Enemies///////////////
if (getChildAt(c).name == "enemy"){
if(getChildAt(c).hitTestPoint (thePlayer.x, thePlayer.y , true) ){
if( thePlayer.isAttacking == false) {
// we are being attacked (and not defending)
health.width = health.width -2;
Enemy(getChildAt(c)).makeEnemyAttack();
}else{
// we are attacking that enemy
childToRemove = c;
Enemy(getChildAt(c)).makeEnemyDie();
finishOffEnemy.start();
finishOffEnemy.addEventListener(TimerEvent.TIMER_COMPLETE, finishOffEnemyComplete);
} //end else
}else if (Enemy(getChildAt(c)).enemyIsAttacking ==true) {
// if there isn't a collision between player and enemy,BUT the enemy is attacking
Enemy(getChildAt(c)).makeEnemyStopAttacking();
} //end else
import flash.events.TimerEvent;
// end if
} //end for loop
/////////////// token collision detection ///////////////
numChildrenInGameStage = theGameStage.numChildren;
for (var d:int = 0; d < numChildrenInGameStage; d++){
if (theGameStage.getChildAt(d).hasOwnProperty("isToken") &&
theGameStage.getChildAt(d).visable == true) {
if (thePlayer.hitTestObject(theGameStage.getChildAt(d))){
trace("hit token");
//play sound
token.play();
theGameStage.removeChildAt ( d );
numChildrenInGameStage = theGameStage.numChildren;
}// end if
}// end if
} //end for
}// end function processCollisions
private function scrollStage():void{
if (thePlayer.x != lastX){
theStageNeedsToScroll = true;
}else{
theStageNeedsToScroll = false;
}// end if
if (theStageNeedsToScroll == true){
for (var b:int = 0; b < childrenOnStage; b ++){
if (getChildAt (b).name =="enemy"){
getChildAt (b).x += (stage.stageWidth * 0.5) - thePlayer.x;
}// end if
} //end for
theGameStage.x += (stage.stageWidth * 0.5) - thePlayer.x;
} //end if
thePlayer.x = stage.stageWidth * 0.5;
lastX = thePlayer.x;
}// end function scrollStage
// figure out logic
// end function scrollStage
private function removeOrCreateNewEnemies():void{
for (var c:int = 0; c < childrenOnStage; c++){
if (getChildAt(c).name == "enemy" && getChildAt(c).y > stage.stageHeight){
removeChildAt(c);
createEnemy();
} //end if
if (getChildAt(c).name == "enemy" && getChildAt(c).x < thePlayer.x - stage.stageWidth){
removeChildAt(c);
createEnemy();
} //end if
} // end for loop
}// end function removeOrCreateNewEnemies
private function makeNewEnemyHandler(event:TimerEvent):void{
currentNumberOfEnemiesOnstage = 0;
for (var c:int = 0; c < childrenOnStage; c++){
if (getChildAt(c).name == "enemy");
currentNumberOfEnemiesOnstage++;
}// end if
}// end for
if(currentNumberOfEnemiesOnstage < maxEnemies){
trace("not enough enemies onstage, make more");
createEnemy();
} //end if
makeNewEnemyTimer.start();
} //end function
public function finishOffEnemyComplete(event:TimerEvent):void {
enemyKills ++;
killScoreBox.text = String ( enemyKills) + " KILLS ";
removeChildAt (childToRemove);
childrenOnStage = this.numChildren;
}// end functioin
}// end public classYou have several problems with syntax. Here is the class that has syntactical integrity:
package
// these are flash built in classes
import flash.display.MovieClip;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.events.Event;
//Our own custom class
import MainTimer;
import flash.events.KeyboardEvent;
public class MainDocument extends MovieClip
//initial variable values
private var currentNumberOfEnemiesOnstage:int;
private var initialNumberOfEnemiesToCreate:int = 2;
private var enemyKills:int;
private var childToRemove:int;
private var level:int = 1;
private var makeNewEnemyTimer:Timer = new Timer(3000, 1);
private var finishOffEnemy:Timer = new Timer(500, 1);
private var gameTimer:MainTimer
private var thePlayer:Player;
private var theEnemy:Enemy;
private var maxEnemies:int = 3;
private var e:int = 0;
private var childrenOnStage:int;
private var lastX:int; // variable to determine where the last x of the player was.
private var theStageNeedsToScroll:Boolean = false; // flag for scrolling
private var numChildrenInGameStage:int;
private var jump:JumpSound = new JumpSound();
private var slap:SlapSound = new SlapSound();
private var token:TokenSound = new TokenSound();
public function MainDocument()
// constructor code
trace("the main document is alive");
makeNewEnemyTimer.addEventListener(TimerEvent.TIMER_COMPLETE, makeNewEnemyHandler);
makeNewEnemyTimer.start();
//new instance of the MainTimer class
gameTimer = new MainTimer();
//must add it to the stage
addChild(gameTimer);
//adjust its position on the stage
gameTimer.x = 20;
gameTimer.y = 20;
//add the player
thePlayer = new Player();
addChild(thePlayer);
// adjust its position on the stage
thePlayer.x = stage.stageWidth * 0.5;
// assign the name property
thePlayer.name = "player";
while (e < initialNumberOfEnemiesToCreate)
createEnemy();
e++;
} //end while
// init variable for tracking "kills"
enemyKills = 0;
killScoreBox.text = String(enemyKills) + " KILLS ";
// Update this variable every time a child is added to the stage
childrenOnStage = this.numChildren;
//Add event listener to control timing of main game loop
addEventListener(Event.ENTER_FRAME, mainGameLoop);
// Prepare for the keystroke listeners
stage.focus = stage;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
} //end public function MainDocument
private function keyDownHandler(e:KeyboardEvent):void
switch (e.keyCode)
case 37: // left
thePlayer.moveLeft();
break;
case 38: //up
jump.play();
thePlayer.startJumping();
break;
case 39: //right
thePlayer.moveRight();
break;
case 40: //down to attack
slap.play();
thePlayer.attack();
break;
} // end switch
} // end function keyDownHandler
private function keyUpHandler(e:KeyboardEvent):void
switch (e.keyCode)
case 37: // left
case 39: // right
thePlayer.standStill();
break;
case 38: //jump
break;
case 40: // down to attack
break;
default:
//anything
} //end switch
} // end function keyUpHandler
private function createEnemy():void
trace("create enemy");
theEnemy = new Enemy((Math.random() * 5) + 1);
addChild(theEnemy);
// Place in a random spot on stage
theEnemy.x = (Math.random() * stage.stageWidth);
theEnemy.y = 0;
// assign the "name" property
theEnemy.name = "enemy";
//Update this variable everytime a child is added to the stage
childrenOnStage = this.numChildren;
} //end function createEnemy
//the main loop for the game!!!!!
private function mainGameLoop(event:Event):void
checkForGameReset();
removeOrCreateNewEnemies();
processCollisions();
scrollStage();
} //end function mainGameLoop
private function checkForGameReset():void
//define conditions
if (gameTimer.timerHasStopped == true)
resetBoard();
else if (thePlayer.y > stage.stageHeight)
resetBoard();
else if (theGameStage.theFish.hitTestPoint(thePlayer.x, thePlayer.y, true) && theStageNeedsToScroll == false)
resetBoard();
else if (health.width <= 2)
resetBoard();
} //end function CheckForGameReset
private function resetBoard():void
health.width = 300;
thePlayer.x = stage.stageWidth * 0.5;
theGameStage.x = stage.stageWidth * 0.5;
thePlayer.y = 0;
theGameStage.y = 0;
enemyKills = 0;
gameTimer.resetTimer();
} //end function
private function processCollisions():void
// set up main loop to look through all collidable objects on stage
for (var c:int; c < childrenOnStage; c++)
//trace ("Children on stage c= " + c +
// test for a player or enemy child on stage
if (getChildAt(c).name == "player" || getChildAt(c).name == "enemy")
// see if ovject is touching the game stage
if (theGameStage.hitTestPoint(getChildAt(c).x, getChildAt(c).y, true))
// while it is still touching inch it up just until it stops
// while it is still touching inch it up just until it stops
while (theGameStage.hitTestPoint(getChildAt(c).x, getChildAt(c).y, true) == true)
// called from CollisionObject Class, so force the connectioin
CollisionObject(getChildAt(c)).incrementUpward();
if (theGameStage.hitTestPoint(getChildAt(c).x, getChildAt(c).y, true) == false)
CollisionObject(getChildAt(c)).keepOnBoundary(); //make it stick
} // end if
} //end while
} //end if touching
} //end if player or enemy
///////////////////////Collision with Enemies///////////////
if (getChildAt(c).name == "enemy")
if (getChildAt(c).hitTestPoint(thePlayer.x, thePlayer.y, true))
if (thePlayer.isAttacking == false)
// we are being attacked (and not defending)
health.width = health.width - 2;
Enemy(getChildAt(c)).makeEnemyAttack();
else
// we are attacking that enemy
childToRemove = c;
Enemy(getChildAt(c)).makeEnemyDie();
finishOffEnemy.start();
finishOffEnemy.addEventListener(TimerEvent.TIMER_COMPLETE, finishOffEnemyComplete);
} //end else
else if (Enemy(getChildAt(c)).enemyIsAttacking == true)
// if there isn't a collision between player and enemy,BUT the enemy is attacking
Enemy(getChildAt(c)).makeEnemyStopAttacking();
} //end else
} //end for loop
/////////////// token collision detection ///////////////
numChildrenInGameStage = theGameStage.numChildren;
for (var d:int = 0; d < numChildrenInGameStage; d++)
if (theGameStage.getChildAt(d).hasOwnProperty("isToken") && theGameStage.getChildAt(d).visable == true)
if (thePlayer.hitTestObject(theGameStage.getChildAt(d)))
trace("hit token");
//play sound
token.play();
theGameStage.removeChildAt(d);
numChildrenInGameStage = theGameStage.numChildren;
} // end if
} // end if
} //end for
} // end function processCollisions
private function scrollStage():void
if (thePlayer.x != lastX)
theStageNeedsToScroll = true;
else
theStageNeedsToScroll = false;
} // end if
if (theStageNeedsToScroll == true)
for (var b:int = 0; b < childrenOnStage; b++)
if (getChildAt(b).name == "enemy")
getChildAt(b).x += (stage.stageWidth * 0.5) - thePlayer.x;
} // end if
} //end for
theGameStage.x += (stage.stageWidth * 0.5) - thePlayer.x;
} //end if
thePlayer.x = stage.stageWidth * 0.5;
lastX = thePlayer.x;
} // end function scrollStage
// figure out logic
// end function scrollStage
private function removeOrCreateNewEnemies():void
currentNumberOfEnemiesOnstage = 0;
for (var c:int = 0; c < childrenOnStage; c++)
if (getChildAt(c).name == "enemy")
currentNumberOfEnemiesOnstage++;
} // end if
} // end for
if (currentNumberOfEnemiesOnstage < maxEnemies)
trace("not enough enemies onstage, make more");
createEnemy();
} //end if
makeNewEnemyTimer.start();
} //end function
public function finishOffEnemyComplete(event:TimerEvent):void
enemyKills++;
killScoreBox.text = String(enemyKills) + " KILLS ";
removeChildAt(childToRemove);
childrenOnStage = this.numChildren;
} // end functioin -
Can I have more than one e-mail address attached to my apple account?
I can't seem to create different FaceTime accounts using different e-mail addresses but with 1 Apple account. My daughter's IPod is attached to my Apple account, but I want to use her e-mail address for her FaceTime app. Any thoughts?
Cessna007 wrote:
how do i sign up for a new e-mail address @icloud or @me; and can I have more than one e-mail address?
You create an @icloud.com address in the first place by signing into Settings>iCloud with your Apple ID and choosing an addres - you can only create an @icloud.com address, not @me.com.
Then if you want further addresses on the same account you can add up to three 'email aliases' - these are additional addresses (not accounts) which deliver into the same inbox as the main account. (In fact it's a good idea to give out alias addresses, rather than the main address, because if they attract spam you can easily change them.) (New aliases can only be @icloud.com ones; @me.com addresses cannot now be created.)
You should be aware before you start that once you've created an alias you cannot turn that address into a full iCloud account or move it to another account.
More information on aliases here: http://help.apple.com/icloud/#mm6b1a490a -
how do i sign up for a new e-mail address @icloud or @me; and can I have more than one e-mail address?
Cessna007 wrote:
how do i sign up for a new e-mail address @icloud or @me; and can I have more than one e-mail address?
You create an @icloud.com address in the first place by signing into Settings>iCloud with your Apple ID and choosing an addres - you can only create an @icloud.com address, not @me.com.
Then if you want further addresses on the same account you can add up to three 'email aliases' - these are additional addresses (not accounts) which deliver into the same inbox as the main account. (In fact it's a good idea to give out alias addresses, rather than the main address, because if they attract spam you can easily change them.) (New aliases can only be @icloud.com ones; @me.com addresses cannot now be created.)
You should be aware before you start that once you've created an alias you cannot turn that address into a full iCloud account or move it to another account.
More information on aliases here: http://help.apple.com/icloud/#mm6b1a490a -
Can I have more than one Apple TV in my home on one account?
I want to buy an Apple TV for my daughter and allow it to access my iTunes account. I already have an Apple TV in use in my home.
Can I have more than one Apple TV in my home on one account?yes
they access the computers shared itunes lib all the ios devices and appletv's and other computers on your network can access your shared itunes lib and all of them can use your appleID should you so choose -
Can I have more than one ipod touch on the same account, or must they each have their own ID.
If you use the same account see the following to separate Messages and FaceTime between the two iPod see:
MacMost Now 653: Setting Up Multiple iOS Devices For Messages and FaceTime -
Can i have more than one icloud account on my apple id
Can I have more than one icloiud account on one apple id
No: but it costs nothing to create another Apple ID and open a new iCloud account with that. The only caveat is that you must associate a different email address with the new Apple ID from that with the old ID (since the address will itself become the ID) - you could open a free email address with Yahoo or Gmail.
-
Can i have more than one apple id?
can i have more than one apple id listed to a single email acount?
look here
http://support.apple.com/kb/he37 -
Can you have more than one apple id on one mac?
Also i was wondering if you can create a separate apple id but keep your music/podcasts/audiobooks and transfer them to the new apple id. Please help
You can use different IDs for different accounts, i.e. one for iCloud, one for ASC one for iTunes etc etc. Apple don't really recommend this, but plenty do it.
You can also have more than one iCloud account (obviously need different IDs), but you can only have one primary iCloud account on each device.
You cannot transfer purchases from one account to another. -
Can I have more than one Apple ID on my Apple TV iTunes? I'd like to combine my family members music on our Apple tv.
Maybe.
See Family Sharing @ http://www.apple.com/ios/ios8/. -
Can you have more than one apple id on a computer. We are going away and want to facetime from our macpro to the mac computer at home but both are registered under the same apple ID. What should we do ?
I will share with you what I have done to manage this with my family. While the solution isn't without flawes, it seems to do the trick. First, you need to have one person who is managing the synching of everyone's devices. In my family, I have three iphones, about to be four, and five ipads. We all synch to the same apple ID to allow one another to take seemless advantage of our Itunes, which is on our Imac. To synch individual music or video interests, we simply select which playlists we want and manually synch that way. A couple of us use imatch and the cloud to make the entire library accessable as well. With respect to the imessage, mail, contacts, etc. we each have a gmail account for our individual emails, contacts etc. So for instance, my forth grade daughter has a gmail account that we choose to synch her contacts, calendar, etc to and then that is also the account where she receives her imessages from on her ipad and itouch. My son, who has an iphone and ipad, does the same thing, but under settings, he goes to imessage and checks his phone number and his email as his preferred way to receive imessages and texts. My wife and I do the same thing. To avoid having everyone see one anothers contracts etc, we only synch contacts from our individual email accounts. Here is the downfall to this: When you update your phone or add a new device, apple always wants to reset everyone's facetime and imessage settings and then low and behold we are all receiving imessages from one another's friends etc. To work around this, I simply take each of their devices and go to their imessage settings and only check the email and phone numbers relative to their devices. I dont' know is this is the best solution, but it seems to work for us.
-
Can I have more than one itunes account on my apple tv?
Can I have more than one itunes account on my apple tv? We have two accounts in our family and would like to be able to switch between them.
Thank you. What I was really trying to find out is if there is a limit on switching iTunes accounts - I have a vague memory of reading that changing from one iTunes store account to another was going to be limited in some way, but maybe this is on iTunes itself? Or perhaps my memory is incorrect? We have two iTunes accounts and swap back and forth regularly on our iPhones and iPads to buy and update apps without a problem. I couldn't find any reference to it on a quick search yesterday so what I have done with the AppleTV is leave it set to one account, and we watched the other account content via my Macbook.
-
Can you have more than one itunes account at one time with apple tv
My understanding is that the home sharing is based off of being on the same Wifi. So if someone brings their laptop to your house and connects to your Wifi and they have home sharing on they can connect so you can see his/her iTunes library on your iTunes.
I haven't tried this though. We have two laptops at home, both using my iTunes account and I can see each other's iTunes library, which I'm guessing is what you're probably doing now. I'd be interested to know if my thought above is true. -
I am playing Clash of Clans on my iphone and on my iPad. I would like to connect each of my games to a different Game Center ID so I don't lose them if something happens to my device, but I can't figure out how to do that without creating new Apple IDs for each device and I don't want to do that. Any advice? Can I have more than one Game Center account under the same Apple ID? If so, how do I set it up? Thanks!
If you use the same account see the following to separate Messages and FaceTime between the two iPod see:
MacMost Now 653: Setting Up Multiple iOS Devices For Messages and FaceTime -
Can you have more than one apple id under the same account
can you have more than one apple id under the same account
Stop using the same Apple ID for iMessage on these devices. Go to Settings>Messages>Send & Receive (Receive At in iOS 5), tap the ID shown, sign out, then sign back in using a unique ID for each device. (Or, just sign out and stop using your Apple ID for iMessage.)
Maybe you are looking for
-
Error in transformation in OSB
Hi all, I am getting following error in transformation in OSB console: <con:reason> OSB Assign action failed updating variable "PaymentRequestsPCMToEBS": com.bea.wli.common.xquery.XQueryException: Error parsing XML: {err}XP0006: "element {http://
-
Is there a workaround for exported Muse html files to render accurately when opened in DreamWeaver d
Is there a workaround for exported Muse html files to render accurately when opened in DreamWeaver design view?
-
I keeping getting a "You've been signed out" message everytime I try to log into the Creative Cloud desktop application. I have tried the following to no avail: Uninstalling and reinstalling the Creative Cloud app. Renaming the OOBE folder to OOBE-ol
-
Business area in migo and miro
hi, i activated business area financial statement in ob65.and i make gl field status and posting key field status business area is optional.and i assigned business area to plant in OMJ7. while doing migo and miro business area is not taking for gl a/
-
How can i get matte screen protected and cleaned ???
I know that glossy MBP has a piece of glass covered on the screen, and it's easy to clean it by using some soft material. However, for matte screen. how can I protect screen and clean it. Like at the edge of screen, if dust in it, I won't be able to