BloggerAds廣告

相關文章

2011年2月27日 星期日

Syntax Highlighter

// Created at 27/2/2011 2:14AM
// by littleshell

package com.blogspot.littleshellMultimedia {
 import flash.display.Sprite;
 import flash.display.Graphics;
 
 import flash.net.URLRequest;
 import flash.net.navigateToURL;
 
 import flash.events.MouseEvent;
 
 [SWF(backgroundColor = "0xFFFFFF", width = "120", height = "90")]
 
 public class HelloWorld extends Sprite {
  
  public function HelloWorld() {
   var _homeButton:Sprite = makeButton();

   _homeButton.buttonMode = true;
   _homeButton.addEventListener(MouseEvent.CLICK, homeButton_click);
   
   addChild(_homeButton);
   
   trace(getMessage());
  }

  //visit Syntax Highlighter's homepage
  public function gotoSyntaxHighlighterWebsite():void {
   var _uq:URLRequest = new URLRequest("http://alexgorbatchev.com/SyntaxHighlighter/");
   navigateToURL(_uq);
  }
  
  //return the contents of this post
  private function getMessage():String {
   var _myMessage:String = "";

   _myMessage += "各位好~ 寫了兩篇, 發現要在blogger 落script 異常困難";
   _myMessage += "不過昨天小弟找到了解決的方案!!就是Syntax Highlighter !!";
   _myMessage += "以後可以貼出像樣的code 了~ :D";

   _myMessage += "呢篇野唔知有幾多人識睇呢";

   return _myMessage;
  }
  
  private function makeButton():Sprite {
   var _b:Sprite = new Sprite();
   var _g:Graphics = _b.graphics;

   _g.beginFill(0xFFCCFF);
   _g.drawRect(0, 0, 32, 32);
   _g.endFill();
   
   return _b;
  }
  
  private function homeButton_click(e:MouseEvent):void {
   gotoSyntaxHighlighterWebsite();
  }
 }
}

2011年2月24日 星期四

解決 AS2 Sound class 不能獨立調整聲音問題

暫時這blog 都未有人流, 小弟暫且假設到我blog 的人對AS都有認識

若各下真的看不懂的話歡迎私底下和小弟聯絡

不知道這個問題是否很多人都懂解決

沒所謂了,還是分享一下,也許對一些人會有幫助

請看看以下的code:
var withBGSound:Boolean = true;
var withEffectSound:Boolean = true;

var bgSound:Sound = new Sound();  //background music
var effectSound:Sound = new Sound();  //sound effect


init();

function init():Void {

  bgSound.attachSound("bg_sound");
  bgSound.start(0, 9999);  


  btnBGSoundSwitcher.onRelease = btnBGSoundSwitcher_onRelease;
  btnEffectSoundSwitcher.onRelease = btnEffectSoundSwitcher_onRelease;

}
//do somthing then play the effect sound
function shoot():Void {
  //do somthing


  if(withEffectSound){

   effectSound.attachSound("bomb_sound");
   effectSound.start(0, 1);
  }
}

//onRelease handler for btnBGSoundSwitcher, used to switch on/off the background music
function btnBGSoundSwitcher_onRelease():Void {
  if (withBGSound) {
   withBGSound = false;
   bgSound.setVolume(0);

  }else {
   withBGSound = true;
   bgSound.setVolume(100);
  }
}

//onRelease handler for btnEffectSoundSwitcher, used to switch on/off the effect sound
function btnEffectSoundSwitcher_onRelease():Void {
  if (withBGSound) {
   withBGSound = false;

   bgSound.setVolume(0);
  }else {
   withBGSound = true;
   bgSound.setVolume(100);
  }
}
如果我按下了btnBGSoundSwitcher將會發生甚麼事呢??

我猜大家都會覺得只餘下effectSound 會在響吧

不過對不起, 大家都錯了

結果是兩個聲都會一塊兒消失

AS2裡的Sound class 確實是很麻煩
根據文檔, Sound.setVolume()這個 method 是一個instance method

那就是說, 這個method 理論上是對Sound class 的instance生效

可是不知怎的這個 method 會對全世界的Sound instance 生效
解決方法就是用channel 的概念 --- 每個聲源都獨立的聲軌負責

Sound class的constructor帶一個參數 -- target:Object

不過另一個問題出現

他說是Object, 小弟今天測試過是不行的

一定要是MovieClip

嗚.....這樣要寫個SoundChannel class 就好煩了

既然要用MovieClip

那就是說我現在有兩個channel -- 一個播音樂, 一個播音效

就要用兩個MovieClip了

其實....AS2 裡我不太喜歡好段段開粒不是用來display 的MovieClip

改寫頭8行:
var withBGSound:Boolean = true;

var withEffectSound:Boolean = true;

var mcBGSoundChannel:MovieClip = this.createEmptyMovieClip("mcBGSoundChannel", 0);

var mcEffectSoundChannel:MovieClip = this.createEmptyMovieClip("mcEffectSoundChannel", 1);

var bgSound:Sound = new Sound(mcBGSoundChannel);  //background music

var effectSound:Sound = new Sound(mcEffectSoundChannel);  //sound effect

再試試~

只餘下聲效了:D


2011年2月16日 星期三

在ActionScript裡防止以Cheat Engine 修改數值

年一個專案中客戶竟然想到要用Cheat Engine 來試
結果數值事無忌憚地被修改


煩擾了一星期總算有點微目,小弟在這裡分享一下


是次的測試環境為:


Windows XP SP3
Flash CS3 ActionScript 3 FlashPlayer 9
Cheat Engine 5.5


我們要測試的是myNum這個數
我用最正路的方法define myNum, 並以一個textField 來顯示
做了一個button來改變myNum:
var txtDisplay:TextField = new TextField();
var storage:Object = new Object();
var myNum:int = 0;


txtDisplay.autoSize = TextFieldAutoSize.LEFT;
txtDisplay.appendText(myNum.toString());


addChild(txtDisplay);


btn.addEventListener(MouseEvent.CLICK, btn_click);


function btn_click(e:MouseEvent) {
myNum++;
txtDisplay.text = myNum.toString();
}


遺憾地
這個寫法小弟只用了三次高階搜尋就能找出並鎖住myNum了


那解決方法呢??
其實不難
我的做法就是把myNum塞進object 就可以了:
var txtDisplay:TextField = new TextField();
var storage:Object = new Object();
storage.myNum = 0; 就是把myNum塞進一個object裡


txtDisplay.autoSize = TextFieldAutoSize.LEFT;
txtDisplay.appendText(storage.myNum.toString());


addChild(txtDisplay);


btn.addEventListener(MouseEvent.CLICK, btn_click);


function btn_click(e:MouseEvent) {
storage.myNum++;
txtDisplay.text = storage.myNum.toString();
}


同樣, Cheat Engine 三次高階搜尋就能找出myNum的值, 不過已經鎖不住myNum了~ : D
小弟亦以2bytes 及4bytes低階搜尋測試, 前者結果一樣, 後者五十多個怪怪的result, 改不了


有朋友或者會問, AS2 呢??
這個很有趣
我把profile 調成ActionScript2 FlashPlayer 8
並以下面的code 測試
var myNum:Number = 0;
var txtDisplay:TextField = this.createTextField("txtDisplay", 0,0,0,0,0);


txtDisplay.autoSize = true;
txtDisplay.text = myNum.toString();


btn.onRelease = function(){
myNum++;
txtDisplay.text = myNum.toString();
}
結果不論高階或是低階, 2bytes 或4bytes , 也都搜尋不到myNum
因為AS2對數字只有Number可用, 是個浮點數 , 故小弟還測試過以Float truncated搜尋, 結果一樣都是搜尋不到myNum
若然各位高手有破解之法或更好的預防方法, 還望賜教