mcl編譯器
⑴ 紅警2尤里的復仇個性化編輯器完美版 新建修改文件的時候提示 『指定設備未打開,或不能被mcl識別.
缺少注冊表信息
需要打開尤里復仇的目錄,運行導入注冊表的文件
⑵ mplab x ide匯編配置位源代碼復制到哪裡
在講基於MPLAB X IDE 配置位配置前我先講講如何配置配置位。
比如PICLF1823的數據手冊 可以再器件配置中找到兩個寄存器。一個是配置字1 ,一個是配置字2.
對於初學者來說如此多的配置選項,該如何配置呢?我們要抓主重點。
配置字中最重要的配置選項就是:
看門狗配置 如:WDTE<1;0>; 一般選擇關閉看門狗
MCLRE復位腳的配置 如:MCLRE;一般選擇復位腳作I/O
震盪器的選擇: 如:FOSC<2:0>;根據實際情況配置,我這里一般選擇用 INTOSC 內部振盪器.
因為如果這三個沒有配置好的話程序根本無法運行。其他配置可以看數據手冊此不贅述。
MPLAB X IDE和MPLAB IDE 8不同。
MPLAB IDE 8 可以再界限中選擇配置位就行。配置選項可以不寫在代碼中。
MPLAB X IDE 如果要配置的話必須在代碼中寫出配置。
實例介紹:
1.打開MPLAB X IDE 在菜單欄中 點擊Window->PIC Memory Veiws->Configuration bits
2 在出現的Configuration Bits中的改變每個配置中的option選項,紅色的就是我們改變過的配置選項
3 配置完成後 點擊 Genarate Source Code to Output 產生配置源代碼。
將其中的 __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_ON & CPD_ON & BOREN_ON & CLKOUTEN_OFF & IESO_ON & FCMEN_ON);
__CONFIG(WRT_OFF & PLLEN_OFF & STVREN_ON & BORV_LO & LVP_OFF);復制到源代碼中去。源代碼中必須包涵頭文件#include<pic.h>.
此處我指出一出MPLAB X IDEv1.10 的一處錯誤 在配置中的 BORV_LO 這個配置編譯器是不認的,這可能是編寫軟體的程序員和編寫頭文件的程序猿沒有配合好:
編譯器只認得頭文件,在pic16f1823.h這個頭文件中沒有定義BORV_LO 而是把他定義為BORV_19.把BORV_HI定義成BORV_25. 總之把BORV_LO修改成BORV_19就行了。
下面應網友的要求對16F877A的配置位進行講解:
CP :程序區保護 該位置1將開啟 。(這個位是必須開啟的以防止程序被讀取)
DEBUG: 使能調試功能。如果不使能RB6 RB7腳作為普通的I/O口(根據需求)
WRT1:WRT0:防寫位。防止程序區被意外寫入。(一般建議開啟)
CPD:EEPROM保護,(這個位必須開啟以防止EEPROM中的數據被讀取)
LVP:低電壓編程使能位。如果不使用低電壓編程 RB3將做普通I/O.MCLR必須用於編程。(根據需求)
BOREN:掉電檢測。掉電檢測的作用是單片機發現電壓不足的時候會及時的停止工作。防止一些意外操作的發生。比如 EEPROM 或者FLASH中的數據丟失(這個一般必須開啟防止丟碼)
PWRTEN:上電延時。開啟後單片機會延時72MS開始工作。保證上電後電路穩定後單片機才開始工作。不要求單片機一上電就馬上工作,這個位建議開啟。(建議開啟)
WDTEN:看門狗。 這個位根據你自己需要吧。開啟之後程序必須 不停的喂狗。喂不好程序就會復位。(根據需求)
FOSC1:FOSC0:振盪器選擇位。如果你用高速的就選擇HS.中速度的就用XT,希望速度低功耗低就用LP。希望用便宜且對精度要求不高的振盪器就用RC。(根據需求選擇)
20MHz~4MHz (包括4MHz)的石英晶振配置HS.
4MHz(包括4MHz)~200KHz(包括200KHz) 的石英晶振配置XT.
200KHz(包括200KHz)~32KHz的石英晶振配置LP.
RC 就是 電阻加電容。就可以做出一個便宜但精度不高的是振盪器了。
⑶ FLASH 調用問題,在線等~
很早之前我曾經說過「沒有loading的Flash,不是完整的flash」。我想那個句話可能偏激了。因為有時候一些不到10k的flash,確實不需要做什麼loading。但我始終認為,做一個優秀的loading是衡量一個flasher水準、甚至態度的,因為loading是唯一一個你不會多看而所有用戶、客戶會看的東西,所以你對loading的重視程度,甚至可以反襯你這個flasher的職業道德。
轉載請保留原文地址:http://www.awflasher.com/blog/?id=444
Flash的loading的技術討論共分為三部分:
1、基礎
2、MovieClipLoader相關討論(較深入)
3、V2組件相關問題
前面我們介紹了基礎部分,今天我們對MovieClipLoader做Flash loading做一些深入的相關討論。
讀取外埠數據參與Flash應用程序部署是一件非常重要和常見的工作,尤其是我們常常需要檢測這些數據載入的進度。MovieClipLoader(下稱MCL)類就可以幫我們大大簡化這項麻煩工作。此外,它使得我們能獲取更多的需要,並減少代碼量。我們可以用一個單獨的MovieClip類來載入一個,或者多個外埠資源到指定的MC或者層級,或者我們可以為每一個載入工作制定不同的MCL實例。
我決定分兩部分來完成這篇教程。首先,我們將介紹MCL的基本用法;然後我們將介紹如何使用一個單獨的MCL實例來讀取外埠資源到不同的MC,並且,我們將加入偵聽器對象來參與工作。當然,不通過偵聽器也可以完成任務,我們暫時不介紹偵聽器,因為這樣你會更加容易理解MCL。
那麼,我們首先來大體了解一下MCL有哪些回調函數,後面也會有詳細介紹(aw附:回調函數我個人理解就是某一個類組、參數事先確定,擁有指定功效的方法)這里可以了解一下什麼叫做回調函數):
MovieClipLoader對象的回調函數:
事件回調函數(嚴格要求數據類型的時候,它們並不是方法,後祥):
* MovieClipLoader.onLoadStart() - 當載入開始的時候觸發
* MovieClipLoader.onLoadProgress() - 在讀取進行中觸發
* MovieClipLoader.onLoadInit() - 讀取資源載入後的第一幀執行完成後觸發
* MovieClipLoader.onLoadComplete() - 當讀取的外埠資源已經完全下載到本地時觸發。
* MovieClipLoader.onLoadError() - 當載入外埠資源出錯時觸發。
* MovieClipLoader.unloadClip() - 將載入的外埠資源移除或終止一個載入工作。
方法回調函數:
* MovieClipLoader.getProgress(target:Object):Object - 讀取外埠資源的進展,參數為MC對象(aw附:其實MC這種數據類型也就是一種對象)。返回一個對象,該對象包含兩種事先預定好的屬性(後祥)
要想好好理解這些回調函數,我們動手試驗一下是最好的方法。當然MCL是Flash7之後才有的,所以別忘了發布的時候發布成為7+的版本號。如果直接用FlashPlayer來調試可能會遇到一些問題,我們推薦在瀏覽器中進行調試(個人意見:對於外埠資源難以獲得情況,比如教育網獲取公網資源,最好不要在IDE中調試)
在我們的例子中,我們將用一個MCL對象來讀取不同的圖片,並將它們置入不同的空MC中。本例中要用到的swf文件和圖像源文件將在Actionscript.org找到(個人建議:其實看完這篇文章要不要源文件沒有必要了)
1、建立一個新的Flash文檔,並在第1幀輸入以下腳本:
_root.traceBox.vScrollPolicy ="on";
function myTrace(msg)
{
_root.traceBox.text += msg + newline;
_root.traceBox.vPosition = _root.traceBox.maxVPosition;
}
我們這里是在建立一種跟蹤調試機制,調試的(變數)將輸出到文本框組件中。這里的方法"myTrace"是預先定義好的一個函數,它幫助我們順利完成對某些信息的監控;其中第二句的作用是使文本框隨時輸出最新監控值。
2、現在從組建庫托拽一個TextArea組件進入場景,並給以合適的大小,以及一個實例名稱traceBox(對應上面的腳本)
3、接下來,我們要建立一個新的MC元件。並在場景上部署3個實例,為它們分別命名為myMC1,myMC2,myMC3。我們將把圖片或者swf影片裝載進入它們,並且,在它們下載到本地後按照需求調整它們的尺寸。其實,對圖片人為地改變尺寸會造成許多不好的後果,比如鋸齒的產生,但是為了讓大家了解onLoadInit事件的使用,我們將會這么做。
4、然後,我們建立一個MCL對象,在第一幀輸入以下腳本:
var myMCL = new MovieClipLoader();//create an instance of MovieClipLoader
aw附:這里我想羅索以下,關於Object的翻譯。因為上述代碼的注釋中,老外用的是instance這個詞,直譯的話,Object是「對象」;Instance代表「實例」。前者更注重於其數據類型,而後者則更注重於其客觀存在性。
5. 現在我們就可以部署腳本了,在第一幀:
myMCL.onLoadStart = function (targetMC)
{
var loadProgress = myMCL.getProgress(targetMC);
myTrace ("The movieclip " + targetMC + " has started loading");
myTrace("Bytes loaded at start=" + loadProgress.bytesLoaded);
myTrace("Total bytes loaded at start=" + loadProgress.bytesTotal);
}
這個函數的第一行中申明了一個(對象類型的)變數,顯然,這個變數的值由myMCL對象的getProgress方法獲得.剛才已經介紹了getProgress方法,這里可以看到,返回的loadProgress.bytesLoaded就是loadProgress對象的bytesLoaded屬性.
這里我再啰嗦一句:為什麼返回一個對象,而不返回具體的值。這是有原因的。函數返回值的功能使得程序設計更加完美,然而很多情況下,我們要返回的並非一個值,我們可能返回兩個或者更多的值,甚至它們的數據類型都不相同。這樣,只有通過對象的形式來返回了。這是解決問題最簡單最高效的方法。下面三句myTrace就呼應了之前我們定義的監控函數,這樣就能看到我們關注的變數了。
6、我們已經為onLoadStart事件部署了相應的工作,接下來我們要為上述其他事件部署工作了。緊接著是onLoadProgress,它接受三個參數:targetMC, loadedBytes, totalBytes。分別代表目標容器MC實例;已經讀取的體積、總體積。
myMCL.onLoadProgress = function (targetMC, loadedBytes, totalBytes) {
myTrace ("movie clip: " + targetMC);
myTrace("Bytes loaded at progress callback=" + loadedBytes);
myTrace("Bytes total at progress callback=" + totalBytes);
}
7、我們的onLoadComplete方法僅接受一個參數,它就是容器MC實例。像onLoadStart一樣,我們用getProgress方法來返回讀取情況。
myMCL.onLoadComplete = function (targetMC)
{
var loadProgress = myMCL.getProgress(targetMC);
myTrace (targetMC + " has finished loading.");
myTrace("Bytes loaded at end=" + loadProgress.bytesLoaded);
myTrace("Bytes total at end=" + loadProgress.bytesTotal);
}
8、onLoadInit方法將在所有載入的內容被下載到本地容器MC中之後才開始執行。這將使得你能更好的控制載入進來的內容的屬性。我選擇的圖片非常大,這樣我們可以把讀取過程看得更加清晰,而我也要對已經載入的圖片尺寸進行修整,讓它能全部顯示出來。
myMCL.onLoadInit = function (targetMC)
{
myTrace ("Movie clip:" + targetMC + " is now initialized");
targetMC._width = 170;
targetMC._height = 170;
}
9、還有一個回調方法onLoadError。如果有錯誤發生,它將會被觸發。作為一個優秀的程序員,部署完善的應用程序的時候,對錯誤發生的避免措施是必不可少的!
myMCL.onLoadError = function (targetMC, errorCode)
{
myTrace ("ERRORCODE:" + errorCode);
myTrace (targetMC + "Failed to load its content");
}
10、我們終於將最復雜的工作部署好了。接下來我們只用使用loadClip方法讀入我們需要的內容就行了。loadClip方法的兩個參數分別是外埠資源的地址和容器MC的實例。
myMCL.loadClip("http://www.yourdomain.com/test1.swf","_root.myMC1");
myMCL.loadClip("http://www.yourdomain.com/test2.swf ", "_root.myMC2");
myMCL.loadClip("http://www.yourdomain.com/pic.jpg", "_level0.myMC3");
路徑可以選擇相對路徑。注意,路徑的相對性也是一個大問題,當SWF在非本路徑的HTML中被引用的時候,遵從HTML所在的路徑!這一點是很多Flash教程都忽視的。所以,有時候絕對路徑也有絕對路徑的好處。
所有的調試工作最好在瀏覽器中,而非IDE中完成。而且腳本輸出方式必須是AS2。
接下來,我將介紹實時調用MCL的情況。為了能適應更多的應用,我們經常動態地為MCL制定工作。
aw話外音:有時候,我們這樣寫:
1、var mcl:MovieClipLoader = new MovieClipLoader ();
2、var mcl = new MovieClipLoader ();
發現第一種寫法無法為MCL制定onLoadStart等事件方法。這是編譯器根據指定變數的數據類型產生的問題。osflash的一些朋友給了一些有用的觀點,我也發現這個問題正好涉及到Flash內部的事件響應機制,不妨介紹一下:
Flash的三種事件響應機制
1、簡單的回調函數,最老的;
2、偵聽器,ASBroadcaster,FlashMX時代;
3、事件偵聽器,EventDispather,FlashMX2004時代
這里,MCL用的是第二種機制,而整套V2組件則使用最後一套機制。
附:MCL官方申明,注意:上述方法中,僅包含getProgress方法!
intrinsic class MovieClipLoader
{
function MovieClipLoader();
function addListener(listener:Object):Boolean;
function getProgress(target:Object):Object;
function loadClip(url:String, target:Object):Boolean;
function removeListener(listener:Object):Boolean;
function unloadClip(target:Object):Boolean;
}
個人補充:1、2在不嚴格要求數據類型的時候可以通用。
下面開始介紹用偵聽器來檢測MCL事件的方法。在此之前,我們解決一個最常見的問題,我們經常會在論壇中看到有人這樣提問:
引用:我動態地建立了一些MC,並逐個分配給它們一個事件句柄(標志)。然後,我將外埠資源讀取到它們之中。但是這些分配好的事件句柄都不工作了!
緊接著,發問人一般會貼出一對亂七八糟的代碼,並大呼救命。
那麼,我們首先來分析一下這個錯誤發生的原因:當外埠資源被載入到一個MC中時,這個MC將會重新初始化。這意味著任何被預先制定好的代碼都將付之東流。對於開發人員已經手動在舞台上安排好的MC則並沒有相關的麻煩,這是因為任何直接通過onClipEvent制定到MC的代碼都能倖免被重新初始化。而動態建立的MC則進行上述的「初始化」,因為我們是在運行中給它們配置的事件代碼。
我們如何避免這個問題呢?其實方法太多了,很多論壇也進行了極為詳細的討論,我就不多贅述了。
你現在也許還記得剛才我介紹的「讀取外埠數據參與Flash應用程序部署是一件非常重要和常見的工作,尤其是我們常常需要檢測這些數據載入的進度」
我們已經介紹了MCL的幾個回調函數,所以這里也不再贅述了。我們現在製作這樣一個效果:縮略圖標式的圖片瀏覽系統。我們將要從外部讀取一些JPG圖片,將它們放入我們動態部署的MC中。並且我們希望這些動態建立的MC都具有各自的onPress事件。我們通過在MC裝載好外部資源之後再為之分配事件。
在我們開始之前,我還想提醒大家注意一些經常出現的疏漏:一定要在發布的時候設置成Flash7+AS2以上的版本;其次,用瀏覽器測試你的效果,而不是IDE;否則你將會得到奇怪的結果。
現在,我們開始編制代碼,你會發現它比你想像的要簡單得多。
1、新建一個Flash文檔。
2、找四張100*100像素的縮略圖片。
3、建立一個動態文本框,大概在300*300像素左右,使用12號字體,並使之現實邊框,這樣我們更好監測。別忘了設置它為多行的。
4、建立一個100X100像素的矩形,轉變為MC,然後將它移出場景。這時候,他已經出現在庫中了。在庫中,設置他的鏈接名為「img」,並使其「在第一幀導出」。其實這個矩形會在外部資源載入的時候被取代,現在只是為了調試方便。
5、在剛才放置textBox文本框的層之上新建一層,這一層用於放置我們的代碼,先寫上:
stop();
6、現在我們定義一個MCL的實例,此外定義一個基本對象,作為我們的偵聽器:
myMCL = new MovieClipLoader(); //define MovieClipLoader
myListener = new Object(); //define listener
7、接下來我們用偵聽器來偵聽onLoadComplete事件,該事件的作用上文已經提到了。我們現在把它交給listener對象,而不是MCL實例。當然,最終要把偵聽器對象再交回MCL(以偵聽其回調函數)的時候,得到的效果就是我們需要的效果了。
記住,只有當讀取完畢的時候,對MC部署事件任務才是安全可靠的!所以,在onLoadComplete被觸發的時候才部署這個onPress事件給MC:
myListener.onLoadComplete = function(targetMC){
debug.text += "LOADING OF " + targetMC
+ " COMPLETE" + newline;
targetMC.onPress = function() {
debug.text += newline
+ "targetMC = " + targetMC._name;
}
}
註:上述代碼中有幾行被人為打斷,但這並不影響效果。
你也許已經注意到了,MC的實例名稱在onLoadComplete被觸發的時候是作為一個參數的身份傳遞給onLoadComplete的,這樣我們控制這個MC就非常方便了。比如這里就可以用點擊MC來檢測事件是否被成功部署給MC。
8、現在我們建立一個函數,它包含一個簡單的循環來部署場景上的MC。並且及時地為每一個部署好的MC分配讀取外埠資源的任務(loadClip方法),代碼如下:
function initClips(){
for (i=1; i<=4; i++){
this.attachMovie("img", "img" + i, i);
this["img"+i]._x = i*110;
myMCL.loadClip("0" + i + ".jpg" ,
this["img"+i]); //code wrapped
}
}
9、到這里基本上就完成了。現在我們剩下的工作就是注冊偵聽器並且按照需求調用相關函數、方法,反映到代碼上就是以下兩行:
myMCL.addListener(myListener);
initClips();
注意這里的順序,我們的偵聽器對象在調用initClip()函數之前就被作用於MCL實例了。現在我們的MC的onPress事件可以順利工作了,因為當圖片被完全讀入之後,事件才被分配過去。我們的代碼也非常簡潔。我們再也不用為了loading而去製作麻煩的循環了,MovieClipLoader幫我們完成了所有工作!
附:完整代碼如下:
stop();
myMCL = new MovieClipLoader();
myListener = new Object();
myListener.onLoadComplete = function(targetMC)
{
targetMC.onPress = function ()
{
trace("pressed");
}
}
function initClips()
{
for (i=1;i<=4;i++)
{
this.attachMovie("img","img"+i,i);
this["img"+i]._x = i*110;
myMCL.loadClip(url,this["img"+i]);
}
}
myMCL.addListener(myListener);
initClips();
到此為止,你應該相信MCL確實是一個不可多得的好東西了吧?
⑷ 紅警2尤里復仇 個性化編輯器完美版 新建修改文件的時候提示 『指定設備未打開,或不能被mcl識別
要雙擊目錄下的SetupReg.exe這個文件,然後在試試。 如果不行你可以到網上下載一個rulesmd.ini這個文件,然後打開這個文件就可以修改了。修改後放到游戲目錄下就可以了。或者你留下郵箱我給你發過去。
⑸ 如何在電腦上搭建opemcl編輯平台
安裝opencv2.4.9,解壓,請務必記住自己解壓的路徑。宜家以我自己的路徑為例
配置環境變數
1、系統變數 Path:添加D
2、用戶變數:添加opencv變數,值Dd,添加PATH變數(有就不需要添加,但是值需要添加)值說明:不管你系統是32位還是64位,路徑目錄均選擇X86,因為編譯都是使用32位編譯;如果選用X64,則程序運行時候會出錯。
新建visual C項目
新建 visual C++項目,如下圖所示,項目選項注意:如下圖。
4
工程目錄的配置(Debug)
找到屬性管理器,如果找不到,請安裝下圖方法找到。雙擊Debug|Win32打開如下窗口,
⑹ matlab如何調用dll文件
在Matlab的Help中搜索"Calling Functions in Shared Libraries"即可看到關於此內容的幫助文檔。
下面以一個簡單的小例子演示Matlab調用DLL的過程:
1、編譯器准備
在Matlab的命令窗口輸入:mex -setup
選擇你的編譯器,我的是:
[2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.0
2、編寫你自己的DLL
在Visual Studio 2008中新建一個Win32的Dll工程,不妨設名字為MatlabDllTest
編輯MatlabDllTest.cpp:
#include "MatlabDllTest.h"
double add(double x, double y)
{
return (x+y);
}
編輯MatlabDllTest.h:
#ifndef MATLABDLLTEST_H
#define MATLABDLLTEST_H
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) double add(double x, double y);
#ifdef __cplusplus
}
#endif
#endif
3、載入DLL:把編譯連接之後產生的MatlabDllTest.dll和MatlabDllTest.h文件拷貝到Matlab的當前工作目錄下,輸入
loadlibrary('MatlabDllTest','MatlabDllTest.h');
(一定要有這步,如果dll不成功,會顯示錯誤原因)
4、查看DLL中導出的函數
libfunctions MatlabDllTest -full
-full選項會列出導出函數的詳細輸入和輸出參數,這是輸出信息如下:
Functions in library MatlabDllTest:
double add(double, double)
5、調用函數
calllib('MatlabDllTest', 'add', 1.3, 4.6)
此時就會輸出正確的結果
ans =
5.9000
總結:這個例子比較簡單,只是為了演示整個過程,如果真的用到了Matlab來調用外部DLL的這種方式的話,就要注意DLL工程要符合Matlab的要求,詳細信息請自己查看Matlab的幫助文件。
⑺ 為什麼叫做c語言! 有A.B語言嗎! 學習C語言具體有什麼用途
c語言是最基礎的編程語言,操作系統就是用c編的
C語言與其他計算機語言一樣是一種人與電腦交流的規則的集合。有「詞彙」豐富,表達能力強的特點,有類似「普通話」的地位(盡管此類比不準確)。
電腦啟動後所做的除了處理數據還是處理數據,數學是處理數據的唯一手段。數學是電腦語言的單位——語句、變數等組織在一起完成人給定任務的基礎,沒有數學就沒有編程。而教材中的例子在初學者看來僅僅是一道道普普通通的數學題,事實上是完成復雜任務的基礎。在完成教材練習中,讓學習者體會語句的用法,鍛煉語句的調度能力,之後才可能接觸你認為比較感性的任務(如發送電子郵件等)。
⑻ loadMovieClip
發信人: lawyzone (A Snail looking for his Dream^_^), 信區: FLASH
標 題: 完美的loading-完美到底[利器]
發信站: 紫金飛鴻 (Thu May 18 20:19:47 2006)
參考英文教程,並作出大量原創補充 - Neil Webb, neil AT nwebb DOT co DOT uk, htt
p://www.nwebb.co.uk
轉載請註明原帖:http://www.awflasher.com/blog/?id=468
讀取外埠數據參與Flash應用程序部署是一件非常重要和常見的工作,尤其是我們常常需要
檢測這些數據載入的進度。而MovieClipLoader(下稱MCL)類卻幫我們大大簡化了這項麻煩
工作。此外,它使得我們能獲取更多的需要,並減少代碼量。我們可以用一個單獨的Movi
eClip類來載入一個,或者多個外埠資源到指定的MC或者層級,或者我們可以為每一個載入
工作制定不同的MCL實例。
我決定分兩部分來完成這篇教程。首先,我們將介紹MCL的基本用法;然後我們將介紹如何
使用一個單獨的MCL實例來讀取外埠資源到不同的MC,並且,我們將加入偵聽器對象來參與
工作。當然,不通過偵聽器也可以完成任務,我們暫時不介紹偵聽器,因為這樣你會更加
容易理解MCL。
那麼,我們首先來大體了解一下MCL有哪些回調函數,後面也會有詳細介紹(aw附:回調函
數我個人理解就是某一個類組、參數事先確定,擁有指定功效的方法)這里可以了解一下
什麼叫做回調函數):
MovieClipLoader對象的回調函數:
事件回調函數(嚴格要求數據類型的時候,它們並不是方法,後祥):
* MovieClipLoader.onLoadStart() - 當載入開始的時候觸發
* MovieClipLoader.onLoadProgress() - 在讀取進行中觸發
* MovieClipLoader.onLoadInit() - 讀取資源載入後的第一幀執行完成後觸發
* MovieClipLoader.onLoadComplete() - 當讀取的外埠資源已經完全下載到本地時觸發。
* MovieClipLoader.onLoadError() - 當載入外埠資源出錯時觸發。
* MovieClipLoader.unloadClip() - 將載入的外埠資源移除或終止一個載入工作。
方法回調函數:
* MovieClipLoader.getProgress(target:Object):Object - 讀取外埠資源的進展,參數
為MC對象(aw附:其實MC這種數據類型也就是一種對象)。返回一個對象,該對象包含兩種
事先預定好的屬性(後祥)
要想好好理解這些回調函數,我們動手試驗一下是最好的方法。當然MCL是Flash7之後才有
的,所以別忘了發布的時候發布成為7+的版本號。如果直接用FlashPlayer來調試可能會遇
到一些問題,我們推薦在瀏覽器中進行調試(個人意見:對於外埠資源難以獲得情況,比
如教育網獲取公網資源,最好不要在IDE中調試)
在我們的例子中,我們將用一個MCL對象來讀取不同的圖片,並將它們置入不同的空MC中。
本例中要用到的swf文件和圖像源文件將在Actionscript.org找到(個人建議:其實看完這
篇文章要不要源文件沒有必要了)
==========
1、建立一個新的Flash文檔,並在第1幀輸入以下腳本:
_root.traceBox.vScrollPolicy ="on";
function myTrace(msg)
{
_root.traceBox.text += msg + newline;
_root.traceBox.vPosition = _root.traceBox.maxVPosition;
}
我們這里是在建立一種跟蹤調試機制,調試的(變數)將輸出到文本框組件中。這里的方法
"myTrace"是預先定義好的一個函數,它幫助我們順利完成對某些信息的監控;其中第二句
的作用是使文本框隨時輸出最新監控值。
2、現在從組建庫托拽一個TextArea組件進入場景,並給以合適的大小,以及一個實例名稱
traceBox(對應上面的腳本)
3、接下來,我們要建立一個新的MC元件。並在場景上部署3個實例,為它們分別命名為my
MC1,myMC2,myMC3。我們將把圖片或者swf影片裝載進入它們,並且,在它們下載到本地後
按照需求調整它們的尺寸。其實,對圖片人為地改變尺寸會造成許多不好的後果,比如鋸
齒的產生,但是為了讓大家了解onLoadInit事件的使用,我們將會這么做。
4、然後,我們建立一個MCL對象,在第一幀輸入以下腳本:
var myMCL = new MovieClipLoader();//create an instance of MovieClipLoader
aw附:這里我想羅索以下,關於Object的翻譯。因為上述代碼的注釋中,老外用的是inst
ance這個詞,直譯的話,Object是「對象」;Instance代表「實例」。前者更注重於其數
據類型,而後者則更注重於其客觀存在性。
5. 現在我們就可以部署腳本了,在第一幀:
myMCL.onLoadStart = function (targetMC)
{
var loadProgress = myMCL.getProgress(targetMC);
myTrace ("The movieclip " + targetMC + " has started loading");
myTrace("Bytes loaded at start=" + loadProgress.bytesLoaded);
myTrace("Total bytes loaded at start=" + loadProgress.bytesTotal);
}
這個函數的第一行中申明了一個(對象類型的)變數,顯然,這個變數的值由myMCL對象的g
etProgress方法獲得.剛才已經介紹了getProgress方法,這里可以看到,返回的loadProgre
ss.bytesLoaded就是loadProgress對象的bytesLoaded屬性.
這里我在啰嗦一句:為什麼返回一個對象,而不返回具體的值。這是有原因的。函數返回
值的功能使得程序設計更加完美,然而很多情況下,我們要返回的並非一個值,我們可能
返回兩個或者更多的值,甚至它們的數據類型都不相同。這樣,只有通過對象的形式來返
回了。這是解決問題最簡單最高效的方法。下面三句myTrace就呼應了之前我們定義的監控
函數,這樣就能看到我們關注的變數了。
6、我們已經為onLoadStart事件部署了相應的工作,接下來我們要為上述其他事件部署工
作了。緊接著是onLoadProgress,它接受三個參數:targetMC, loadedBytes, totalByte
s。分別代表目標容器MC實例;已經讀取的體積、總體積。
myMCL.onLoadProgress = function (targetMC, loadedBytes, totalBytes) {
myTrace ("movie clip: " + targetMC);
myTrace("Bytes loaded at progress callback=" + loadedBytes);
myTrace("Bytes total at progress callback=" + totalBytes);
}
7、我們的onLoadComplete方法僅接受一個參數,它就是容器MC實例。像onLoadStart一樣
,我們用getProgress方法來返回讀取情況。
myMCL.onLoadComplete = function (targetMC)
{
var loadProgress = myMCL.getProgress(targetMC);
myTrace (targetMC + " has finished loading.");
myTrace("Bytes loaded at end=" + loadProgress.bytesLoaded);
myTrace("Bytes total at end=" + loadProgress.bytesTotal);
}
8、onLoadInit方法將在所有載入的內容被下載到本地容器MC中之後才開始執行。這將使得
你能更好的控制載入進來的內容的屬性。我選擇的圖片非常大,這樣我們可以把讀取過程
看得更加清晰,而我也要對已經載入的圖片尺寸進行修整,讓它能全部顯示出來。
myMCL.onLoadInit = function (targetMC)
{
myTrace ("Movie clip:" + targetMC + " is now initialized");
targetMC._width = 170;
targetMC._height = 170;
}
9、還有一個回調方法onLoadError。如果有錯誤發生,它將會被觸發。作為一個優秀的程
序員,部署完善的應用程序的時候,對錯誤發生的避免措施是必不可少的!
myMCL.onLoadError = function (targetMC, errorCode)
{
myTrace ("ERRORCODE:" + errorCode);
myTrace (targetMC + "Failed to load its content");
}
10. Well that's the hard work out of the way. Now we just have to load the fil
es in to their respective targets, using loadClip, and passing it two argument
s: the location of your file, and the destination movieclip for the file to lo
ad in to.
10、我們終於將最復雜的工作部署好了。接下來我們只用使用loadClip方法讀入我們需要
的內容就行了。loadClip方法的兩個參數分別是外埠資源的地址和容器MC的實例。
myMCL.loadClip("http://www.yourdomain.com/test1.swf,"_root.myMC1");
myMCL.loadClip("http://www.yourdomain.com/test2.swf", "_root.myMC2");
myMCL.loadClip(", "_level0.myMC3");
路徑可以選擇相對路徑。注意,路徑的相對性也是一個大問題,當SWF在非本路徑的HTML中
被引用的時候,遵從HTML所在的路徑!這一點是很多Flash教程都忽視的。所以,有時候絕
對路徑也有絕對路徑的好處。[路徑問題源文件下載,下載了就一目瞭然了]
所有的調試工作最好在瀏覽器中,而非IDE中完成。而且腳本輸出方式必須是AS2。
接下來,我將介紹實時調用MCL的情況。為了能適應更多的應用,我們經常動態地為MCL制
定工作。
aw畫外音:有時候,我們如此寫:
1、var mcl:MovieClipLoader = new MovieClipLoader ();
2、var mcl = new MovieClipLoader ();
發現第一種寫法無法為MCL制定onLoadStart等事件方法。這是編譯器根據指定變數的數據
類型產生的問題。osflash的一些朋友給了一些有用的觀點,我也發現這個問題正好涉及到
Flash內部的事件響應機制,不妨介紹一下:
Flash的三種事件響應機制
=====
1、簡單的回調函數,最老的;
2、偵聽器,ASBroadcaster,FlashMX時代;
3、事件偵聽器,EventDispather,FlashMX2004時代
這里,MCL用的是第二種機制,而整套V2組件則使用最後一套機制。
附:MCL官方申明,注意:上述方法中,僅包含getProgress方法!
intrinsic class MovieClipLoader
{
function MovieClipLoader();
function addListener(listener:Object):Boolean;
function getProgress(target:Object):Object;
function loadClip(url:String, target:Object):Boolean;
function removeListener(listener:Object):Boolean;
function unloadClip(target:Object):Boolean;
}
個人補充認為,1、2在不嚴格要求數據類型的時候可以通用。
下面開始介紹用偵聽器來檢測MCL事件的方法。在此之前,我們解決一個最常見的問題,我
們經常會在論壇中看到有人這樣提問:
引用
大家好,我動態地建立了一些MC,並逐個分配給它們一個事件句柄(標志)。然後,我將
外埠資源讀取到它們之中。但是這些分配好的事件句柄都不工作了!
緊接著,發問人一般會貼出一對亂七八糟的代碼,並大呼救命。
那麼,我們首先來分析一下這個錯誤發生的原因:當外埠資源被載入到一個MC中時,這個
MC將會重新初始化。這意味著任何被預先制定好的代碼都將付之東流。對於開發人員已經
手動在舞台上安排好的MC則並沒有相關的麻煩,這是因為任何直接通過onClipEvent制定到
MC的代碼都能倖免被重新初始化。而動態建立的MC則進行上述的「初始化」,因為我們是
在運行中給它們配置的事件代碼。
我們如何避免這個問題呢?其實方法太多了,很多論壇也進行了極為詳細的討論,我就不
多贅述了。
你現在也許還記得剛才我介紹的「讀取外埠數據參與Flash應用程序部署是一件非常重要和
常見的工作,尤其是我們常常需要檢測這些數據載入的進度」
我們已經介紹了MCL的幾個回調函數,所以這里也不再贅述了。我們現在製作這樣一個效果
:縮略圖標式的圖片瀏覽系統。我們將要從外部讀取一些JPG圖片,將它們放入我們動態部
署的MC中。並且我們希望這些動態建立的MC都具有各自的onPress事件。我們通過在MC裝載
好外部資源之後再為之分配事件。
在我們開始之前,我還想提醒大家注意一些經常出現的疏漏:一定要在發布的時候設置成
Flash7+AS2以上的版本;其次,用瀏覽器測試你的效果,而不是IDE;否則你將會得到奇怪
的結果。
現在,我們開始編制代碼,你會發現它比你想像的要簡單得多。
1、新建一個Flash文檔。
2、找四張100*100像素的縮略圖片。
3、建立一個動態文本框,大概在300*300像素左右,使用12號字體,並使之現實邊框,這
樣我們更好監測。別忘了設置它為多行的。
4、建立一個100X100像素的矩形,轉變為MC,然後將它移出場景。這時候,他已經出現在
庫中了。在庫中,設置他的鏈接名為「img」,並使其「在第一幀導出」。其實這個矩形會
在外部資源載入的時候被取代,現在只是為了調試方便。
5、在剛才放置textBox文本框的層之上新建一層,這一層用於放置我們的代碼,先寫上
stop();
6、現在我們定義一個MCL的實例,此外定義一個基本對象,作為我們的偵聽器:
myMCL = new MovieClipLoader(); //define MovieClipLoader
myListener = new Object(); //define listener
7、接下來我們用偵聽器來偵聽onLoadComplete事件,該事件的作用上文已經提到了。我們
現在把它交給listener對象,而不是MCL實例。當然,最終要把偵聽器對象再交回MCL(以
偵聽其回調函數)的時候,得到的效果就是我們需要的效果了。
記住,只有當讀取完畢的時候,對MC部署事件任務才是安全可靠的!所以,在onLoadComp
lete被觸發的時候才部署這個onPress事件給MC:
myListener.onLoadComplete = function(targetMC){
debug.text += "LOADING OF " + targetMC
+ " COMPLETE" + newline;
targetMC.onPress = function() {
debug.text += newline
+ "targetMC = " + targetMC._name;
}
}
註:上述代碼中有幾行被人為打斷,但這並不影響效果。
你也許已經注意到了,MC的實例名稱在onLoadComplete被觸發的時候是作為一個參數的身
份傳遞給onLoadComplete的,這樣我們控制這個MC就非常方便了。比如這里就可以用點擊
MC來檢測事件是否被成功部署給MC。
8、現在我們建立一個函數,它包含一個簡單的循環來部署場景上的MC。並且及時地為每一
個部署好的MC分配讀取外埠資源的任務(loadClip方法),代碼如下:
function initClips(){
for (i=1; i<=4; i++){
this.attachMovie("img", "img" + i, i);
this["img"+i]._x = i*110;
myMCL.loadClip("0" + i + ".jpg" ,
this["img"+i]); //code wrapped
}
}
9、到這里基本上就完成了。現在我們剩下的工作就是注冊偵聽器並且按照需求調用相關函
數、方法,反映到代碼上就是以下兩行:
myMCL.addListener(myListener);
initClips();
注意這里的順序,我們的偵聽器對象在調用initClip()函數之前就被作用於MCL實例了。現
在我們的MC的onPress事件可以順利工作了,因為當圖片被完全讀入之後,事件才被分配過
去。我們的代碼也非常簡潔。我們再也不用為了loading而去製作麻煩的循環了,MovieCl
ipLoader幫我們完成了所有工作!
附:完整代碼如下:
stop();
myMCL = new MovieClipLoader();
myListener = new Object();
myListener.onLoadComplete = function(targetMC)
{
targetMC.onPress = function ()
{
trace("pressed");
}
}
function initClips()
{
for (i=1;i<=4;i++)
{
this.attachMovie("img","img"+i,i);
this["img"+i]._x = i*110;
myMCL.loadClip(url,this["img"+i]);
}
}
myMCL.addListener(myListener);
initClips();
到此為止,你應該相信MCL確實是一個不可多得的好東西了吧?:)
PS:
引用 [email protected]
個人覺得loadMovieClip 類,用來載入圖片效果不錯,但如果載入flash的話則很容易出問題
,flash8+maxthon+256 RAM memory下測試,每次載入flash時,都會導致maxthon卡死,而換作
圖片時,效果卻非常如意,所以個人推薦導入圖片時用loadMovieClip類,而導入flash時還
是用第二種方法比較好!剛剛又測試了一下,loadMovieClip類用來載入flash,效果也是
不錯的,只要加一句System.security.allowDomain("http://www.yourdomain.com);就行
了 :)
aw回:目前我還沒有作相關測試,但對於"System.security.allowDomain",我確實鑽研的
還不夠,有機會好好看看……
⑼ C++調用matlab生成的dll時出現編譯錯誤。相應的頭文件,庫文件都載入,可是還是出現這些錯誤
在C++工程的屬性--鏈接器--輸入中附加依賴項中填入你要用的庫xxx.lib,保證xxx.h、xxx.lib和xxx.dll在一起,同時在C:\Users\Administrator\Desktop\hun_Mset\SS_demo\Debug\中也放入xxx.lib和xxx.dll
⑽ 如何將MATLAB程序編譯產生DLL
把一個簡單的m代碼編譯成C++介面的DLL,然後在C++程序中調用。為了簡單起見,這里的C++程序是一個Win32 Console程序,而不是Windows圖形界面的程序,不過不妨礙我們的討論。
下面是這個例子用到的m代碼。它定義了一個名為myadd2的函數
function [y,z] = myadd2(a, b)
% mmy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end
復制代碼
首先把這個函數編譯成C++介面的DLL。為此,我們需要先設置MATLAB編譯器。具體做法是在MATLAB命令行執行「mbuild -setup」。然後用下面這行命令把myadd2函數編譯成一個C++介面的DLL:
mcc -W cpplib:libmyadd2 -T link:lib myadd2
復制代碼
結果,我們將會得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在內的一些文件。接下來我們只需要這四個文件。
然後在VS2005中創建一個Win32 Console的VC++工程,我在測試時取名為testmyadd2_r2007b。把以上四個文件拷貝到VC++工程的源代碼所在目錄。
接下來設置VC++,讓它能找到MATLAB介面函數的定義及連接庫函數。可以有兩種設置方式:一種是改VS2005中關於VC++的設置,這樣的好處是每個新的工程都能自動獲得這個設定;而另一種是只改當前工程的設置,也就是設置只對該工程有效。這里用後一種方式。
在VS2005中打開工程testmyadd2_r2007b,選擇菜單「Project-->;Properties,在出來的對話框上,把MATLAB提供的include路徑加到VC++的頭文件搜索路徑。
然後把相應的lib所在目錄加到linker的額外搜索路徑上
接下來,告訴VC++,我們的這個程序需要連接到另外兩個額外的庫函數:libmyadd2.lib和mclmcrrt.lib。中間用空格隔開
最後則是程序代碼。這個程序只有一個main函數,其完整代碼附在下面給大家參考。
#include "stdafx.h"
#include <iostream>
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libmyadd2.h"
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "Hello world!" << std::endl;
/* Initialize the MCR */
if( !mclInitializeApplication(NULL,0) )
{
std::cout << "Could not initialize the application!" << std::endl;
return -1;
}
// initialize lib
if( !libmyadd2Initialize())
{
std::cout << "Could not initialize libmyadd2!" << std::endl;
return -1;
}
try
{
// declare and initialize a
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData;
aData = new double[4];
復制代碼
本帖隱藏的內容
int i;
for( i=0; i<4; ++i)
{
aData = 1.0*i;
}
// print output
std::cout << "a = " << std::endl;
std::cout << aData[0] << ",\t" << aData[1] << std::endl;
std::cout << aData[2] << ",\t" << aData[3] << std::endl;
a.SetData(aData, 4);
// declare and initialize b
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1,1) = 11.;
b(1,2) = 12.;
b(2,1) = 21.;
b(2,2) = 22.;
mwArray y(2, 2, mxDOUBLE_CLASS);
mwArray z(2, 2, mxDOUBLE_CLASS);
// call the function
myadd2(2, y, z, a, b);
// data from mwArray to C++ objects
// allocate outputs
double *yData, *zData;
yData = new double[4];
復制代碼
if( yData == NULL )
{
std::cout << "Failed to allocate memory for yData!" << std::endl;
return -1;
}
zData = new double[4];
if( zData == NULL )
{
std::cout << "Failed to allocate memory for zData!" << std::endl;
return -1;
}
// data from mwArray to C++
y.GetData(yData, 4);
z.GetData(zData, 4);
// print output
std::cout << "y = " << std::endl;
std::cout << yData[0] << ",\t" << yData[1] << std::endl;
std::cout << yData[2] << ",\t" << yData[3] << std::endl;
std::cout << "z = " << std::endl;
std::cout << zData[0] << ",\t" << zData[1] << std::endl;
std::cout << zData[2] << ",\t" << zData[3] << std::endl;
// deallocate memory
delete [] aData;
delete [] zData;
delete [] yData;
}
catch( const mwException& e)
{
std::cerr << e.what() << std::endl;
}
// terminate the lib
libmyadd2Terminate();
// terminate MCR
mclTerminateApplication();
return 0;
}