显示对象 DisplayObject

作者:zccst

显示对象 DisplayObject

DisplayObject类是所有显示对象的父类,该类归纳总结了一些显示对象共有的特性,这些共有的特性被整理成为一些列的属性与方法。

1,显示对象的基本概念
(1)属性
上面四幅图中中展示了显示对象中比较基础也是很常用的可视属性,下面列表是显示对象的全部可视属性。

alpha:透明度
width:宽度 height:高度
x:X轴坐标值 y:Y轴坐标值

rotation:旋转角度
scaleX:横向缩放
scaleY:纵向缩放
skewX:横向斜切
skewY:纵向斜切
visible:是否可见

此外,还有锚点的位置属性
anchorX 对象沿x方向的对齐
anchorY 对象沿y方向的对齐
取值范围是0.0-1.0.其中0.0表示从对象的最左对齐,0.5表示从对象的中间对齐,1.0表示从对象的最右对齐
例如:
var textContainer:egret.Sprite = new egret.Sprite();
textContainer.anchorX = textContainer.anchorY = 0.5;
一篇文章:http://coronalabs.com/blog/2013/10/15/tutorial-anchor-points-in-graphics-2-0/

(2)方法


2,Egret中的显示对象类DisplayObject拥有四个派生类,分别为:Bitmap、Shape、TextField、TextInput 这四个派生类实现了不同的功能

Bitmap进行位图显示和操作,可以在位图纹理部分查阅相关技术细节。
Shape是可以进行矢量图绘制的显示对象,可以在适量绘图部分查阅相关技术细节。
TextField 和 TextInput都属于文本操作,可以在文本部分查阅相关技术细节。


3,遮罩是游戏中非常常用的一种视觉处理手段。例如,游戏中滚动的玩家列表就使用了遮罩这一技术。所谓遮罩就是指定一个显示对象哪些部分可以显示,哪些部分不可以显示。

Egret启用遮罩功能非常的简单,在DisplayObject中,我们暴露了一个名称为 mask 的属性,该属性就是用来指定遮罩部分的。

下面一个示例中绘制了两个Shape对象,我们对其中一个Shape使用遮罩,另外一个Shape当做参考。

//绘制了一个矢量图,矩形,( 0,0,100,100)
11 var shp:egret.Shape = new egret.Shape();
12 shp.graphics.beginFill( 0xff0000 );
13 shp.graphics.drawRect( 0,0,100,100);
14 shp.graphics.endFill();
15 this.addChild( shp );

//给改矩形添加了一个遮罩,遮罩也是一个对象
1 var rect:egret.Rectangle = new egret.Rectangle(20,20,30,50);//api中的矩形类,直接初始化
2 shp.mask = rect;


4,碰撞检测在游戏中是非常重要的功能,例如我们制作一款打飞机游戏,当子弹与飞机发生碰撞的时候我们可以认为游戏结束。此时碰撞的过程需要进行碰撞检测操作。

在Egret中,我们提供了碰撞检测的功能,同时该功能提供两种不同的碰撞检测方式。

第一种检测方法:检测图与点是否碰撞
shp.hitTestPoint( 10, 10 );

{
this.drawText();
12
13 var shp:egret.Shape = new egret.Shape();
14 shp.graphics.beginFill( 0xff0000 );
15 shp.graphics.drawRect( 0,0,100,100);
16 shp.graphics.endFill();
17 shp.width = 100;
18 shp.height = 100;
19 this.addChild( shp );

20 //检测shp这个矢量图,与点(10,10)是否有交集
21 var isHit:boolean = shp.hitTestPoint( 10, 10 );
//更新infoText的值
22 this.infoText.text = "碰撞结果" + isHit;
23
24 }

25 //定义一个变量infoText,用来显示文本信息
26 private infoText:egret.TextField;
27 private drawText()
28 {
29 this.infoText = new egret.TextField();
30 this.infoText.y = 200;
31 this.infoText.text = "碰撞结果";
32 this.addChild( this.infoText );
33 }

第二种检测方法:但如果我们想更加精确的检测图像是否与一个点发生了碰撞,我们需要将第三个参数设置为 true。
shp.hitTestPoint( 10, 10 );

1 var shp:egret.Shape = new egret.Shape();
2 shp.graphics.beginFill( 0xff0000 );
3 shp.graphics.drawRect( 0,0,100,100);
4 shp.graphics.endFill();
5 shp.width = 100;
6 shp.height = 100;
7 this.addChild( shp );
8
9 var isHit:boolean = shp.hitTestPoint( 10, 10, true );
10 this.infoText.text = "碰撞结果" + isHit;


我们稍微修改一下代码,将原来宽高为100的正方形修改为一个半径为20的圆形。代码如下:

1 var shp:egret.Shape = new egret.Shape();
2 shp.graphics.beginFill( 0xff0000 );
3 shp.graphics.drawCircle( 0, 0, 20);//注意坐标,可见区域只有四分之一圆
4 shp.graphics.endFill();
5 shp.width = 100; //有什么用呢
6 shp.height = 100;//有什么用呢
7 this.addChild( shp );
8
9 var isHit:boolean = shp.hitTestPoint( 25, 25, true );
10 this.infoText.text = "碰撞结果" + isHit;


5,创建自己的显示对象类
自定义显示对象类需要继承自DisplayObject的具体子类,例如Shape或者TextField。

下面我们来创建一个自己的显示对象。我们把这个显示对象称之为 MyGrid 。

创建一个名称为 MyGrid 的类,并且继承自 Shape 。具体代码如下:

1 class MyGrid extends egret.Shape
2 {
3 public constructor()
4 {
5 super();
6 this.drawGrid();
7 }
8
9 private drawGrid()
10 {
11 this.graphics.beginFill( 0x0000ff );
12 this.graphics.drawRect( 0, 0, 50,50 ); //矩形1
13 this.graphics.drawRect( 50, 50, 50, 50);//矩形4
14 this.graphics.beginFill( 0xff0000 );
15 this.graphics.drawRect( 50, 0, 50,50 );//矩形2
16 this.graphics.drawRect( 0, 50, 50,50 );//矩形3
17 this.graphics.endFill();
18 }
19 }
在 MyGrid 我们绘制了一个红蓝相间的2*2格子,然后我们创建一个新的文档类,名称为 GridMain ,在文档类中创建并显示我们的 MyGrid,具体代码如下:

1 class GridMain extends egret.DisplayObjectContainer
2 {
3 public constructor()
4 {
5 super();
6 this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
7 }
8
9 private onAddToStage(event:egret.Event)
10 {
11 var _myGrid:MyGrid = new MyGrid();
12 this.addChild( _myGrid );
13 }
14 }
编写保存后,在 egretProperties.json 文件中将文档类改为 GridMain,编译并测试,你会在浏览器中看到如下图效果。


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
[img]http://dl2.iteye.com/upload/attachment/0109/0668/fb266dfa-95ca-3d09-b41e-5f04a19ba9a1.png[/img]
好的,以下是你所需的Java代码: ``` public class TestPerson { public static void main(String[] args) { Person person = new Person("John"); Student student = new Student("Jack", "CS"); Employee employee = new Employee("Tom", "Google"); m1(person); m2(student); m3(employee); Person studentAsPerson = new Student("Alice", "Math"); Person employeeAsPerson = new Employee("Bob", "Facebook"); m1(studentAsPerson); m2(employeeAsPerson); m3(studentAsPerson); m3(employeeAsPerson); } public static void m1(Person p) { System.out.println(p.getName()); } public static void m2(Person p) { System.out.println(p.toString()); } public static void m3(Person p) { if (p instanceof Student) { ((Student) p).displayObject(); } else if (p instanceof Employee) { ((Employee) p).displayObject(); } } } class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } public String toString() { return "Person " + name; } } class Student extends Person { private String major; public Student(String name, String major) { super(name); this.major = major; } public void displayObject() { System.out.println("Student " + getName() + ", Major: " + major); } public String toString() { return "Student " + getName() + ", Major: " + major; } } class Employee extends Person { private String company; public Employee(String name, String company) { super(name); this.company = company; } public void displayObject() { System.out.println("Employee " + getName() + ", Company: " + company); } public String toString() { return "Employee " + getName() + ", Company: " + company; } } ``` 在这个代码中,我们创建了一个`TestPerson`类,其中包含了4个方法和3个类。我们在`main`方法中创建了`Person`、`Student`和`Employee`的实例,并将它们均声明为`Person`类对象,然后分别传入了`m1`、`m2`和`m3`方法,体会了多态。 `m1`方法接受一个`Person`对象,并显示它的姓名。`m2`方法接受一个`Person`对象,并打印它的`toString`方法返回的字符串。`m3`方法接受一个`Person`对象,并如果它是`Student`类或者`Employee`类的实例,分别调用它们的`displayObject`方法。 `Person`、`Student`和`Employee`都是类,其中`Student`和`Employee`都继承自`Person`,并且它们都有`displayObject`和`toString`方法。`displayObject`方法在子类中被重写,以便我们可以使用多态来调用它们。`toString`方法也在子类中被重写,以便我们可以使用多态来打印它们的字符串表示形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值