2009年2月24日 | 分类: 兴趣所在 | 标签: , , , ,

捣鼓了半天,看了各种文档终于照猫画虎的写了一个,大部分参阅phpchina上sentrychen的一篇文章:http://www.phpchina.com/bbs/thread-64204-1-1.html

不过我还是做了一点修改,总的思想当然是把smarty作为一个view来看待,实现Zend_View_Interface接口,但是我直接让我的view继承了smarty,这样的优势在于在action中直接得到一个smarty对象,完全兼容纯smary的代码迁移,而且Smarty本身就很好的实现了Zend_View_Interface中的assign方法,不必再用其他方法来暴露内部的smarty对象了

感觉有点棘手是setBasePath($path, $prefix = ”)中的prefix 在Zend_View中是用来设置help和filter的前缀,如果用smarty根本没有必要了,看sentrychen的代码把它当做了script的前缀,不过按照zf现有的目录结构没什么必要,这个等以后真用到的时候再改吧。。。

下面是代码

/*
 * Zend Framework view with Smarty
 * @author: xw
 * @name: Smarty.php
 * @data: 2009-2-22
 */
require_once ("Smarty/Smarty.class.php");
class Xend_View_Smarty extends Smarty implements Zend_View_Interface {
	function __construct($params = array ()) {
		$this->Smarty;
		$this->caching = false;
		if (!isset ($params['left_delimiter'])) {
			$params['left_delimiter'] = '<{';
			}
			if (!isset ($params['right_delimiter'])) {
				$params['right_delimiter'] = '}>';
		}
		foreach ((array) $params as $key => $value) {
			$this-> $key = $value;
		}
	}
	/**
	 * Return the actual template engine object
	 * 返回实际模板系统的对象
	 */
	public function getEngine() {
		return $this;
	}

	/**
	 * Set the path to view scripts/templates
	 * 设置视图脚本/模板的路径
	 */
	public function setScriptPath($path) {
		if (is_readable($path)) {
			$this->template_dir = $path;
			return;
		}
		throw new Xend_View_Exception('Invaild script path');
	}

	/**
	 * Set the path to smarty compile dir
	 * 设置smarty编译文件路径
	 */ 
	public function setCompilePath($path) {
		if (is_readable($path)) {
			$this->compile_dir = $path;
			return;
		}
		throw new Xend_View_Exception('Invaild compile path');
	}

	/**
	 * Set the path to smarty caceh dir
	 * 设置smarty cache路径
	 */ 
	public function setCachePath($path) {
		if (is_readable($path)) {
			$this->cache_dir = $path;
			return;
		}
		throw new Xend_View_Exception('Invaild cache path');
	}
	/**
	 * Retrieve the current script paths
	 * 获取当前脚本路径
	 */
	public function getScriptPaths() {
		return array (
				$this->template_dir
				);
	}

	/**
	 * Set a base path to all view resources
	 * 给所有视图资源设置基本路径
	 */
	public function setBasePath($path, $prefix = '') {
		$path = rtrim($path, '/\\') . DIRECTORY_SEPARATOR;
		$this->setScriptPath($path . 'scripts');
		$this->setCompilePath($path . "_tmp" . DIRECTORY_SEPARATOR . "_templates_c");
		$this->setCachePath($path . "_tmp" . DIRECTORY_SEPARATOR . "_cache");
		return $this;

	}

	/**
	 * Add an additional base path to view resources
	 * 给视图资源添加另外的基本路径
	 */
	public function addBasePath($path, $prefix = '') {
		$this->setBasePath($path, $prefix);
	}

	/**
	 * Overloading methods for assigning template variables as object properties
	 * 重载方法,用于将赋值给模板变量,以对象属性的形式
	 */
	public function __set($key, $value) {
		$this->assign($key, $value);
	}

	public function __get($key) {
		return $this->get_template_vars($key);
	}

	public function __isset($key) {
		return (null !== $this->get_template_vars($key));
	}

	public function __unset($key) {
		$this->clear_assign($key);
	}

	/**
	 * Unset all assigned template variables
	 * 消除所有已赋值的变量
	 */
	public function clearVars() {
		$this->clear_all_assign();
	}

	/**
	 * Render the template named $name
	 * 输出参数$name指定的某个模板
	 */
	public function render($name) {
		return $this->fetch($name);
	}

}
2009年2月10日 | 分类: 他山之石, 兴趣所在 | 标签: , ,
2009年2月9日 | 分类: 他山之石 | 标签: , ,

作者:heiyeluren
时间:2008-12-5
博客:http://blog.csdn.net/heiyeshuwu

本文通过非常快速的方式讲解了如何制作一个PHP 5.2 环境的扩展(PHP Extension),希望能够在图文的方式下让想快速学习的朋友了解一下制作过程。

需求:比如开发一个叫做 heiyeluren 的扩展,扩展里就一个函数 heiyeluren_test(),输入一个字符串,函数返回:Your input string: xxxxx。
要求:了解C/C++编程,熟悉PHP编程
环境:下载一份php对应版本的源码,我这里是 php-5.2.6,先正常安装php,假设我们的php安装在 /usr/local/php 目录,源码在 /root/soft/php/php-5.2.6/,现在开始!

步骤一:生成扩展框架

cd /root/soft/php/php-5.2.6/ext
./ext_skel --extname=heiyeluren
cd /root/soft/php/php-5.2.6/ext/heiyeluren
vi config.m4

打开文件后去掉 dnl ,获得下面的信息:

PHP_ARG_ENABLE(heiyeluren, whether to enable heiyeluren support,
[ --enable-heiyeluren           Enable heiyeluren support])

保存退出.

第二步:编写代码

vi php_heiyeluren.h
找到:PHP_FUNCTION(confirm_heiyeluren_compiled); ,新增一行:
PHP_FUNCTION(heiyeluren_test);
保存退出。

vi heiyeluren.c
数组里增加我们的函数,找到 zend_function_entry heiyeluren_functions[],增加:
PHP_FE(heiyeluren, NULL)

再到 heiyeluren.c 文件最后面增加如下代码:

PHP_FUNCTION(heiyeluren_test)
{
    char *arg = NULL;
    int arg_len, len;
    char *strg;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
        return;
    }

    len = spprintf(&strg, 0, "Your input string: %s\n", arg);
    RETURN_STRINGL(strg, len, 0);
}

保存退出。

第三步:编译安装

cd /root/soft/php/php-5.2.6/ext/heiyeluren
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make test
make install

现在看看是不是有个 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/heiyeluren.so
编辑php.ini,把扩展加入进去:
vi /usr/local/php/lib/php.ini
在[PHP]模块下增加:
extension = heiyeluren.so
保存退出。

注意:如果你不存在扩展文件目录,或者安装报错,那么可以自行建立这个目录,然后把扩展拷贝到目录下,然后记得把 php.ini 文件中的 extension_dir 修改为该目录:
extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/”

第四步:检查安装结果
现在看看模块加载了没有:
/usr/local/php/bin/php -m,应该会打印出:
[PHP Modules]

heiyeluren

[Zend Modules]

然后重启apache,输出 phpinfo() ,应该能够看到:
heiyeluren
heiyeluren support enabled

看看函数是否存在并且调用,在web目录下建立:heiyeluren.php

echo "
";
print_r(get_loaded_extensions());
print_r(get_extension_funcs('heiyeluren'));
echo heiyeluren_test('My first php extension');
echo "

";

访问apache,应该能够看到:

Array
(
    ...
    [33] => heiyeluren
)
Array
(
    [0] => confirm_heiyeluren_compiled
    [1] => heiyeluren_test
)

Your input string: heiyeluren

扩展制作成功

2009年2月9日 | 分类: 他山之石, 兴趣所在 | 标签: ,

在传统的OOP(面向对象编程:Object-Oriented Programming)思想里,一般把应用程序分解成若干个的对象,强调高内聚,弱耦合,从而提高应用程序的模块化程度,但是在处理某些问题的时候,OOP会显得不够灵活,比如说,应用程序里很多业务逻辑都要在操作之初进行“权限检查”,在操作之后进行“日志记录”,如果直接把处理这些操作的代码加入到每个模块中,那么无疑破坏了OOP的“单一职责”原则,模块的可重用性会大大降低,这时候传统的OOP设计往往采取的策略是加入相应的代理(Proxy)层来完成系统的功能要求,但这样的处理明显使系统整体增加了一个层次的划分,复杂性也随之增加,从而给人过于厚重的感觉。正是为了处理这样的问题,AOP(面向方面编程:Aspect-Oriented Programming)思想应运而生了,假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块,文章模块等等),而AOP的利刃是横向切入系统,提取各个模块可能都要重复操作的部分(如:权限检查,日志记录等等)。由此可见,AOP是OOP的一个有效补充。

就目前的PHP来说,还没有一个完整的AOP内置实现,虽然出现了RunKit,但一直都以BETA的状态呆在PECL项目里,估计很长时间内不太可能成为PHP的缺省设置。那是不是AOP在PHP里就破灭了呢?当然不是,因为我们有__get(),__set(),__call()等魔术方法,合理使用这些方法可以为我们实现某种程度的“准AOP”能力,之所以说是准AOP,是因为单单从实现上来看,称其为AOP有些牵强,但是从效果上来看,又部分实现了AOP的作用,虽然其实现方式并不完美,但对于一般的使用已经足够了。特别是从PHP4.3.0开始,这些魔术方法已经成为了PHP的缺省内置实现,扫除了PHP4/5兼容的顾虑,那么就更加没有理由不使用它们。这里要说明的是PHP4/5对这些魔术方法的实现有些许的不同,下面将分别举例说明:

先来看看PHP4的相应代码(下面代码只能运行在PHP4环境下):

//应用程序中某个业务逻辑类
class BIZ
{
     function foobar()
     {
         echo '业务逻辑';
     }
} 

//业务逻辑类的包装类
class AOP
{
     var $instance; 

    function AOP($instance)
     {
        $this->instance = $instance;
     } 

    function __call($method, $argument, $return)
     {
         if(! method_exists($this->instance, $method))
         {
            return false;
         } 

         echo '权限检查'; 

        $callBack = array($this->instance, $method); 

        $return = call_user_func_array($callBack, $argument); 

         echo '日志记录'; 

        return true;
     }
} 

//工厂方法
class Factory
{
     function getBizInstance()
     {
        //PHP4必须这样声明一下才可以使用overload相关方法
        overload('AOP'); 

         return new AOP(new BIZ());
     }
} 

//客户端调用演示
header("Content-Type: text/html; charset=gbk"); 

$obj = Factory::getBizInstance(); 

$obj->foobar();

屏幕显示:

权限检查
业务逻辑
日志记录

再来看看PHP5的相应代码(下面代码只能运行在PHP5的环境下):

//应用程序中某个业务逻辑类
class BIZ
{
     public function foobar()
     {
         echo '业务逻辑';
     }
} 

//业务逻辑类的包装类
class AOP
{
     private $instance; 

    public function __construct($instance)
     {
        $this->instance = $instance;
     } 

    public function __call($method, $argument)
     {
         if(! method_exists($this->instance, $method))
         {
            throw new Exception('未定义的方法:' . $method);
         } 

         echo '权限检查'; 

        $callBack = array($this->instance, $method); 

        $return = call_user_func_array($callBack, $argument); 

         echo '日志记录'; 

        return $return;
     }
} 

//工厂方法
class Factory
{
     public function getBizInstance()
     {
         return new AOP(new BIZ());
     }
} 

//客户端调用演示
header("Content-Type: text/html; charset=gbk"); 

try
{
    $obj = Factory::getBizInstance(); 

    $obj->foobar();
}
catch(Exception $e)
{
     echo 'Caught exception: ',  $e->getMessage();
}

屏幕显示:

权限检查
业务逻辑
日志记录

总结:

代码中的粗体部分是表示PHP4/5有差异的地方,具体解释可以参考手册。整个的实现思路其实很简单,关键就是客户端请求的对象不能直接实例化出来,而是利用工厂方法返回一个请求对象的包装对象,在包装对象内利用魔术方法来处理权限处理,日志记录等公共操作。这既是巧妙的地方,也是最有可能出问题的地方,因为客户端使用对象并不是它想象中的对象,而是一个包装后的对象,比如说,客户端通过getBizInstance()方法以为得到的对象是BIZ,但实际上它得到的是一个BIZ的包装对象AOP,这样的话,如果客户端进行一些诸如get_class()之类和对象类型相关的操作就会出错,当然,大多数情况下,客户端似乎不太会做类似的操作,末了,再唠叨几句,为了脚本在PHP4/5都能运行,可以分别用两个脚本实现AOP类,然后用version_compare()方法来决定加载哪一个。

2007年6月11日 | 分类: 兴趣所在 | 标签: , , , ,

最近恨激动也很无奈,或者说充满了对新事物的感叹。

标题的等式如果写成MXML=Java+ActionScript3+Css或许更加适合,对于自己来说算是初窥门径吧,不过就是这略见中的一斑中已经让我兴奋不已。

Flex,它太强大了!只能用有叹为观止来形容它,无论是它的界面,还是后台的支持。不愧是Adobe推出的RIA的前台表现的解决方案,自己没看过MS的WPF的具体效果,不过Flex足以让人感叹了。

java不用说,flex是基于J2EE的构架,其底层有了强大的依托;AS3的变化也让人吃惊,可以说彻底摆脱了AS2的“不完全面向对象的嫌疑”,他变的更纯正了,与java的结合更加紧密了,还有就是更完善了,就像effect类中的效果,有些平时感到技术层面上很麻烦的效果在AS3中都变得很简单了;再者就是css了,这个不用多说使本已绚丽的界面在静态锦上填花了。

但多数人都吧flex归于view层面的东西,不过看language reference在数据处理和后台连接的方面flex也不是很差,不知道能不能完成control,但愿在flex3中有更好的发展。

可能这就是未来的发展方向吧,Flex和WPF争霸的时代,有好戏看了,发现我又多了些兴趣,原来说RIA是个令人兴奋的东西,现在好像new RIA()了,呵呵

2007年4月21日 | 分类: 他山之石, 那些奇葩 | 标签:

转自www.qq.com

大家早上好!微软认为计算将是个人的,所有的人们创造出来工具,在所有的工具中个人电脑将是重要的一点,它能够为人们提供沟通以及制造,做生意的全新的方式,这些充满了好奇心的学生,更好地获取各种各样的信息,让他们找到自己问题的答案。

在过去的30年中,确实是令人难以置信的。我们看到计算以后的方式发展,在30多年以前,可能有几百台电脑,现在有高达几亿台电脑,现在全球有十亿人是PC机的用户,而且互联网把这些PC机的用户连接起来,让他们共享信息。这就意味着软件和软件的创造力比以往更加地重要。

大概在30多年以前,软件公司的数量非常之少,事实上我还记得软件工程获得最高的奖项在当时就是销售一个软件产品是一千个拷贝,而微软在这方面卖出一百万个这样的软件,我们也意识到这个行业在不断地发生变化。另外个人电脑的价格在逐渐下降,有一个纵向的循环,看到机器的价格在下降,机器变得越来越有吸引力,同时能够吸引更多潜在的软件购买者,越来越多的软件公司在提供一些专业软件,专门于医生、牙医或者其他各个你能够想到的行业。软件使机器变得更加有吸引力,同时批量生产使价格在逐渐下降。

我们从纵向的循环当中受益匪浅,当然个人电脑的成本在逐渐地下降,我们看到软件通过互联网以前所未有的速度更多更快地提供给了人们,同时我们也发现,软件可以在更多的地方来运行。现在软件可以在电话上运行,也可以在汽车里运行,也可以在控制电视机电子配件中运行,所以软件是无所不在的。

我们现在在互联网上运行服务,我们提供地图的服务或者搜索的服务,或者是销售的服务都在用到软件。现在网络服务的软件已经成为非常重要的趋势,也成为软件开发商的重要趋势,它在逐渐地增加和提高人们的计算速度。所以我们可以看到这些技术的进步,使我们能够看到在未来的十年当中,会看到更多的技术进步,现在有不断硬件的创新,可以看到微软的创新也能够使我们计算能力提高。同时现在这些处理器有更多的精细管,也能够提供定型的直频的程序。这样我们就能够创造出一些非常高级的软件。实际上软件服务器的核心也在为所有的雇员、客户以及公民来提供数据库的重组。

对于硬件所完成的各种活动来说,软件都在其中扮演着越来越重要的角色,同时我们也看到装饰本身的尺寸也在发生变化,电话一直是话音的装置,你可以用它浏览,用它做日历表,还可以做地图导引的服务,还可以有摄像机,你到一个商店里,看到了一个产品,可以把产品的条形码照下来,这个软件可以帮你分析,这个产品是不是是一个很好的产品,它的价格如何。如果进商务旅店,你会拿出你的电话照相机,可以照下来这些人,也可以来了解到这些人都是什么样的背景,同时可以看到软件史的变化是越来越有效。

就像PC一样,PC也可以由各种用途,而且尺寸也在越来越小。最早有平板电脑,就像是一页纸一样地薄,我们可以把这些平板电脑的价格降到几百美元之下,也就是说所有的学生都可以从中受益。如果他们需要买纸的教科书的话,可以买这样的平板PC,平板PC能够帮助他们上网,在网上能够看到不仅仅是一本教科书,而可以搜索到所有相关的资料包括视频资料,也就是说互联网就像是一个博大的图书馆,能够为他们提供海量的信息。也可以用自己的笔或者是用自己的墨水使自己的笔记或认知,笔记本成了学生的工具也是一个媒介。通过这些媒介,可以获取到所有的信息,而新的尺寸实际上也能够使我们使用量在继续提高。所有这些革命特别是在应用方面的革命都是非常广泛的。

你可以想一下电话服务,在过去电话是和个人电脑、互联网是分割开,但是有了小交换机之后,就发生了变化,你可以在Windows计算机的操作系统下使用软件,使它能够连网,而现在这个软件就可以使速度提高,可以用屏幕,回到办公室的时候,会看到未接电话的清单,对于那些你那些人来说,在你有时间的时候回电话,可以来应答你想接的电话。可以让电话的体验比过去提高很多。

在过去,过去只能看到你只能打电话的这些人,但是现在有了这个软件之后,你可以了解你所要连接的这个人是什么状况,你可以和他进行随时随地的沟通,同时我们可以看到实现了数字化,对于任何一类的商务来说,无论是飞机票还是卖新闻的设备还是卖股票,所有这些活动都变得数字化了,在过去如果你是一个公司,你用一种设备,你想卖这个设备,要想找到买家是非常复杂的。而现在放在数字市场中,很多的人会意识到这个产品,这个设备所具有的价值,通过数字的方式就比过去能够找到更多的客户。

我们的确需要软件,需要有进步,需要网络更加地安全。而软件在这方面要变得非常地强有力,我们讲到税收记录、医疗记录,所有的这些数字化的设计都会放在网络之上,我们必须需要软件。软件能够让所有的装置互通,需要软件集成各种信息,这样就可以了解销售的趋势。同时也许你要改变什么事情的时候,能够迅速做到,同时软件行业在不断进步,在推出各种新的前所未有的应用。我们有了一些新的模型方面的方式,我们要实现在过去当中不能实现的任务,我们需要软件能够适用于人们的工作,同时也通过软件满足自己的需求,同时我们可以看到在连接互联网方面的软件出现了爆炸式的增长和发展。

所有的这一切,都在发生,实际上在中国一本畅销书《世界是平的》这本书,讲到了中国经济的发展,这些都是核心通讯技术的发展是分不开,信息通信技术的发展是推动通讯走到了更高的层面,同时也看到,也相信,我们都在看到不同的领域在使用软件,比如我见到了中国首席科学家,随着经济的发展,他们用很好的软件来发现各种现在使用系统的测定,同时需要新的软件来支持它。通过软件人们能够使自己的工具做得更好,在设计汽车、设计飞机的时候,我们所能够想到的所有事情都能够出现数字化的革命,而数字化的革命会使这一切和以前大不相同。

上述所讲到的这些,有很多部分都是和互联网有关的。以前都是以低速上网也就是拨号上网,要花很长时间能够上网,而且速度非常慢。而今天我们想要获得更丰富的信息,包括视频的信息,我们需要高速的连接,这就是我们想到了宽带的连接,宽带的价格一直是局限性的因素,但是现在竞争时的价格逐渐降低,如果我们看一下未来的无线技术,可以看到微软正在构筑软件,在充分地利用到这些优势,使宽带的价格降低,特别是在世界,我们可以看到宽带的可用性仍然比较低,在任何国家都是这样。

我们可以看到在美国和中国宽带的增长率是非常令人感到惊喜的,在中国的宽带用户已经超过了美国的宽带用户。这是中国超过美国的很多项的内容之一,美国需要迎头赶上。而中国一旦成为了世界上最大的市场,就会保持这样的位置,这是非常令人感到惊喜的事情。不仅在宽带,在移动电话方面,在运营商的数量方面,我们都看到中国发展得非常迅速。这些就使得中国的政府还有各个教育机构的工作也能够变得更加高效,同时中国的宽带普及率也在提高。现在80%的家庭都获得了网络的连接。我们现在已经可以使用宽带的服务。

我们也在想到我们的工作和休闲的时候,生活方式的改变,比如说在看电视节目,有的时候你只看那些大众的流行的show,但是当电视节目上网之后,你可以观看你所感兴趣的节目,无论是体育节目,还是可以让孩子参与的那些节目。因为在你想要看节目的时候,都可以做到,因为电视节目也可以放在互联网上。所有的各种show的节目也可以变得更加地互动。

而广告也会有所不同,因为广告会是针对你个人推出的广告,对于你来说,更具吸引力,因为你对于广告商来说,也是更加具有价值。我们还看到人们在玩游戏的时候,也需要互相地交流,互相地谈判,所以用PC机以及专用的机器实现互动的游戏。而工作本身也会发生改变,你可以通过数字的摄像机还有通过电脑来制作文件,同时也可以把它传送给那些感兴趣的人。公司需要更好的培训,通过视频的方式,通过文本的方式,在网上提供培训。当我们想到信息的时候,想在信息海洋导航的时候,需要高速。

这里有一个很简单的例子,你在调查雇员的时候,问他们工作日程的安排,他们经理是不是平均有效,可以通过网络定期地做员工的调查,这样经理人也可以采用这些数字和工具,以一种非常直截了当地方式进行调查,也能够提高工作效率。

中国是一个大的市场,同时它也是市场发展贡献的因素,实际上中国对整个市场的贡献是非常大的,我们对此感到非常地高兴。因为我们看到有成千上万的软件公司在这个市场上经营业务。而且它也创造了成百上千万的工作机会。这也会推动信息技术的发展。创新在这里也是发展非常迅速。在这里要提到两个大学,北京大学和清华大学,还有其他的一些高校,他们也逐渐迈入世界领先的教育机构行列,我们也看到很多公司也有此受益,发展得非常迅速。

作为微软来说,我们承诺在计算机科学方面做我们的工作,而且我们和这些高校合作方面,也取得很大的成就。我们在推动高科技,同时也在推动操作系统的设计,还有店面的设计。我们在提供一些世界一流的定义。很多人都已经具备了这种令人难以置信的设计能力。实际上很多人都到这样的大学里接受计算机科学的学习和教育。我们也可以看到,中国将成为必须贡献于这个市场发展的重要力量。这对于软件的发展也是非常重要的。

微软对于过去取得的这些发展成就并不自满,我们将要继续加快我们的工作。我们在中国建立起了创新中心,软件的公司可以到这里实验自己所开发的软件,我们在大连和长春和当地高校也在做这方面的合作。我们的重点也是放在那些新办的企业上。和联想共同合作,特别是在移动性方面做了很多合作。因为在这个市场上,移动性变得非常重要。在过去的一年当中,所发送短消息的数字达到了140亿条,很多都是通过软件联系起来,他们做了很多令人难以置信的工作,对我们来说数字技术是可以让所有的人都享受到的,可以培训教师,建立起一些专门的学校,还可以做各种的计算。

我们对此是有我们的承诺的,我们有专门的研发队伍和当地的大学进行合作。软件能够给人们带来惊喜,在这里会出现各种各样的非常多的突破。我们能看到这些突破有很多是通过软件公司,软件公司是所有这些软件的核心,确实当我们想到你们到这里来,在这里所发挥的角色,多么地让人们感到兴奋。谢谢!

2007年3月14日 | 分类: 兴趣所在 | 标签:

过了4天才上来,没办法啊,都投入到学习和做游戏当中去了。。。

星期天赶了一天的作业,最后有些东西还没预习,星期一上了可恶的计组,那是换课后的第一节课,虽然大家怨声载道,但那天居然全都来听课了,星期二不用说一天的课,包括晚上10点后还有会,就是昨晚做到了2点,不过弄得今天信号睡了两节课,悲。。。

今天中午右完善了一下,刚刚写完了,bug不知有没。。。

这个版本增加的东西:

记分功能
为每种难度,设置了9关:
“不变化”,”向上”,”向下”,”向左”,”向右”,”左上右下”,”左下右上”,”上左下右”,”上右下左”
每过一关tip和rebuild加1
增加消除成功和消除失败的声音提示
增加了提示和洗牌的快捷键(t)和(r)
最后还完善了一下代码的注释,基本上这个游戏就做(或者说从windows版移植)的差不多了,后期可能会加一下关卡,以及美化一下界面

下面是v1.2的连连看:

链接地址:http://source.xiaonei.com/tribe/20070314/2320/orig681389.swf

27CDB6E-AE6D-11cf-96B8-444553540000′ codebase=’http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0′ width=’600′ height=’450′ >http://source.xiaonei.com/tribe/20070314/2320/orig681389.swf

2007年3月10日 | 分类: 兴趣所在 | 标签:

昨天去了一天的欢乐谷,只有晚上才有些时间进行修改。。。

这个版本增加了方块的贴图,图片的来源时windows版的连连看,自己截的,希望没有什么侵权的问题,只是借来用用。还有就是完善了提示和洗牌的限制,限定了游戏时间和输赢的情况,在最开始加了一个规则说明,还写了一个简单的loading(不过很难测试loading)。界面的布局稍有改动,看起来像个正规的游戏了,还有就是bug不知还存在多少,至少我已经测试了很多遍,弄得自己连连看的水平真是大有长进啊。

还需增加的内容:
记分功能
设置关卡 如向下,向上移动
每次消除方块的奖励,以及时间的延长
操作时的声音
按钮的快捷键
如果有时间写一个组件的主题,现在界面的组件都是用flash自带的,未免太单调了。

下面是v1.1版连连看:

链接地址:http://source.xiaonei.com/tribe/20070310/1500/orig737386.swf

由于网页加载速度原因,这个版本就不加载载页面上了,有兴趣可以访问以上链接。

2007年3月9日 | 分类: 兴趣所在 | 标签:

闭关修炼了5天,花费将近60工作时,嗯,我的连连看v1.0版本终于出来了,先自己庆祝一下吧,这几天写游戏人都要写疯了,刚在厕所因为想到了一个bug的解决方法,把一同学吓一跳。。。

这个flash版的连连看算是,自己原创的第一个flash游戏了,之所以想做这个,主要是寒假爸爸天天玩,我才稍微了解了连连看的规则,最后萌生了做一个flash版的连连看。

------------------------------

连连看的算法初期看起来不是很难,最初我写 测试两个方块是否连接的函数 并不是很困难,但做着做着就发现考虑的事多了起来。遵从上届部长的教诲,在此写下自己的总结:

首先是优点:

这个游戏让我感到很高兴的一点是,游戏过程纯代码化,出了显示的界面和每个方块是通过flash画出来的,其余均由外部类文件控制,源文件中的MovieClip(影片剪辑)均链接外部类文件加以控制。

整个游戏代码完全为as2.0或3.0规范,完全面向对象,不含任何as1.0的东西,都是as的发展是趋向于java,果然不假。。。

由于源文件不包含任何代码,以及过多的图片,倒出的swf文件较小,虽然可以反编译出代码,但是结构不是很清晰,难以阅读。

尝试了用MVC设计模式去做这个游戏,view和control无直接数据联系,均由广播事件进行类之间的通信,model相对control和view有了较好的隔离

缺点,或者不足:

前期的对游戏整体结构设计不明确,只是有某种想法,没有很好的功能规划,导致在编写的过程中频频遇到问题,虽然可以一时的解决但在某些方面破坏整体结构。还有就是数据的存储方式很不明确,整个编写过程中对数据的存储方式进行了3此的修改,导致改的相当郁闷,主要是连连的地图用一维数组还是二维数组表示,其实他们各有自己的优势,最后选择了二维数组还是因为存储方便,结构清晰,并且在数据坐标与实际坐标的转换上更为方便;但二维数组不能动态生成是唯一的缺陷,这样要静态的声明。

1.0版方块的显示是以数字的形式的,可能找起来不是很容易。而且没有添加计时,记分,不同的关卡,声音等东西,在以后还会陆续的补上。

总结写到这,可能现在想的这么多已经不是那么的全面了,反正游戏发现是越做越大,很多原来没有考虑的事情会突然冒出来,比如原来只是单纯的认为检测方块的链接只有能有一条线路就可以了,但是看到windows版的连连的看中,每条线路都是拐点最少的,即在有多条线路的时候,程序会选择一条拐弯次数最少的线路并显示出来,就这个微小的地方,今天晚上也让我想了很久,怎样找到拐点最少的线路,呵呵。

-----------------------------------

下面列一下游戏组织结构,不知UML图用什么东西画的,我还是自己叙述一下,整个源文件由一个fla和4个外部类文件组成,分别是:
LianControl类--游戏的控制核心,属性基本上是static的(为了相应不同view的事件),包含了一个静态的Map类,和as3的EventDispatcher(flash事件源类),这个类提供方法给LianView类和Diamond类,并向LianView类广播事件。这个类还从Map中获取游戏数据,对数据进行处理。

LianView类--游戏的主界面,链接了fla中的mc,用于控制显示,LianView主要对接受的数据进行坐标的转换,然后进行相应的显示,它主要包含界面的元素和一个事件代理类Delegate

Diamond类--方块类,链接fla中mc,这个类比较简单主要是管理自己,也就是每个方块的显示和事件

Map类--游戏的数据核心,整个游戏数据由Map类产生和保存,他规定数据的存储结构,是游戏最底层的东西。

讲的差不多了,不知网上又没flash版的连连看,下回去找找,下面就是游戏了:
链接地址:http://source.xiaonei.com/tribe/20070309/0020/orig578921.swf
由于网页加载速度原因,这个版本就不加载载页面上了,有兴趣可以访问以上链接。

2007年3月3日 | 分类: 那些奇葩 | 标签:

刚刚看完今年感动中国的录播,还是那种感觉,让我们记住一些东西。。。。。。

 

晚会视频:mms://winmedia.cctv.com.cn/wwwwxinwen/2007/02/wwwwxinwen_300_20070226_90.wmv 

 

丁晓兵:20多年来一直是英雄 
【颁奖词】 

这个用左手敬军礼的人,我们以他为骄傲。战时敢舍身,平时能忘我,从逆境中挣扎启程,在顺境中保 

持清醒。沙场带兵敢称无愧无悔,把守国门能说有骨有节。他像一把号角,让理想与激动,在士兵心中 

蔓延。 

 

王百姓:排除炸弹1.5万多枚 
【颁奖词】 

10年时间,1.5万多枚炸弹,专门与危险打交道。谁能不害怕,平常人只要一次遭遇炸弹,就已经惊心动 

魄了。而他和我们一样,有家有妻有娃,只不过头顶上有警徽、警徽上有国徽,所以他才把家人的担忧 

、战友的期盼,一肩担起。 

 

华益慰:“值得托付生命的人” 
【颁奖词】 

不拿一分钱,不出一个错,这种极限境界,非有神圣信仰不能达到。他是医术高超与人格高尚的完美结 

合。他用尽心血,不负生命的嘱托。

 

霍英东:聚财有道,散财亦有道 
【颁奖词】 

生于忧患,以自强不息成就人生传奇。逝于安乐,用赤诚赢得生前身后名。他有这样的财富观:民族大 

义高于金钱,赤子之心胜于财富。他有这样的境界:达则兼济天下。 

季羡林:最难时也不丢掉良知 
【颁奖词】 

智者乐,仁者寿,长者随心所欲。曾经的红衣少年,如今的白发先生,留得十年寒窗苦,牛棚杂忆密辛 

多。心有良知璞玉,笔下道德文章。一介布衣,言有物,行有格,贫贱不移,宠辱不惊。 

叶笃正:“要让外国人来同我们接轨” 
【颁奖词】 

风华正茂时已经是奠基人,古稀之年仍然是开拓者。让外国人同我们接轨,这是一个年过九旬的大学者 

的大气象。笑揽风云动,睥睨大国轻。 

孔祥瑞:150项革新带来8000万元效益 
【颁奖词】 

不管什么时代,劳动者都是社会的中流砥柱。但在今天,更值得尊敬的,还应该是那些不仅贡献汗水还 

贡献智慧的人。150项革新,给国家带来8000万元效益,这就是一个工人的成就。 

林秀贞:30年来赡养了6位孤寡老人 
【颁奖词】 

用30载爱心让一村之中老有所终,幼有所长,鳏寡孤独废疾者皆有所养。富人做这等事是慈善,穷人做 

这等事是圣贤,官员做这等事是本分,农民做这等事是伟人。这位农妇让九州动容。 

黄舸:行程1.3万多公里,当面感谢恩人 
【颁奖词】 

我们需要静下心来体会这个场面,一个四肢无力的孩子,每天都在和死神赛跑,跋山涉水、万里迢迢。 

他就像一小截被命运丢弃的蜡烛,善良的人点亮他,他就欢快地燃烧起来。藏起眼泪,还给人们光明和 

希望。 

微尘:上千笔捐款中,很多捐助者都署名“微尘” 
【颁奖词】 

他来自人群,像一粒尘土,微薄、微细、微乎其微,寻找不到,又随处可见。他自认渺小,却塑造了伟 

大,这不是一个人的名字,这是一座城市的良心

第5页/6页首页...23456