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;
}