2D游戏新手引导点光源和类迷雾实现
一、新手引导须要的遮罩效果
一般做新手引导的时候,会把游戏画面变的半黑,然后须要玩家点击的地方就亮起来。经常使用的做法是採用遮罩来实现,可是仅仅能实现方形的,不能不规则图形。以及是全然挖空。做不到渐变效果(除非美术直接出整张资源)。表现效果例如以下: 
 
实事上,我们想做把那个透明框做得更自然一点,更好看一点。 
也就是相似火把,点光源的效果。比方以下游戏的画面那样: 
 
比較效果。肯定是相似点光源酷多了。
既然要这种效果,那肯定得出我们图像混合大法了。
二、AS3实现的相似点光源效果
- 这里是採用一张美术出的具有渐变效果的图片来实现相似点光源的效果的。美术图例如以下: 
 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VqdW4xMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title=""> 
 实际上。想要更好的效果,美术能够把这个图片做得更精细一些,这里我把角色阴影来做的。假设想要实现点光源的动画效果,那么出多几张这个图片,形成动画效果就能够了。 
- 实现使用的API
DisplayObject.blendMode属性
BlendMode 类中的一个值。用于指定要使用的混合模式。用到了BlendMode类的两个属性
LAYER : String = "layer"
[静态] 强制为该显示对象创建一个透明度组。ERASE : String = "erase"
[静态] 依据显示对象的 Alpha 值擦除背景。有看过我之前文章的读者,可能会发现这API眼熟。没错,是我上篇Blog一样的实现原理 
页游《火影忍者》角色和背景遮挡半透明效果的实现  
使用的API和使用方法一摸一样。
3. 终于实现的效果图: 
 
4.代码下载地址 
2DAS3游戏地图角色遮罩和点光源 
选择里面的PointLightTest.as运行看效果
三、代码实现过程
package
{
    import flash.display.Bitmap;
    import flash.display.BlendMode;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    /**
     * 地图透明角色測试样例
     * @author sodaChen
     * Date:2017-2-16
     */
    [SWF(width="1274",height="768")]
    public class PointLightTest extends Sprite
    {
        /** 背景 **/
        [Embed(source = "res/alpha/bg.jpg")]
        private var bgClass:Class;
        /** 透明遮罩背景 **/
        [Embed(source = "res/alpha/alphaBg.png")]
        private var alphaBgClass:Class;
        /** 角色 **/
        [Embed(source = "res/alpha/role.png")]
        private var roleClass:Class;
        /** 角色容器 ,用来存放角色和透明图像的**/
        private var roleContainer:Sprite;
        /** 角色层。仅仅放角色 **/
        private var roleLayer:Sprite;
        //点光源图片(这里拿了人物脚底阴影放大来用)
        [Embed(source = "res/alpha/shadow.png")]
        private var shadowClass:Class;
        public function PointLightTest()
        {
            super();
            addEventListener(Event.ADDED_TO_STAGE,onStage);
        }
        private function onStage(evt:Event):void
        {
            //加入背景
            addChild(new bgClass());
            //加入角色容器
            roleContainer = new Sprite();
            //强制为该显示对象创建一个透明度组
            roleContainer.blendMode = BlendMode.LAYER;
            addChild(roleContainer);
            //创建角色层,事实上角色能够不用单独容器。可是必须保证alphaBg在全部角色的最上面
            roleLayer = new Sprite();
            roleContainer.addChild(roleLayer);
            //创建角色并加入到角色容器中
            createRole(300,120);
            createRole(230,550);
            //不会被遮挡的角色
            createRole(400,200);
            //依据显示对象的 Alpha 值擦除背景.这个透明图像必须在最顶层。确保以下的角色会被擦出
            var alphaBg:Bitmap = new alphaBgClass();
            alphaBg.blendMode = BlendMode.ERASE;
            roleContainer.addChild(alphaBg);
            /////////////////////////////文本的正式測试代码啦/////////////////////////////
            //新建一个专门做点光源的顶层容器
            var topContainer:Sprite = new Sprite();
            topContainer.mouseEnabled = false;
            //强制为该显示对象创建一个透明度组
            topContainer.blendMode = BlendMode.LAYER;
            addChild(topContainer);
            //创建半透的黑色遮罩
            var mask:Shape = new Shape();
            //颜色能够选自己喜欢的
            mask.graphics.beginFill(0x000000);
            mask.graphics.drawRect(0,0,1274,768);
            mask.graphics.endFill();
            mask.alpha = 0.5;
            topContainer.addChild(mask);
            //制作点光源,事实上就是新手引导里的光亮部分。
效果挺酷的。比遮罩那种一个方形的框好看多了
            var pointBitmap:Bitmap = new shadowClass();
            //依据显示对象的 Alpha 值擦除背景,就是那个半透的黑色遮罩
            pointBitmap.blendMode = BlendMode.ERASE;
            pointBitmap.x = 290; pointBitmap.y = 70;
            pointBitmap.width = 300; pointBitmap.height = 400;
            var role:Sprite = new Sprite();
            role.addEventListener(MouseEvent.MOUSE_DOWN,onMouse);
            role.addEventListener(MouseEvent.MOUSE_UP,onMouse);
            role.addChild(pointBitmap);
            topContainer.addChild(role);
        }
        private function createRole(roleX:int,roleY:int):void
        {
            var role:Sprite = new Sprite();
            var roleBitmap:Bitmap = new roleClass();
            role.x = roleX;
            role.y = roleY;
            role.addChild(roleBitmap);
            roleLayer.addChild(role);
            role.addEventListener(MouseEvent.MOUSE_DOWN,onMouse);
            role.addEventListener(MouseEvent.MOUSE_UP,onMouse);
        }
        private function onMouse(evt:MouseEvent):void
        {
            var role:Sprite = evt.currentTarget as Sprite;
            if(evt.type == MouseEvent.MOUSE_DOWN)
                role.startDrag();
            else
                role.stopDrag();
        }
    }
}2D游戏新手引导点光源和类迷雾实现的更多相关文章
- 2D游戏平滑的迷雾战争效果
		近期刚好有做2D游戏的点光源效果,然后就扩展一下.研究了一下战争迷雾的效果.主要是想实现相似魔兽争霸那种人物走动,然后黑色的战争迷雾随着人物的移动渐渐打开的效果.使用具有渐变透明图片作为光源来使得战争 ... 
- IOS 2D游戏开发框架 SpriteKit
		最近发现Xcode自带的2D游戏开发框架SpriteKit可以直接引入到APP中进行混合开发,这就是说可以开发出既带业务应用又带游戏的苹果APP,咋怎么觉得这是一个自己的小发现....呵呵....., ... 
- 2d游戏和 3d游戏的区别
		2D游戏和3D游戏的主要区别 一.总结 一句话总结:2D中的单位就是贴图,3D中的单位还有高 1. 3D 和 2D 游戏的区别主要体现在呈现画面和文件体积上: 2. 借助 3D 引擎可以提升 2D 游 ... 
- UWP简单示例(三):快速开发2D游戏引擎
		准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ... 
- UWP简单示例(三):快速开发2D游戏引擎
		准备 IDE:Visual Studio 图形 API:Win2D MSDN 教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面你需要考虑图形.输入和网络 以及相对独立的 ... 
- 【Unity3D】利用Shader以及更改Mesh实现2D游戏的动态阴影效果
		最近看到一个非常有趣的益智小游戏,是一个盗贼进入房子偷东西的, 其实这种游戏市面上已经很多了,吸引我的是那个类似手电筒的效果, 主角走到哪里,光就到哪里,被挡住的地方还有阴影.有点类似策略游戏里的战争 ... 
- Atitit 开发2d游戏的技术选型attilax总结
		Atitit 开发2d游戏的技术选型attilax总结 1.1. 跨平台跨平台:一定要使用跨平台的gui技术,目前最好的就是h5(canvas,webgl,dom) +js了..1 1.2. 游戏前后 ... 
- 发布HTML5 2D游戏引擎YEngine2D
		关于YEngine2D YEngine2D是一个开源的.采用HTML5技术和Javscript语言创建的2D游戏框架,用来构建web二维游戏. GitHub地址 最新版本 v0.1.2 浏览器支持 C ... 
- QLGame 2d Engine 搭建2d游戏原理
		大家好,2d引擎基于opengl(es) 3d技术,是因为这样比之前的ddraw有很多好处! 1.坐标采用浮点数,可以进行曲线移动 2.如果在ddraw的对图片进行缩放和旋转的时候,是基于点像素的操作 ... 
随机推荐
- python+selenium二:定位方式
			# 八种单数定位方式:elementfrom selenium import webdriverimport time driver = webdriver.Firefox()time.sleep(2 ... 
- HDU1711 Number Sequence(KMP模板题)
			Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ... 
- 图片3D旋转
			<!DOCTYPE html5> <html lang="en"> <head> <meta charset="UTF-8&qu ... 
- Ext.js入门
			一:ExtJs简介: ExtJs通常简称为Ext,它是一个非常优秀的Ajax框架,用Javascript编写,它与后台技术无关,可以用来开发具有炫丽外观的富客户端应用.Ext所开发的多彩界面吸引了许多 ... 
- usaco 校园网
			题解: 显然当一个图上的点是一个环时能满足题目要求 那么我们来考虑怎么形成一个环 很显然的是要先缩点 缩完点就成为了森林,如何让森林成环呢? 考虑一下环上的点的入度出度一定都大于1 而连一条边可以增加 ... 
- 全排列-hdu1027
			题目描述: 题目大意:现在给我们两个数字,N和M.我们应该编程找出由1到N组成的第M个最小序列.主要运用了全排列的思想,运用了全排列中next_permutation()函数: next_permut ... 
- python下sqlite增删查改方法(转)
			sqlite读写 #coding=utf-8 import sqlite3 import os #创建数据库和游标 if os.path.exists(' test.db'): conn=sqli ... 
- P1279 字串距离
			P1279 字串距离一看就是字符串dp,然而并不会,骗分之后爆零了.以后dp题要好好想想转移方程.f[i][j]表示是a串选了前i个字符,b串选了前j个字符的距离.显然(QAQ)f[i][j]=min ... 
- TypeReference -- 让Jackson Json在List/Map中识别自己的Object
			private Map<String, Object> buildHeaders(Object params) { ObjectMapper objectMapper = JacksonH ... 
- 【Java并发核心四】Executor 与 ThreadPoolExecutor
			Executor 和 ThreadPoolExecutor 实现的是线程池,主要作用是支持高并发的访问处理. Executor 是一个接口,与线程池有关的大部分类都实现了此接口. ExecutorSe ... 
