`
yiminghe
  • 浏览: 1460114 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

YUI3框架下的精灵岛移植

阅读更多

Google首页的pacman 很有意思,可pacman对我似乎太遥远,不由想起了7年前没有电脑的时候,唯一的智能电器就是文曲星,而且下载游戏超级麻烦,当时一个比较著名的游戏:电脑蛙蛙GvBasic开发的精灵岛 挺好玩,我就一段段地把代码输进去了,那时候真是很佩服能写那么长代码的大虾:),虽然Basic,Goto看得晕头转向....


这两天受google影响,就把精灵岛移植到浏览器下了。

 

演示:

 

p 键:开始/暂停游戏

方向键控制方向

 

注释源码


精灵岛演示(非IE)

 

截图:

 

精灵岛移植

对应文曲星下:

 


代码:

 

难度主要不在算法,而在于如何用面向对象的设计来改造Basic,我采用YUI3的OOP架构,主要就是利用Attribute的apo以及事件支持

 

调用:

<script type="text/javascript" src="http://yui.yahooapis.com/3.1.0/build/yui/yui-min.js"></script>

<script type="text/javascript">
YUI({
     modules: {  
	         EidolonGame: {  
	             fullpath: 'eidolon.js',  
	            requires: ['event', 'base', 'node']  
	         }  
	 }
}).use("node", "event", "base","EidolonGame",
	function(Y) {
                //game canvas中渲染游戏
		var g=Y.EidolonGame("game");
	    
});
 

 

结构:

 

YUI.add('EidolonGame', function (Y) {
    /*
        缩放倍数
    */
    var ZOOM = 3;
    /*
        底层图形引擎
    */
    var GraphicUtils = {
        initCanvas: function (id) {
        },
        unDraw: function (XX, YY, l) {
        },
        drawEidolon: function (XX, YY) {
        },
        drawDevil: function (XX, YY) {
        }
        ..........
    }
    /*
        地图字典
    */
    var MapConfig = (function () {
        return {
            /**
             插入关卡
             @map:关
             **/
            insertMap: function (map) {
            },
            /**
             @gen{Function} 对应关标志处理函数
             **/
            insertGens: function (gen) {
                Y.mix(mapGen, gen);
            },
            /**
             选择制定关卡
             **/
            drawMap: function (level) {
            }
        };
    })();
    /**
     生物,恶魔,精灵公共父类
     **/

    function Creature(config) {
    }
    Creature.NAME = "Creature";
    Creature.ATTRS = {
        /*
        位置属性
        */
        pos: {
        },
        /*
        所在游戏
        */
        game: {},
        /*
        当前移动方位
        */
        direction: {
        }
    };
    Y.extend(Creature, Y.Base, {
        /*
        渲染生物
        */
        draw: function () {
        },
        /*
        搽除
        */
        unDraw: function () {
        }
    });
   
    /*
    精灵
    */

    function Eidolon(config) {
    }
  
    Y.extend(Eidolon, Creature, {
        initializer: function (cfg) {
            /*
          位置属性改变处理
          */
            this.after("posChange", this._posChange, this);
        },
       
        /*
            根据当前方移动
        */
        move: function () {
        }
    });
    /*
    恶魔
    */

    function Devil(config) {
    }
    
    Y.extend(Devil, Creature, {
        initializer: function (cfg) {
            /*
            位置属性改变处理函数
            */
            this.after("posChange", this._posChange, this);
        },
        
        /*
        撞墙或者到了思考点,就思考下
        */
        think: function () {
        },
        /*
            AI 移动
        */
        move: function () {
        }
    });
    /*
    心
    */

    function Heart(config) {
    }

    Y.extend(Heart, Y.Base, {
       
        /*
            随机位置显示
        */
        show: function () {
          
        }
        
    });
    /*
        游戏引擎
    */

    function Game(config) {
    }
    Game.NAME = "Game";
    Game.ATTRS = {
        //地图
        map: {
        },
        //当前关
        level: {
        },
        //当前精灵
        eidolon: {
        },
        //当前恶魔
        devil: {
        },
        //精灵生命
        life: {
        },
        //最多生命数
        max_life: {
        },
        //收集心数
        eats: {
        },
        //过关收集心上限
        max_eat: {
        },
        //是否暂停
        waitFlag: {
        },
        //心产生器
        heart: {
            
            }
        }
    };
    Y.extend(Game, Y.Base, {
        /*
            游戏缩放
        */
        zoomAdjust: function (z) {
           
        },
        initializer: function () {
            /*
            对应属性变化处理
            */
            this.after("waitFlagChange", this._waitFlagChange, this);
            this.after("lifeChange", this._lifeChange, this);
            this.after("eatsChange", this._eatsChange, this);
            this.on("eatsChange", this._onEatsChange, this);
            this.after("levelChange", this._levelChange, this);
            this.on("levelChange", this._onLevelChange, this);
            this.on("lifeChange", this._onLifeChange, this);
            /*
            键盘操作初始化
            */
            Y.one(document).on("keydown", function (e) {
                
            },
            this);
            this.start();
        },
        
        
        /*
        开始游戏
        */
        start: function () {
          
        },
        /*
        死了?继续游戏
        */
        startLife: function () {
            
        },
       
        /*
        恶魔回调,吃精灵
        */
        die: function () {
            //全部死光,才reset eats
            
        },
        /*
        精灵回调,收集心
        */
        eat: function () {
        },
        /*
        模拟时钟
        */
        tick: function () {
            
        }
    });
    Y.EidolonGame = function (id, cfg) {
        if (GraphicUtils.initCanvas(id)) {
            return new Game(cfg);
        } else {
            alert("Browser too old,do not use ie.");
        }
    };
    
});

 

扩展性考虑:


1.可以设置各种游戏属性:
可以设置 zoom,可以设置 level,可以传递 config 来生成 game 实例

 

Y.EidolonGame(canvasId,{

//设置 Game 属性
//查看 Game.ATTRS
//可以设置 life 生命数,max_eat 过关条件
//也可以 对实例 set(attr,value)设置,与 yui3 attribute 保持一致

})

 

2.可以定制地图:

 

g=Y.EidolonGame(cavasId,cfg)

// 为地图配置
map =g.get("map")

//map 包含操作:
/**
   插入关卡
   @map:关
**/
   insertMap
/**
   @gen{Function} 对应关标志处理函数
**/
   insertGens
 

 

 

问题:

 

1.暂不支持 IE,有空试试 excanvas

2.关卡暂时只有15个,很容易扩展,查看 MapConfig 对象即可。

3.直接做一个GvBasic解释器不知可行否,很有难度,渲染屏幕到 canvas,basic的文件操作映射到 localStorage

 

 

 

  • 大小: 42.5 KB
  • 大小: 22.6 KB
分享到:
评论
6 楼 qiren83 2010-05-29  
楼主是TAOBAO前端中级工程师吧
5 楼 xiongzhijian51 2010-05-28  
楼主,我关注你有一段时间了.发现你时间貌似很充裕.经常写博.而且都非常不错.实在是佩服得很呢.
不知道你是什么做到的,请教一二.
4 楼 yiminghe 2010-05-27  
caowei3047 写道
基本上都是封装好的,自己能设置的太少了


Y.EidolonGame 么 ,我考虑了可扩展性的,可以看下demo页面调用

1.可以设置各种游戏属性:

可以设置 zoom,可以设置 level,可以传递 config 来生成 game 实例


Y.EidolonGame(canvasId,{

//设置 Game 属性
//查看 Game.ATTRS
//可以设置 life 生命数,max_eat 过关条件
//也可以 对实例 set(attr,value)设置,与 yui3 attribute 保持一致

})



2.可以定制地图:

g=Y.EidolonGame(cavasId,cfg)

map =g.get("map") // 为地图配置
//map 包含操作:

          /**
             插入关卡
             @map:关
             **/
            insertMap
            /**
             @gen{Function} 对应关标志处理函数
             **/
            insertGens



具体地图格式看看贴子源码模块内的 MapConfig 对象

3 楼 caowei3047 2010-05-27  
基本上都是封装好的,自己能设置的太少了
2 楼 piranha 2010-05-27  
就应为对编程有兴趣,才有现在编程的你撒
1 楼 iaimstar 2010-05-27  
初中 没好好上过课,一直在用文曲星编游戏

严重荒废了学业

那时候拿的是pc1000,每天都对看不懂的peek代码耿耿于怀。。

相关推荐

    针对YUI框架API

    YUI框架API为开发者提供了丰富的功能和强大的工具,使得前端开发变得更加高效。 1. **模块化设计** YUI的核心理念之一就是模块化。每个功能或组件都被封装为独立的模块,如Event(事件)、Animation(动画)、Node...

    YUI-ajax框架开发文档

    在"YUI-ajax框架开发文档"中,我们可以深入探讨YUI如何通过其Ajax组件实现异步数据通信。 YUI中的Ajax框架主要由`YAHOO.util.Connect`和`YAHOO.widget.DataSource`两个关键部分组成。`YAHOO.util.Connect`是YUI的...

    yui3-master.zip

    在“yui3-master.zip”中,我们可以看到不同模块的源代码文件,如“build”目录下的“node”, “event”, “dom”等,这些都是YUI3的核心模块。 2. **事件系统** YUI3的事件系统是其强大功能之一,它允许开发者...

    YUI3沙盒下的多模块交互实践

    YUI3沙盒下的多模块交互实践是指利用YUI3框架所提供的沙盒模式实现多个模块之间的交互。YUI3是Yahoo公司开发的一款前端JavaScript框架,旨在帮助开发者创建高度可扩展和模块化的网络应用程序。在YUI3中,沙盒...

    从YUI2到YUI3看前端的演变 pdf

    YUI3 引入了粒度更细的模块管理方式,通过异步 HTTP 请求加载模块、然后执行回调来加载和使用模块。现场有很多人提出疑问,大家无非关心的是“效率”二字。个人以为在现阶段,这种方式有一点激进,否能为广大用户所...

    YUI3 dialog组件

    **YUI3 Dialog组件详解** YUI3是Yahoo!推出的一款强大的JavaScript库,它提供了丰富的UI组件和工具,用于构建高性能、跨平台的Web应用程序。Dialog组件是YUI3中的一个重要部分,它允许开发者创建可交互的弹出窗口,...

    YUI3 中tree的两种实现

    这篇博文“YUI3 中tree的两种实现”探讨了如何在YUI3中创建和管理树形结构。 1. **YUI3 TreeView组件** YUI3 TreeView组件是YUI3核心库的一部分,它允许开发者创建交互式的树结构。这个组件支持节点的添加、删除、...

    yui3-3.17.2最新版

    在实际使用YUI 3.17.2时,开发者可以通过`yui3-3.17.2`这个压缩包文件获取所有必要的资源。这个压缩包中包含了库的源码、示例、文档和其他辅助工具。开发者可以按照项目需求,选择合适的模块和组件进行集成。 在...

    yui框架是一个很不错的Java开发框架

    3. **动画效果**:YUI的动画模块可以实现各种复杂的动画效果,包括平滑的元素移动、改变透明度、旋转等。这些动画可以通过配置参数进行定制,如速度、缓动函数和动画结束时的回调函数。 4. **CSS样式管理**:YUI ...

    从YUI2到YUI3看前端的演变

    从YUI2到YUI3看前端的演变

    YUI-EXT使用详解

    5. **Ajax交互(Ajax Interactions)**:YUI-EXT集成了YUI的Ajax功能,允许在不刷新页面的情况下与服务器进行异步通信。这使得用户界面能够实时更新,提高了用户体验。 6. **工具提示(Tooltips)**:YUI-EXT还提供...

    YUI3.6文档及示例

    1. **模块系统**:YUI3引入了模块化设计,允许开发者按需加载组件,降低页面的初始化时间。模块可以通过`YUI.use()`方法来加载,实现了代码的异步加载和依赖管理。 2. **事件系统**:YUI的事件处理机制强大且灵活,...

    Jquery、YUI、ExtJs 三大javascript框架表单验证带提示功能的demo

    本教程将深入探讨Jquery、YUI和ExtJs这三大JavaScript框架在表单验证和提示功能方面的应用。 **jQuery** jQuery是一款轻量级、高性能的JavaScript库,以其简洁的API和跨浏览器兼容性闻名。在表单验证方面,jQuery...

    YUI3 完整包

    Yahoo! UI Library (YUI) 是一个开放源代码的 JavaScript 函数库,为了能建立一个高互动的网页,它采用了AJAX, DHTML 和 DOM 等程式码技术。它也包含了许多 CSS 资源。

    YAHOO YUI3简单入门

    例如,`yui-min.js`就是YUI3的最小核心模块,它包含了YUI的基本框架,你可以通过添加额外的模块来扩展功能。 **加载器** YUI3的加载器(Loader)是其模块化系统的关键部分,它可以动态地按需加载所需的模块。只需...

    YUI3.7.3 最新版本 带API

    1. **模块系统**:YUI3引入了CommonJS风格的模块系统,允许开发者通过`YUI.use()`方法加载所需模块,实现按需加载,减少页面初始化时的加载量。 2. **事件处理**:YUI3提供了强大的事件系统,支持DOM事件、自定义...

    yahoo3.0 YUI Examples

    UI Library (YUI) 3.0版本的一个实例集合,旨在帮助开发者理解和应用这一强大的JavaScript和CSS框架。YUI是一个开源的前端开发工具集,用于构建高性能、可扩展的Web应用程序。这个压缩包很可能是包含了一系列的代码...

    yui 资源包

    总结,YUI 3.9.0 r2是一个强大的前端开发框架,它提供了一整套工具和组件,以应对复杂的界面设计挑战,并通过优化资源加载和管理,提升了Web应用的性能和用户体验。无论是初学者还是经验丰富的开发者,都能从中找到...

    JavaScript框架高级编程——应用Prototype、YUI、Ext JS、Dojo、MooTools

    JavaScript框架高级编程——应用Prototype、YUI、Ext JS、Dojo、MooTools JavaScript框架高级编程——应用Prototype、YUI、Ext JS、Dojo、MooTools

Global site tag (gtag.js) - Google Analytics