网络游戏开发-客户端3(封装按钮按下效果和一个模态对话框)

简介: 网络游戏开发-客户端3(封装按钮按下效果和一个模态对话框)

因为本项目使用的是EUI,EUI提供了一个Panel和Button控件,我大致看了一下Panel控件,感觉不太喜欢。我个人更喜欢模态框的那种风格,可能是因为我本质工作是做web开发的吧。。。

EButton控件的封装

EUI控件里面的Button给按钮提供了三种状态,填充三种资源进去就可以使用按钮的不同形态

因为我们选择Egret引擎,就是想以后发布到微信小程序,Facebook小游戏等平台,所以,我们能少用图片就少用图片。打算按钮的按下效果使用纯代码来改变按钮大小来实现。

新建一个名为EButton的ts文件

class EButton extends eui.Button implements eui.UIComponent {
    w: number;
    h: number;
    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE, () => {
            this.w = this.width;
            this.h = this.height;
            this.addEventListener(egret.TouchEvent.TOUCH_BEGIN, () => {
                this.width -= 5;
                this.height -= 5;
            }, this)
            this.addEventListener(egret.TouchEvent.TOUCH_END, () => {
                this.width = this.w;
                this.height = this.h;
            }, this)
            this.addEventListener(egret.TouchEvent.TOUCH_CANCEL, () => {
                this.width = this.w;
                this.height = this.h;
            }, this)
            this.addEventListener(egret.TouchEvent.TOUCH_RELEASE_OUTSIDE, () => {
                this.width = this.w;
                this.height = this.h;
            }, this)
        }, this)
    }
    protected partAdded(partName: string, instance: any): void {
        super.partAdded(partName, instance);
    }
    protected childrenCreated(): void {
        super.childrenCreated();
    }
}

ADDED_TO_STAGE事件里面首先记录下当前控件的默认宽高,然后分别再touch事件的begin里面,缩小或者放大当前按钮的宽高,我这里选择的是缩小。然后分别在TOUCH_END,TOUCH_CANCEL,TOUCH_RELEASE_OUTSIDE三个事件里面把宽高还原。这样就会点击的时候,有一个按下的效果,然后抬起手来的时候,按钮又恢复的原状。

如果写的正确的话,把Egret wing切换到设计师视图,就会看到在自定义的控件位置,会显示出自定义的控件。然后拖出来就可以使用了

 

Dialog的封装

看起来来是一个模态对话框,但是实际上是一个半透明的效果的背景+一个对话框的图片实现。使用半透明背景图这样就能通过半透明的图片看到后面的容器。给人一种视觉上的对话框。。。

半透明背景不一定要用一整张,可以切一个像素的半透明图片,然后通过Image控件的Repeat模式,平铺这个图片。以达到节约内存和网络带宽的目的。

<?xml version="1.0" encoding="utf-8"?>
<e:Skin class="DialogOk" width="1224" height="720" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing" xmlns:ns1="*">
    <e:Image id="img_dialog_outer" top="0" bottom="0" left="0" right="0" source="dialog_bg_png" fillMode="repeat" />
    <e:Group width="666.66" height="446.97" anchorOffsetX="0" anchorOffsetY="0" horizontalCenter="0" verticalCenter="0">
        <e:Image top="0" bottom="-137.02999999999997" left="0" right="-0.34000000000003183" source="dialog_panel_png"  anchorOffsetY="0" scale9Grid="28,82,518,270"/>
        <e:Scroller width="564" height="188" x="49.33" y="99" anchorOffsetX="0" anchorOffsetY="0">
            <e:Group>
                <e:Label id="lb_dialog_text" text="今天是个好日子,今天血战到天亮今天是个好日子,今天血战到天亮" fontFamily="Microsoft YaHei" anchorOffsetX="0" anchorOffsetY="0" multiline="true" wordWrap="true" lineSpacing="10" left="0" right="0" top="0" bottom="0"/>
            </e:Group>
        </e:Scroller>
        <ns1:EButton y="340" horizontalCenter="0">
            <ns1:skinName>
                <e:Skin states="up,down,disabled">
                <e:Image width="100%" height="100%" source="dialog_zhunbei_png"/>
                <e:Label id="labelDisplay" horizontalCenter="0" verticalCenter="0"/>
                </e:Skin>
            </ns1:skinName>
        </ns1:EButton>
        <ns1:EButton id="btn_dialog_cancel" x="621.32" y="-10.66" anchorOffsetY="0" height="55" width="55">
            <ns1:skinName>
                <e:Skin states="up,down,disabled">
                <e:Image width="100%" height="100%" source="dialog_cancel_png"/>
                <e:Label id="labelDisplay" horizontalCenter="0" verticalCenter="0"/>
                </e:Skin>
            </ns1:skinName>
        </ns1:EButton>
    </e:Group>
</e:Skin>


大致煜预览效果就是这样,具体的布局方式,可以参考一下Egret的官方文档。(不得不说Egret的文档写的真是的好。基本直接读文档就能看懂。不懂的问题去论坛发帖。基本都能得到官方的回答----此处广告五毛,请Egret官方的的大佬们记得打给我)

既然是对话,那么我们就要把相应的事件都处理了。
比如点击上面的叉叉。关闭当前对话框。触摸旁边的半透明遮罩层,也关闭掉当前对话框。当然这些就得自己写代码实现了
class Dialog extends eui.Component implements eui.UIComponent {
    public constructor() {
        super();
        this.skinName = "resource/GameSkin/Common/DialogOk.exml";
        this.addEventListener(egret.Event.ADDED_TO_STAGE, () => {
            this.width = this.stage.stageWidth;
            this.height = this.stage.stageHeight;
        }, this)
    }
    protected partAdded(partName: string, instance: any): void {
        super.partAdded(partName, instance);
    }
    img_dialog_outer: eui.Image;
    btn_dialog_cancel: eui.Button;
    protected childrenCreated(): void {
        super.childrenCreated();
        this.img_dialog_outer.addEventListener(egret.TouchEvent.TOUCH_TAP, () => {
            this.Close();
        }, this)
        this.btn_dialog_cancel.addEventListener(egret.TouchEvent.TOUCH_TAP, () => {
            this.Close();
        }, this)
    }
    public Show(view: egret.DisplayObjectContainer) {
        if (!view.contains(this)) {
            view.addChild(this);
        }
    }
    public Close() {
        if (this.parent != null)
            this.parent.removeChild(this);
    }
}

最后使用

let dialog = new Dialog();
                dialog.Show(this);

看些GIF效果。。

源码地址:

https://gitee.com/QingChengCoder/EQipai

目录
相关文章
|
7天前
【计算机网络】第三章 数据链路层(概述 封装成桢 差错检错)
【计算机网络】第三章 数据链路层(概述 封装成桢 差错检错)
14 0
|
24天前
|
网络协议 安全 网络安全
Python网络编程详解:Socket套接字的使用与开发
探索Python网络编程:本文详述Socket套接字,关键组件用于设备间通信。理解Socket类型(TCP/UDP),学习创建、绑定、监听、发送/接收数据步骤。示例展示服务端和客户端实现,及Socket聊天室应用。了解并发处理、错误处理和网络安全。通过学习,提升网络应用开发技能。参考书籍深入学习。
124 2
|
2月前
|
机器学习/深度学习 自然语言处理 数据处理
大模型开发:描述长短期记忆网络(LSTM)和它们在序列数据上的应用。
LSTM,一种RNN变体,设计用于解决RNN处理长期依赖的难题。其核心在于门控机制(输入、遗忘、输出门)和长期记忆单元(细胞状态),能有效捕捉序列数据的长期依赖,广泛应用于语言模型、机器翻译等领域。然而,LSTM也存在计算复杂度高、解释性差和数据依赖性强等问题,需要通过优化和增强策略来改进。
|
2月前
|
机器学习/深度学习
大模型开发:解释卷积神经网络(CNN)是如何在图像识别任务中工作的。
**CNN图像识别摘要:** CNN通过卷积层提取图像局部特征,池化层减小尺寸并保持关键信息,全连接层整合特征,最后用Softmax等分类器进行识别。自动学习与空间处理能力使其在图像识别中表现出色。
24 2
|
2月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
38 8
C++ Qt开发:QTcpSocket网络通信组件
|
2天前
|
机器学习/深度学习 安全 网络安全
数字堡垒的构筑者:网络安全与信息安全的深层剖析构建高效微服务架构:后端开发的新趋势
【4月更文挑战第30天】在信息技术高速发展的今天,构建坚不可摧的数字堡垒已成为个人、企业乃至国家安全的重要组成部分。本文深入探讨网络安全漏洞的本质、加密技术的进展以及提升安全意识的必要性,旨在为读者提供全面的网络安全与信息安全知识框架。通过对网络攻防技术的解析和案例研究,我们揭示了防御策略的关键点,并强调了持续教育在塑造安全文化中的作用。
|
2天前
|
存储 XML 前端开发
【Flutter前端技术开发专栏】Flutter中的网络请求与数据处理
【4月更文挑战第30天】本文介绍了Flutter开发中的网络请求和数据处理。 Flutter开发者可选择http(官方库)或dio(功能更强大)进行网络请求。http库简单易用,dio支持更多功能如拦截器。数据处理涉及JSON和XML解析,数据存储可选SharedPreferences或Hive,数据传递推荐使用InheritedWidget或Provider状态管理库。了解这些知识点能提升Flutter开发效率。
【Flutter前端技术开发专栏】Flutter中的网络请求与数据处理
|
2天前
|
JSON 数据处理 Swift
【Swift 开发专栏】Swift 中的网络编程:URLSession 与 Alamofire
【4月更文挑战第30天】本文探讨了Swift中的网络编程,重点关注URLSession和Alamofire。URLSession是苹果提供的网络请求框架,允许底层控制和定制,适合需要高度灵活性的场景。Alamofire则是在URLSession基础上的第三方库,提供简洁接口和功能扩展,简化网络请求和错误处理。文中还介绍了两者在实际应用中的选择和使用场景,强调掌握网络编程基础的重要性。
|
4天前
|
机器学习/深度学习 算法 TensorFlow
TensorFlow 2keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
TensorFlow 2keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
|
5天前
|
网络协议 Linux iOS开发