Egret社区
2银子
基于官方的http://bbs.egret-labs.org/forum.php?mod=viewthread&tid=256&highlight=%E6%89%93%E9%A3%9E%E6%9C%BA 打飞机源码,
我有个问题想请教。以下是官网的源码,在飞机的对象池中,飞机的图片都是单个png存在的。现在,我现在想随机从一个SpriteSheet里添加不同的飞机图片到舞台。如何实现用SpriteSheet来管理飞机图片?试了很多次,不成功。囧 ,只能求助大家了。
[mw_shl_code=javascript,true]/**
* Created by shaorui on 14-6-7.
*/
module fighter
{
    /**
     * 飞机,利用对象池
     */
    export class Airplane extends egret.DisplayObjectContainer
    {
        private static cacheDict:Object = {};
        /**生产*/
        public static produce(textureName:string,fireDelay:number):fighter.Airplane
        {
            if(fighter.Airplane.cacheDict[textureName]==null)
                fighter.Airplane.cacheDict[textureName] = [];
            var dict:fighter.Airplane[] = fighter.Airplane.cacheDict[textureName];
            var theFighter:fighter.Airplane;
            if(dict.length>0) {
                theFighter = dict.pop();
            } else {
                theFighter = new fighter.Airplane(RES.getRes(textureName),fireDelay);
            }
            theFighter.blood = 10;
            return theFighter;
        }
        /**回收*/
        public static reclaim(theFighter:fighter.Airplane,textureName:string):void
        {
            if(fighter.Airplane.cacheDict[textureName]==null)
                fighter.Airplane.cacheDict[textureName] = [];
            var dict:fighter.Airplane[] = fighter.Airplane.cacheDict[textureName];
            if(dict.indexOf(theFighter)==-1)
                dict.push(theFighter);
        }

        /**飞机位图*/
        private bmp:egret.Bitmap;
        /**创建子弹的时间间隔*/
        private fireDelay:number;
        /**定时射*/
        private fireTimer:egret.Timer;
        /**飞机生命值*/
        public blood:number = 10;

        public constructor(texture:egret.Texture,fireDelay:number) {
            super();
            this.fireDelay = fireDelay;
            this.bmp = new egret.Bitmap(texture);
            this.addChild(this.bmp);
            this.fireTimer = new egret.Timer(fireDelay);
            this.fireTimer.addEventListener(egret.TimerEvent.TIMER,this.createBullet,this);
        }
        /**开火*/
        public fire():void {
            this.fireTimer.start();
        }
        /**停火*/
        public stopFire():void {
            this.fireTimer.stop();
        }
        /**创建子弹*/
        private createBullet(evt:egret.TimerEvent):void {
            this.dispatchEventWith("createBullet");
        }
    }
}[/mw_shl_code]



分享到 :
0 人收藏

3 个回复

倒序浏览
ztxxxx  登堂入室 | 2014-12-16 17:10:07
eperfect 发表于 2014-12-16 16:54
随机有很多种方式,请问你需要的是哪种方案?
1.随机获取spritesheet中的飞机素材
2.把全部飞机素材都加载 ...

我已经解决了。我想要随机的意思是从一个SpriteSheet随机调用一个texture。
taotao5453  略有小成 | 2014-12-16 17:10:55
遍历json,随机一个item
前提是你这个spritsheet只有飞机元素
ztxxxx  登堂入室 | 2014-12-16 17:15:03
本帖最后由 ztxxxx 于 2014-12-16 17:18 编辑

[mw_shl_code=javascript,true]/**
* Created by shaorui on 14-6-7.
*/
module fighter
{
    /**
     * 飞机,利用对象池
     */
    export class Airplane extends egret.DisplayObjectContainer
    {
        private static cacheDict:Object = {};
        private picSheet:egret.SpriteSheet;
        /**生产*/
        public static produce(textureName:string,fireDelay:number,mapSheet:egret.SpriteSheet):fighter.Airplane
        {
            if(fighter.Airplane.cacheDict[textureName]==null)
                fighter.Airplane.cacheDict[textureName] = [];
            var dict:fighter.Airplane[] = fighter.Airplane.cacheDict[textureName];
            var theFighter:fighter.Airplane;
            if(dict.length>0) {
                theFighter = dict.pop();
            } else {
                theFighter = new fighter.Airplane(mapSheet.getTexture(textureName),fireDelay);
            }
            theFighter.blood = 10;
            return theFighter;
        }
        /**回收*/
        public static reclaim(theFighter:fighter.Airplane,textureName:string):void
        {
            if(fighter.Airplane.cacheDict[textureName]==null)
                fighter.Airplane.cacheDict[textureName] = [];
            var dict:fighter.Airplane[] = fighter.Airplane.cacheDict[textureName];
            if(dict.indexOf(theFighter)==-1)
                dict.push(theFighter);
        }

        /**飞机位图*/
        private bmp:egret.Bitmap;
        /**创建子弹的时间间隔*/
        private fireDelay:number;
        /**定时射*/
        private fireTimer:egret.Timer;
        /**飞机生命值*/
        public blood:number = 10;

        public constructor(texture:egret.Texture,fireDelay:number) {
            super();
            this.fireDelay = fireDelay;
            this.bmp = new egret.Bitmap(texture);
            this.addChild(this.bmp);
            this.fireTimer = new egret.Timer(fireDelay);
            this.fireTimer.addEventListener(egret.TimerEvent.TIMER,this.createBullet,this);
        }
        /**开火*/
        public fire():void {
            this.fireTimer.start();
        }
        /**停火*/
        public stopFire():void {
            this.fireTimer.stop();
        }
        /**创建子弹*/
        private createBullet(evt:egret.TimerEvent):void {
            this.dispatchEventWith("createBullet");
        }
    }
}[/mw_shl_code]


在gameContainer里加上:
private picSheet:egret.SpriteSheet;(你的SpriteSheet)
this.mathPic= fighter. Airplane.produce("p2",1000,this.picSheet);  (p2就是spritesheet里面的任一一张图片)
            this.addChild(this.mathPic);
区别在于代码的14行以及24行。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部