Unity3d GUI 简单用户图形界面设计

Unity3d GUI 简单用户图形界面设计
Unity3d GUI 简单用户图形界面设计

Unity2d 飞机大战项目讲授

一、游戏场景

游戏场景我们采用2D的界面,如图,我们创建一个蓝天白云的平面场景,该场景垂直于摄像机并采取正交投影方式。如果对在Unity3D中创建2D场景尚存在疑惑的朋友可以参考文章《[Unity3D]Unity3D游戏开发之《经典打砖块》游戏的实现》和《Unity3D游戏开发之使用Unity3D开发2D游戏(一)》两篇文章。

我们这里在场景中添加GUIText对象来显示玩家得分等基本信息,脚本定义如下:

using UnityEngine;

using System.Collections;

public class GameManager : MonoBehaviour {

//玩家得分

private Transform Grade;

//玩家生命

private Transform HP;

//游戏结束

private Transform Text;

//玩家

private GameObject Player;

void Start ()

{

//初始化界面

Grade=transform.Find("Grade");

HP=transform.Find("HP");

Text=transform.Find("Text");

Text.guiText.enabled=false;

//获取玩家对象

Player=GameObject.Find("Player");

}

void Update ()

{

if(Player!=null)

{

//更新UI

Grade.guiText.text="得分:"+Player.GetComponent(). Grade.ToString();

HP.guiText.text="生命:"+Player.GetComponent().Max HP.ToString();

}

if(HP.guiText.text=="生命:0")

{

Text.guiText.enabled=true;

//立即复活

if(Input.GetKey(KeyCode.Y))

{

Application.LoadLevel("Main");

}

//退出

if(Input.GetKey(KeyCode.N))

{

Application.Quit();

}

}

}

}

二、玩家飞机

玩家飞机的创建和背景的创建时相同的,这里我们不再多说。玩家飞机需要完成移动、发射、碰撞的事件处理。为此我们编写下面的脚本:

using UnityEngine;

using System.Collections;

public class Player : MonoBehaviour {

//飞机的移动速度

public float MoveSpeed;

//飞机的最大生命值

public int MaxHP=100;

//定义子弹对象

public GameObject Bullet;

//定义子弹发射位置

private Transform BulletPosL;

private Transform BulletPosR;

[HideInInspector]

public int Grade=0;

void Start ()

{

BulletPosL=this.transform.Find("BulletPosL");

BulletPosR=this.transform.Find("BulletPosR");

}

void Update ()

{

if(Input.GetKey(KeyCode.A))

{

transform.Translate(Vector3.left*Time.deltaTime*(-MoveSp eed));

}

if(Input.GetKey(KeyCode.D))

{

transform.Translate(Vector3.left*Time.deltaTime* MoveSpe ed );

}

if(Input.GetKey(KeyCode.W))

{

transform.Translate(Vector3.forward*Time.deltaTime*(-Mov eSpeed));

}

if(Input.GetKey(KeyCode.S))

{

transform.Translate(Vector3.forward*Time.deltaTime*MoveS peed);

}

//按下空格键,发射子弹

if(Input.GetKey(KeyCode.Space))

{

Instantiate(Bullet,BulletPosL.transform.position,Quatern ion.Euler(new Vector3(0,1,0)));

Instantiate(Bullet,BulletPosR.transform.position,Quatern ion.identity);

}

}

#region 减血

public void Hit(int Value)

{

if(MaxHP>0)

{

MaxHP-=Value;

}else

{

Destroy(this.gameObject);

}

}

#endregion

#region 增加分数

public void Add(int Value)

{

Grade+=Value;

}

#endregion

}

在这段代码中,Bullet是我们的子弹对象,它从飞机的两个子弹发射位置BulletPosL、BulletPosR发射,向屏幕上方按照一定的速度缓缓移动,当子弹与敌人碰撞时,子弹对象将销毁,同时敌人生命值减少。Bullet对象对应于我们的一个Prefab。BulletPosL、BulletPos R对应于飞机上的两个位置。如图:

我们的子弹Bullet是一个绑定了脚本的Capsule。它的代码定义如下:

using UnityEngine;

using System.Collections;

public class Bullet : MonoBehaviour {

//定义子弹的移动速度

public float MoveSpeed=10F;

//定义子弹的销毁时间

public float DestroyTime=2.0F;

//定义子弹对敌人的伤害值

public int Damage=2;

//玩家飞机

private GameObject Player;

void Start()

{

Player=GameObject.Find("Player");

}

void Update ()

{

//移动子弹

transform.Translate(Vector3.up * MoveSpeed * Time.deltaTim e);

}

//碰撞事件捕捉

void OnTriggerEnter(Collider mCollider)

{

if(mCollider.gameObject.tag=="Enemy")

{

//敌人减血

mCollider.gameObject.GetComponent().Hit (Damage);

//我方得分

Player.GetComponent().Add(1);

//销毁子弹

Destroy(this.gameObject);

}

}

//当离开摄像机范围时触发销毁事件

void OnBecameInvisible()

{

Destroy(this.gameObject);

}

三、敌人飞机

在我们的游戏中共有三种敌机,我们先将它们制作成预设。然后通过敌机生成器不断地生成敌机。如图:

和子弹相反,我们希望敌机从屏幕上方以一定速度向下移动,当碰到玩家飞机或者子弹时,将减少生命值。为此,我们这样定义敌机的脚本:

using UnityEngine;

using System.Collections;

public class Enemy : MonoBehaviour {

//移动速度

public float MoveSpeed=1.5F;

//爆炸

public GameObject Explosion;

//最大生命值

public int MaxHP=100;

void Update ()

{

//移动飞机

transform.Translate(Vector3.forward*Time.deltaTime*MoveSpee d);

}

public void Hit(int Value)

{

//如血量不低于0,则敌人飞机掉血

if(MaxHP>0)

{

MaxHP-=Value;

}else

{

//产生爆炸效果

Instantiate(Explosion,transform.position,Quaternion.Euler(ne w Vector3(90,180,0)));

//销毁敌机

Destroy(this.gameObject);

}

}

void OnTriggerEnter(Collider mCollider)

{

//如果与玩家飞机遭遇,则双方减血

if(mCollider.gameObject.tag=="Player")

{

//敌机掉血

this.Hit(2);

//玩家飞机掉血

Transform mPlayer=mCollider.gameObject.transform.Fin d("Player");

mPlayer.GetComponent().Hit(2);

}

}

void OnBecameInvisible()

{

Destroy(this.gameObject);

}

}

接下来,我们通过敌机生成器来不断地生成敌机。敌人生成器是我们预制在游戏场景中的空游戏体,它位于游戏场景的顶部。我们将下面的脚本绑定到游戏生成器上,使其可以不断地生成敌人:

using UnityEngine;

using System.Collections;

public class SpawnEnemy : MonoBehaviour {

//定义敌人速度

public float SpawnTime=1.0f;

//定义敌人对象数组

public GameObject[] Enemys;

void Start ()

{

StartCoroutine("Spawn");

}

//通过迭代器生成敌人

IEnumerator Spawn()

{

//等待

yield return new WaitForSeconds(SpawnTime);

//克隆对象

Instantiate(Enemys[Random.Range(0,3)],new Vector3(transform.position.x * Random.Range(-1F,1F),

transform.position.y,-4),Quaternion.Euler(new Vector3(90,180,0)));

StartCoroutine("Spawn");

}

}

其中Enemys对应到我们的敌人预设,每隔一段时间,我们随机地产生一种敌人,该敌人将从屏幕上方缓缓向下移动。

四、碰撞检测

在这个游戏中,主要存在子弹与敌机的碰撞、玩家飞机与敌机的碰撞两种形式。它们分别被定义在Bullet.cs和Enemy.cs两个类文件中。

//碰撞事件捕捉

void OnTriggerEnter(Collider mCollider)

{

if(mCollider.gameObject.tag=="Enemy")

{

//敌人减血

mCollider.gameObject.GetComponent().Hit (Damage);

//我方得分

Player.GetComponent().Add(1);

//销毁子弹

Destroy(this.gameObject);

}

}

void OnTriggerEnter(Collider mCollider)

{

//如果与玩家飞机遭遇,则双方减血

if(mCollider.gameObject.tag=="Player")

{

//敌机掉血

this.Hit(2);

//玩家飞机掉血

Transform mPlayer=mCollider.gameObject.transform.Fin d("Player");

mPlayer.GetComponent().Hit(2);

}

}

五、爆炸特效

当敌机被摧毁时,将显示爆炸特效,我们这里采用一组2D贴图来实现爆炸特效,原理是改变贴图的mainTextureScale和mainTextureOffset两个属性值。我们来一起看代码:

using UnityEngine;

using System.Collections;

public class Explosion : MonoBehaviour {

//动画序列索引

private int index=0;

//声音

private AudioSource mAudio;

void Start()

{

mAudio=GetComponent();

}

void FixedUpdate ()

{

if(index<8)

{

this.renderer.sharedMaterial.mainTextureScale=new Ve ctor2(1.0F/8,1);

this.renderer.sharedMaterial.mainTextureOffset=new V ector2(index * 1.0F/8,0);

index+=1;

}else

{

mAudio.Play();

Destroy(this.gameObject);

}

}

}

其中mAudio对应到一个AudioSource组件,我们在这里指定一个爆炸的音效。同样地,我们将爆炸制作成预设,该预设对应于Enemy.cs中的Explosion。

好了,到这里今天的内容就讲解完了,我们一起来看看最终的效果吧!

希望今天的内容大家能够喜欢。学了这么长时间的Unity3D,感慨还是挺多的,很多东西你不努力去做,是永远做不好的,你不给自己压力,你不会知道自己有多优秀。本项目源代码可以从这里下载。

每日箴言:不管活到什么岁数,总有太多思索、烦恼与迷惘。一个人如果失去这些,安于现状,才是真正意义上的青春的完结。——渡边淳一

Matlab的gui界面设计实例练习

一个不错的Matlab的gui界面设计实例 %非常漂亮的日历, function CalendarTable; % calendar 日历 % Example: % CalendarTable; S=datestr(now); [y,m,d]=datevec(S); % d is day % m is month % y is year DD={'Sun','Mon','Tue','Wed','Thu','Fri','Sat'}; close all figure; for k=1:7; uicontrol(gcf,'style','text',... 'unit','normalized','position',[0.02+k*0.1,0.55,0.08,0.06],... 'BackgroundColor',0.6*[1,1,1],'ForegroundColor','b',... 'String',DD(k),'fontsize',16,'fontname','times new roman'); end h=1; ss='b'; qq=eomday(y,m); for k=1:qq; n=datenum(y,m,k); [da,w] = weekday(n); if k==d; ss='r'; end uicontrol(gcf,'style','push',... 'unit','normalized','position',[0.02+da*0.1,0.55-h*0.08,0.08,0.06],... 'BackgroundColor',0.6*[1,1,1],'ForegroundColor',ss,... 'String',num2str(k)); ss='b'; if da==7; h=h+1;

实验一:图形用户界面设计

实验一图形用户界面设计 一实验目的和要求 1)熟悉图形用户界面的设计原则 遵循用户友好原则、一致性原则、帮助和提示等原则设计用户界面。 2)利用一种设计工具完成图形化的用户界面设计 二实验内容与步骤 (一)实验内容 利用常用的设计工具(UI界面设计工具GUI Design Studio)完成一个通用图形用户界面设计,要遵循界面设计的一般原则(一致性、快捷方式、提供错误处理),注意颜色的使用,学会图标、按钮、屏幕布局、菜单和对话框的设计。 软件的界面如同人的脸一样,软件界面的好坏决定了用户对软件的第一印象。设计好的界面能够引导用户自己完成相应的操作,起到引导作用。设计合理的界面能给用户带来轻松愉悦的感受。一些专家指出:对于用户,人机界面就是系统本身。这充分说明了软件界面设计的重要性。请完成各自的系统用户界面的设计。 (二)实验步骤 1.设计多个对话框,完成填表输入界面的设计,合理使用图标、按钮、颜色; 2.设计不同形式的菜单,完成对不同对话框的调用; 3.提供简单的错误处理、联机帮助。 GUI Design Studio主界面

三界面示例1、登录界面 2、主界面

3、聊天界面 4、QQ空间界面

四实验总结 1.界面要具有一致性、常用操作要有快捷方式、提供简单的错误处理、对操作人员的重要操作要有信息反馈、操作可逆、设计良好的联机帮助、合理划分并高效地使用显示屏、保证信息显示方式与数据输入方式的协调一致。 2.颜色是一种有效的强化手段,同时具有美学价值。使用颜色时应注意如下几点:限制同时显示的颜色数;画面中活动对象的颜色应鲜明,而非活动对象应暗淡;尽量避免不相容的颜色放在一起,如黄与蓝,红与绿等,除非作对比时用;若用颜色表示某种信息或对象属性,要使用户理解这种表示,并尽量采用通用的表示规则。 3.图标是可视地表示实体信息的简洁、抽象的符号。图标设计是方寸艺术,需要在很小的范围内表现出图标的内涵。设计图标时应该着重考虑视觉冲击力,要使用简单的颜色,利用眼镜对色彩和网点的空间混合效果,做出精彩图标。 1)设计按钮应该具有交互性,应该有3到6种状态效果(点击时的状态、鼠标放在上面但未点击的状态、点击前鼠标未放在上面时的状态、点击后鼠标未放在上面时的状态、不能点击时的状态、独立自动变化的状态),按钮应具备简洁的图示效果,应能够让使用者产生功能上的关联反应。属于一个群组的按钮应该风格统一,功能差异大的按钮应该有所区别。 2)设计屏幕布局(Layout)时应该使各功能区重点突出,应遵循如下几条原则:平衡原则、预期原则、经济原则、顺序原则、规则化。 3)菜单在图形界面的应用程序中使用得非常普遍,是软件界面设计的一个重要组成方面,描述了一个软件的大致功能和风格。菜单中的选项在功能上与按钮相当,一般具有下列一种或几种类型的选项:命令项、菜单项和窗口项。菜单的结构一般有单一菜单、线状序列菜单、树状结构菜单、网状结构菜单等,其中树状结构菜单是最常见的结构。 设计菜单界面时应注意一般性原则:功能组织菜单,合理分类,并力求简短,前后一致;合理组织菜单界面的结构与层次;按一定的规则对菜单项进行排序;菜单选项的标题要力求文字简短、含义明确,并且最好以关键词开始;常用选项要设置快捷键;充分利用菜单选项的使能与禁止、可见与隐藏属性;使用弹出式菜单。 4)在处理大量相关数据的场合下,需要输入一系列的数据,这时填表输入界面是最理想的数据输入界面。在设计填表输入界面时应遵循的原则:一致性;有含义的表格标题;使用易于理解的指导性说明文字;栏目按逻辑分组排序;表格的组织结构和用户任务相一致;光标移动方便;出错提示;提供帮助;表格显示应美观、清楚,避免过分拥挤。

实验三图形用户界面设计(汽院含答案)

实验三图形用户界面设计 实验目的 1.掌握Java语言中GUI编程的基本方法 2.掌握Java语言中AWT组件的基本用法 3.掌握Java语言中Swing组件的基本用法 实验导读 1.通过图形用户界面(GUI:Graphics User Interface),用户和程序之间可以方便地进行 交互。 AWT(Abstract Windowing Toolkit),中文译为抽象窗口工具包,是Java提供的用来建立和设置Java的图形用户界面的基本工具。AWT由Java中的包提供,里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类,这些类又被称为组件(components)。 Swing是一个用于开发Java应用程序用户界面的开发工具包。它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。 JDK写程序所有功能都是靠虚拟机去操作本地操作系统。比如window下,就是JDK 用windows API实现功能。而awt包中很多组件是组件自身去调用本地操作系统代码swing包中的组件采用的是调用本地虚拟机方法,由虚拟机再调用本地操作系统代码。意思就是中间多了一层,这样就加强了swing包的移植性,与本地关系不那强了。 图AWT常用组件继承关系图 Container为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。 2.布局,容器中的组件的排放方式。常见的布局管理器: FlowLayout(流式布局管理器):从左到右的顺序排列。Panel默认的布局管理器。 BorderLayout(边界布局管理器):东,南,西,北,中。Frame默认的布局管理器。 GridLayout(网格布局管理器):规则的矩阵

GUI界面设计

4.2 图形用户界面的打开和初步设计 在Matlab命令行运行guide命令打开图形用户启动界面GUIDE Quick Start对话框,选择Blank GUI(Default),单击“OK”按钮,新建一个图形用户界面设计界面,如图4-1所示。 图4-1 图形用户界面的新建 根据本实验的具体要求和图形用户界面的设计原则,将主界面命名为“kaishi”,如图4-2Static Text,双击控件可引出图形窗和相应控件的属性编辑框“Property Inspector”,其属性设置为欢迎进入数字基带传输系统的仿真,字体大小可设置为16号,另外在工作区放置两个“Push Button”按钮,分别双击这两个控件可引出图形窗和相应控件的属编辑框“Property Inspector”,在String一栏中修改各个控件的名称分别为进入和关闭,字体大小可设置为16号。如图4-3示的主界面和属编辑框“Property Inspector”。

图4-2 总界面 图4-3 设置开始界面

4.3 主界面的激活和回调函数的生成 经以上操作后,工作台上所制作的界面外形及所含构件已经符合设计要求,但这个界面各构件之间的通讯还没有建立,为此必须激活处理。 激活方式为:选中其中的一个控件,如“眼图”控件,右击控件选择“View Callback”中的“callback”可出现一个可以(待填写回调指令的)M函数文件的文件编辑器界面,在待填写回调指令处填写语句figure(yantu),其余控件依此类推分别在指令处填写figure(digital),figure(digital_receive),figure(mjcr),figure(raise),figure(partrespond)其中digital,digital_receive,mjcr,raise,yantu,partrespond为显示数字基带传输过程中各过程波形的图形用户界面,这样就和其他的子界面之间建立了通信,回调函数如下填写: function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) figure(digital) 回调函数编写完成后,点击保存按钮进行保存,点击工作台上的“Activate Figure”工具图标,便可以看到链接关系,如图4-4示。 图4-4 写完成的总界面

关于uCGUI移植详解

关于uCGUI在STM32上的移植移详解 首先我们得知道啥是μC/GUI: 它是一种用于嵌入式应用的图形支持软件。它被设计用于为任何使用一个图形LCD的应用提供一个有效的不依赖于处理器和LCD 控制器的图形用户接口。它能工作于单任务或多任务的系统环境下。 μC/GUI 适用于使用任何LCD 控制和CPU 的任何尺寸的物理和虚拟显示。 它的设计是模块化的,由在不同的模块中的不同的层组成。一个层,称作LCD 驱动程序,包含了对LCD 的全部访问。因为它100%由ANSI 的C 语言编写的,μ所以C/GUI 适用于所有的CPU。 我们知道windowsXP的操作界面,是通过窗口、按钮、等来对计算机进行操作,同样,我们所讲的uC/GUI也能实现类似效果。 在网上找了些教程,但是讲述的不够详细,导致我在移植过程中遇到了很多问题,自己重头开始自己一点点移植,遇到的问题也只能靠自己解决,终于在忙活了一天后把它搞定了。希望对初次进行移植的同学能有所帮助。下面是我的吐血总结: 所需工具:1、uC/GUI v3.90 尽量找到没有修改的源码 2、一个硬件开发平台、LCD底层驱动程序,我使用的是STM32F103ZE+TFT3.2寸LCD 3、MDK开发软件(就是Keil) 4、一个编译无误的工程模板 4、uC/GUI相关的中文手册 移植步骤:

第一步:首先,得把你的LCD底层驱动写好,既在裸机下,可以正常显示。 通常只需3个底层驱动函数: LCD_SetPoint(u16 x,u16,y,int color);//设置某点,及颜色 LCD_GetPoint(u16 x,u16 y); //读取某点及颜色返回 LCD_Init(); //LCD初始化硬件函数,这里改成其他名字如LCD2_Init();防止和 uC/GUI冲突 第二步:向事先准备好的工程中加入uC/GUI文件夹,在工程设置中包含相应头文件 工程目录如下: 第三步:配置LCDConf.h、GUIConf.h、GUITouchConf.h(由于我没使用触摸功能,此配置在此不讲。) 配置LCDConf.h文件如下:LCD的设置 #ifndef LCDCONF_H #define LCDCONF_H #define LCD_XSIZE (320) //配置TFTLCD的水平分辨率 #define LCD_YSIZE (240) //配置TFTLCD的垂直分辨率 #define LCD_CONTROLLER (-1) //为什么是-1?接下来讲 #define LCD_BITSPERPIXEL (16) //每个像素的位数

图形用户界面设计

09次上机图形用户界面设计 1、(1)给程序添加注释,并执行。 建立数制转换对话框。 在左边输入一个十进制整数和2~16之间的数,单击“转换”按钮能在右边得到十进制数所对应的2~16进制字符串,单击“退出”按钮退出对话框。 hf=figure('Color',[0,1,1],'Position',[100,200,400,200],... 'Name','数制转换','NumberTitle','off','MenuBar','none'); uicontrol(hf,'Style','Text', 'Units','normalized',... 'Position',[0.05,0.8,0.45,0.1],'Horizontal','center',... 'String','输入框','Back',[0,1,1]); uicontrol(hf,'Style','Text','Position',[0.5,0.8,0.45,0.1],... 'Units','normalized','Horizontal','center',... 'String','输出框','Back',[0,1,1]); uicontrol(hf,'Style','Frame','Position',[0.04,0.33,0.45,0.45],... 'Units','normalized','Back',[1,1,0]); uicontrol(hf,'Style','Text','Position',[0.05,0.6,0.25,0.1],... 'Units','normalized','Horizontal','center',... 'String','十进制数','Back',[1,1,0]); uicontrol(hf,'Style','Text','Position',[0.05,0.4,0.25,0.1],... 'Units','normalized','Horizontal','center',... 'String','2~16进制','Back',[1,1,0]); he1=uicontrol(hf,'Style','Edit','Position',[0.25,0.6,0.2,0.1],... 'Units','normalized','Back',[0,1,0]); he2=uicontrol(hf,'Style','Edit','Position',[0.25,0.4,0.2,0.1],... 'Units','normalized','Back',[0,1,0]); uicontrol(hf,'Style','Frame','Position',[0.52,0.33,0.45,0.45],... 'Units','normalized','Back',[1,1,0]); ht=uicontrol(hf,'Style','Text','Position',[0.6,0.5,0.3,0.1],... 'Units','normalized','Horizontal','center','Back',[0,1,0]); COMM=['n=str2num(get(he1,''String''));',... 'b=str2num(get(he2,''String''));',... 'dec=trdec(n,b);','set(ht,''string'',dec);']; uicontrol(hf,'Style','Push','Position',[0.18,0.1,0.2,0.12],... 'String','转换','Units','normalized','Call',COMM); uicontrol(hf,'Style','Push','Position',[0.65,0.1,0.2,0.12],... 'String','退出','Units','normalized','Call','close(hf)'); 2、做一个带按钮的界面,当按动按钮时,在计算机声卡中播放一段音乐。(提示,找一个.wav 文件,简单起见可以在windows目录下找一个文件,将其放在当前工作目录下或搜索路径上,当按动“开始”按钮时调入该文件并播放,发声功能由sound函数完成,具体用法请查阅帮助信息)

基于STM32的uCGUI移植和优化

基于STM32的uCGUI移植和优化 移植篇 首先,我们需要准备的东西有uCGUI3.90,这个版本是大家现在用的比较多的,效率也比较高,别人都是这么评论的,至于其他版本的,我没有接触很多,所以 不能过多评论. uCGUI有三个文件夹,一个是tool,这个文件夹是用来使用一些uCgui的上位机程序,基本都是字体和模板查看之类的.在sample文件夹下面是已经别人帮你写好了很多有用的东西,像跟操作系统有关的GUI_X或者一些模板(后面我们会用到的自己定义的Demo),或者是gui配置.后面再一一详细叙说这个文件夹的功能.在Start文件夹里面,这是我们最主要的文件夹.里面就包含了uCGUI的源代码,uCGUI的作者把源代码放进vc里面进行编译了(当然,这是用标准C语言写的程序,所以我们可以放在任何C语言平台下编译而不会担心兼容性问题,这个uCGUI在这方面做的算是完美了),所以,我们可以在vc平台下写界面,然后再把代码拷进我们的下位机编译器进行编译,这样子效率就会非常高了.(像51 那时候写界面就是疯狂的一次一次的烧,真是纠结..). 然后这里放的就是uCGUI的源代码了,在GUI文件夹下面. 这则是每个文件夹的功能(参考uCGUI中文手册,https://www.360docs.net/doc/0417612884.html,翻译). 大概看一下就可以了,这个跟我们移植的关系不大,关键点是带*的可以不包含进去(待会配置会讲到.).然后其他的都要包含进去. 接着我们要把我们的文件包含进我们已经搭建好的工程,这里说明下我们的工程要求. 一般来说,我们要画一个图形,最基本的就是从点开始,从点到线,从点到面...,所以在已经建好的工程里面你要能点亮你的屏幕,能点出最基本的点,能填充出 最基本矩阵(这是uCGUI最包含的函数),反正我移植的时候涉及到的包括三个函 数,LCD_Init();LCD_Draw_Point(x,y,color),LCD_Fillcircuit(x1,x2,y1,y 2).这三个函数是必须的,后面也会说明如何把这三个函数进行填充. 当我们把文件复制进去的时候,再加上我们一开始已经创建好的工程的时候,文件结构差不多就是这个样子了,截图如下 user包括,main函数就是我们初始化和函数调用,绘图用的文件,另外那几个文件相信大家都明白了把,tft_lcd.c就是你在,没有移植uCGUI的情况下,纯液晶屏驱动,这里建议把液晶屏的API和最底层驱动(API就是画圆啊,画椭圆啊,清除屏幕之类的,底层驱动就是驱动液晶屏的管脚运作,fsmc初始化,时钟配置之类的),不过我这里也是集成在一起了,比较懒,大家别学.

图形用户界面的设计课案

人机交互基础教程 实验报告 实验题目:图形用户界面的设计 专业计算机科学与技术 学生姓名 班级学号 教师 指导单位计算机软件学院 日期

教师 评语教师签名: 年月日 成绩评定 备注

一、实验目的 (1)熟悉图形用户界面的设计原则 (2)利用一种设计工具完成图形化的用户界面设计 二、预备知识 图形用户界面又称为WIMP界面,由窗口(windows)、图标(icons)、菜单(menu)、指点设备(pointing device)四位一体,形成桌面(desktop) ,如图所示。 WIMP界面 用 户 手 眼 击键/指点 窗口、图标 菜单、文本 应用例程 图形用户界面是当前用户界面的主流,广泛应用于各档台式微机和图形工作站。图形用户界面的共同特点是以窗口管理系统为核心,使用键盘和鼠标器作为输入设备。窗口管理系统除了基于可重叠多窗口管理技术外,广泛采用的另一核心技术是事件驱动(event-driven)技术。 WIMP界面可看作是第二代人机界面,是基于图形方式的人机界面。在WIMP界面中,人被称为用户,人机通过对话进行工作。用户只能使用手这一种交互通道输入信息,通过视觉通道获取信息。在WIMP界面中,界面的输出可以为静态或动态的二维图形或图像等信息。

这种方式能同时输出不同种类的信息,用户也可以在几个工作环境中切换而不丢失几个工作之间的联系,通过菜单可以执行控制型和对话型任务。由于引入了图标、按钮和滚动条技术,大大减少键盘输入,提高了交互效率。基于鼠标和图形用户界面的交互技术极大地推动了计算机技术的普及。 (1)图形用户界面的三个重要思想 1)桌面隐喻(desktop metaphor) 指在用户界面中用人们熟悉的桌面上的图例清楚地表示计算机可以处理的能力。隐喻的表现方法:静态图标、动画、视频2)所见即所得(What You See Is What You Get,WYSIWYG) 显示的用户交互行为与应用程序最终产生的结果是一致的。 3)直接操纵(direct manipulation) 直接操纵是指可以把操作的对象、属性、关系显式地表示出来,用光笔、鼠标、触摸屏或数据手套等指点设备直接从屏幕上获取形象化命令与数据的过程。直接操纵的对象是命令、数据或是对数据的某种操作。 (2)设计图形用户界面的原则 1) 一般性原则:界面要具有一致性、常用操作要有快捷方式、提供简单的错误处理、对操作人员的重要操作要有信息反馈、操作可逆、设计良好的联机帮助、合理划分并高效地使用显示屏、保证信息显示方式与数据输入方式的协调一致 2) 颜色的使用:颜色是一种有效的强化手段,同时具有美学价

数字图像处理GUI界面设计.

目录 第一章设计任务及要求 ---------------------------------------------------------------------------------------------------------------- 1 1.1设计依据-------------------------------------------------------------------------------------------------------------------------- 1 1.2课程设计内容 ------------------------------------------------------------------------------------------------------------------- 1 1.3课程设计要求 ------------------------------------------------------------------------------------------------------------------- 1 第二章设计原理-------------------------------------------------------------------------------------------------------------------------- 2 2.1设计题目分析 ------------------------------------------------------------------------------------------------------------------- 2 2.2 设计原理------------------------------------------------------------------------------------------------------------------------- 2 第三章设计实现-------------------------------------------------------------------------------------------------------------------------- 4 3.1 菜单栏编辑---------------------------------------------------------------------------------------------------------------------- 4 3.2 控件及代码的加入 ------------------------------------------------------------------------------------------------------------ 6 3.2.2 控件按钮的创建 ------------------------------------------------------------------------------------------------------ 7 3.2.3 控件代码加入 --------------------------------------------------------------------------------------------------------- 8 3.4 图像灰度处理 ------------------------------------------------------------------------------------------------------------------ 9 3.5 亮度调节------------------------------------------------------------------------------------------------------------------------- 9 3.6 底片处理----------------------------------------------------------------------------------------------------------------------- 11 3.7 直方图均衡化 ---------------------------------------------------------------------------------------------------------------- 12 第四章结果分析及总结 -------------------------------------------------------------------------------------------------------------- 13 第五章参考文献------------------------------------------------------------------------------------------------------------------------ 14 第六章附录 ------------------------------------------------------------------------------------------------------------------------------ 15

实验九Java图形用户界面设计1

实验九Java图形用户界面设计(1) 一实验目的 (1)掌握Frame与面板的使用 (2)布局管理器的使用 (3)布局管理器的使用 (4)边界风格的使用 (5)掌握简单Java事件的处理 二实验内容 1、创建并显示一个标题为“My Frame”,背景色为白色,大小为1000×1000的框架。在该框架中放置八个按钮,按钮的标题分别为“按钮1”、……“按钮8”。采用FlowLayout布局管理器。 程序: import java.awt.*; import javax.swing.*; public class Con1{ private JFrame f; private JButton b1,b2,b3,b4,b5,b6,b7,b8; public static void main(String args[]){ Con1 c=new Con1(); c.go(); } public void go(){

f=new JFrame("My Frame"); Container con=f.getContentPane(); con.setLayout(new FlowLayout()); con.setBackground(Color.white); con.setLayout(new FlowLayout(FlowLayout.RIGHT,920,50)); b1=new JButton("按键1"); b2=new JButton("按键2"); b3=new JButton("按键3"); b4=new JButton("按键4"); b5=new JButton("按键5"); b6=new JButton("按键6"); b7=new JButton("按键7"); b8=new JButton("按键8"); con.add(b1); c on.add(b2); c on.add(b3); c on.add(b4); con.add(b5); c on.add(b6); c on.add(b7); c on.add(b8); f.setSize(1000,1000); f.setVisible(true); } } 结果:

UCOS-II ucGUI的完美移植

stm32 UCGUI 完美移植 作者:Changing发表时间:09-16 04:13分类:电子相关1 Comment 前一篇:stm32 DA 数模转换 后一篇:Stm32 SWD 下载 调试配置 UCGUI是一种嵌入式应用中的图形支持系统。它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。 它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD驱动层来包含所有对LCD的具体图形操作。UCGUI可以在任何的CPU上运行,因为它是100%的标准C代码编写的。 类似程序还有国产的一个MINIGUI (https://www.360docs.net/doc/0417612884.html,/zhcn/),MiniGUI 是一个自由软件项目。其目标是提供一个快速、稳定、跨操作系统的图形用户界面(GUI)支持系统,尤其是基于 Li nux/uClinux、eCos 以及其他传统 RTOS(如 VxWorks、ThreadX、uC/OS-II、Nucleus 等)的实时嵌入式操作系统。有机会尝试下,支持下国产,毕竟国内这样的公司不多。。 这里移植的UCGUI3.90a版本,虽然已经有更新的版本,比如UCGUI3.98、甚至4.04版本。但是目前来说只有这个版本的代码是最全的,包括了JPEG , MULTILAYER , MEMDEV ,AntiAlias等模块。一直想尝试做一个数码相册,JEPG模块自然少不了,所以移植了这个版本。 UCGUI390a 下载 整个移植过程,让LCD显示图案倒是没花多少时间,资料也比较多,但是在移植触摸屏的时候卡了好几天,然后又是 UCGUI 指针图标 移动有重影(LCD读取像素颜色函数有问题)。。。总之移植是个累人的活 首先需要保证你的LCD驱动和触摸屏驱动是有效的,如果你的LCD也是ili93xx 控制器 XPT2046控制器的触摸屏可以参考 stm32 驱动 T F T LCD stm32 驱动 触摸屏 两篇文章 UCGUI的文件数量很大,主要用到UCGUI390a/Start/Con f ig 和 UCGUI390a/Start/GUI两个文件夹下文件,不过文件数量也已经很多了 。。。 相关文件介绍如下:

ucgui做界面切换

这次在用ucgui做界面切换的时候,决定不给每个菜单界面都创建一个对话框,和网友讨论的过程中,得出两种方法,一位网友说的是STM32的存储空间足够,可以先把自己所要用到的控件全部建立好,然后根据需要去设置控件是显示还是隐藏。另一位网友认为这样有点浪费内存,采用的方法是,先建立好一个对话框,然后根据自己的需要去删除和新建控件。 之后我就选择了第二种方法,在菜单的切换中去删除和新建控件。可能是自己太菜了,第一次删除控件和新建控件就出了问题。 问题是这样的:我先创建一个对话框作为欢迎界面(两个TEXT控件和一个BUTTON控件) hWinMenu = GUI_CreateDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),_cbWelcome,0,0,0) ; 我的想法是,点击按钮后删掉按钮控件和两个TEXT控件。然后再新建4个按钮控件。 1.hButton[0] = BUTTON_CreateAsChild(30,26,115,70,hWinMenu ,GUI_ID_BUTTON1,WM_CF_SH OW); 2.hButton[1] = BUTTON_CreateAsChild(30,124,115,70,hWinMenu,GUI_ID_BUTTON2,WM_CF_S HOW); 3.hButton[2] = BUTTON_CreateAsChild(188,26,115,70,hWinMenu,GUI_ID_BUTTON3,WM_CF_S HOW); 4.hButton[3] = BUTTON_CreateAsChild(188,124,115,70,hWinMenu,GUI_ID_BUTTON4,WM_CF_S HOW); 5.BUTTON_SetBitmapEx(hButton[0],0,&bmqd,30,10); 6.BUTTON_SetBitmapEx(hButton[1],0,&bmpf,30,10); 7.BUTTON_SetBitmapEx(hButton[2],0,&bmsz,30,10); 8.BUTTON_SetBitmapEx(hButton[3],0,&bmdc,30,10); 9.BUTTON_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_BUTTON0)); 10.TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT0)); 11.TEXT_Delete(WM_GetDialogItem(hWinMenu,GUI_ID_TEXT1)); 这样写了之后的结果是,原先的控件被删除了,我所需要的4个按钮新建成功。但是此时出现了一个问题,我仿真的时候发现,我按下新建的按钮时,按键颜色虽然有变化但是回调函数里并没有收到按钮传递给父窗口的按钮按下的消息。这样我就很纳闷的总是想不出是为什么。 通过查看新建对话框函数的源代码之后有了一点发现 hWinMenu=GUI_CreateDialogBox(_aDialogCreate,GUI_COUNTOF(_aDialogCreate),_cbWelcome,0,0,0); 我是想查看一下hWinMenu是不是我之后新建按钮所需要的父窗口句柄。

实验6 图形用户界面设计

实验6. 图形用户界面设计 一、 实验目的 1. 掌握图形对象属性的基本操作; 2. 掌握菜单及对话框设计、建立控件对象的方法。 二、 实验环境 1. 计算机 2. matlab7.1 三、 实验说明 1. 正确操作,认真观察; 2. 实验学时:2学时; 3. 学会使用help ; 4. 保存整理实验结果,提交实验报告。 四、 实验内容 1.设计如教材P374 图1所示的菜单,并在此基础上增加选项:可以改变曲线的颜色,可以改变窗口背景颜色。 2.(选做)采用图形用户界面,从键盘输入参数a 、b 、n 的值,考察参数对极坐标曲线)cos(θρn b a +=的影响。 五、 实验程序及结果 1. screen=get(0,'ScreenSize'); W=screen(3);H=screen(4); figure('Color','w','Position',[0.2*H,0.2*H,0.5*W,0.3*H],... 'Name','菜单设计实验','NumberTitle','off','MenuBar','none'); hplot=uimenu(gcf,'Label','&Plot'); %定义plot 菜单项 uimenu(hplot,'Label','Sine Wave','Call',... ['t=-pi:pi/20:pi;','h0=plot(t,sin(t));',...

'set(hlr,''Enable'',''on'');',... 'set(hlg,''Enable'',''on'');',... 'set(hlb,''Enable'',''on'');']); uimenu(hplot,'Label','Cosine Wave','Call',... ['t=-pi:pi/20:pi;','h0=plot(t,cos(t));',... 'set(hlr,''Enable'',''on'');',... 'set(hlg,''Enable'',''on'');',... 'set(hlb,''Enable'',''on'');']); uimenu(hplot,'Label','&Exit','Call','close(gcf)'); hc=uimenu(gcf,'Label','&Color'); %定义Color菜单项 hw=uimenu(hc,'Label','&Window Color'); uimenu(hw,'Label','&Red','Call','set(gcf,''Color'',''r'');'); uimenu(hw,'Label','&Green','Call','set(gcf,''Color'',''g'');'); uimenu(hw,'Label','&Blue','Call','set(gcf,''Color'',''b'');'); hl=uimenu(hc,'Label','&Line Color','Separator','on'); hlr=uimenu(hl,'Label','&Red','Call',... 'set(h0,''Color'',''r'');','Enable','off'); hlg=uimenu(hl,'Label','&Green','Call',... 'set(h0,''Color'',''g'');','Enable','off'); hlb=uimenu(hl,'Label','&Blue','Call',... 'set(h0,''Color'',''b'');','Enable','off'); 2. hf=figure('menubar','none','name','图形演示',... 'numbertitle','off'); %定义图形窗口 set(gcf,'unit','normalized','posi',[0.2,0.3,0.55,0.36]); axes('posi',[0.05,0.15,0.55,0.7]); %定义坐标轴 uicontrol(gcf,'style','text','unit','normalized',... %定义静态文本'posi',[0.63,0.85,0.1,0.1],'string','参数 a',... 'horizontal','center'); uicontrol(gcf,'style','text','unit','normalized',...

ucgui液晶显示深度优化篇

UCGUI液晶显示深度优化篇 Author:wzt 2012年7月21日10:55:12 前一段进行了ucgui的移植,但是移植后续还是存在很多问题,比如液晶刷新速率慢,横竖屏切换不支持等,所以针对这些问题进行了一次彻底的优化,现在刷新能够达到20帧的速度对于50mhz的io口来说已经相当可以了。下面就进行一次彻底的剖析,看究竟是那些问题占用了宝贵的百万分之一秒: 一、速度优化篇: 1.我用的是stm32的处理器,stm32公司为了让使用者加快项目开发速度 和便于日后对整个软件部分的维护管理编写了一套标准库。这个库用 起来确实很方便也另学习简化了很多,但是它也有缺点所在:就是效 率问题。我之前用的液晶屏驱动就是基于库函数编写的,所以第一步 就是液晶驱动全部换为直接对寄存器操作,经实践确实刷新率成好几 倍的增长。这个代码比较长,这里就不贴出来的,这里仅仅指点下思 路,具体请看源代码。 代码下载地址:https://www.360docs.net/doc/0417612884.html,/icview-357489-1-1.html 2.深入液晶驱动内部:液晶屏刷新可不是像我们眼睛看到的一样瞬间整 个屏幕同时更新。实际上一个一个像素更新的:也就是说我的屏幕分 辨率是320*240就要更新320*240=76800个点。每一个点更新时都要 调用一个写数据函数。所以接下来要做的就是提高调用这个函数的速 度。有两种解决办法:使用宏定义函数或者内敛函数。我使用的是内 敛函数:如下定义: __inline void LCD_WR_DATA(u16 data) { LCD_RS_SET; LCD_CS_CLR; DATAOUT(data); LCD_WR_CLR; LCD_WR_SET; LCD_CS_SET; }可以看到和普通函数区别就在于前面增加了__inline关键字。它有什么 作用?为什么可以提高速度?下面讲解一下它是如何起作用的:假如现 在我们定义了两个函数A,函数B,函数A调用函数B:正常情况下如

Windows平台下Glade GTK开发环境的搭建

Windows平台下Glade GTK开发环境的搭建 【@.1 MVVM设计模式与Glade】做上层软件开发的程序员可能对于MVVM模式比较熟悉,这是一种经典的软件设计模式,很好的将用户界面与后台处理之间分层开,通过属性、事件绑定这种统一的'接口'将软件重新组装起来,将原本看上去很混乱很冗余的软件开发流程抽象出来,以一种统一而又合理的思想来组织软件开发。下面截自wiki的一幅图简单说明了MVVM模式的组织结构。View层提供了人机交互界面,Model层则是处理实际逻辑操作、数据操作的核心,二者之间由ViewModel层来进行协调,即绑定(Binding)View层的操作和属性,请求Model执行并得到反馈结果。MVVM模式在Windows平台下的WPF开发得到了很好的体现,而WPF开发中View层并不是用C代码,而是用XAML来描述的,这是以前的传统软件开发或是MFC 开发中所没有的。在实际使用这种WPF开发时可以用Expression Blend来进行UI设计,这个软件专门而且仅仅生成一个XAML文件用于界面描述,而底层的逻辑代码直接连到Visual Studio中进行编写。通过Blend画出的界面可以很好的释放你的创造力想象力,而其跟Visual Studio之间的无缝连接将MVVM模式演绎的淋漓尽致。因此我开始考虑有没有一种更通用的工具,不仅仅局限于Windows平台,

能在多数平台下用MVVM模式进行开发。于是我发现了Glade与GTK的配合。GTK是一个以纯C语言开发的图形库,同样适用于跨平台开发中。对于做底层开发比较多的人来说看到纯C代码比较亲切,我也一直想用纯C,而不是Visual Studio中提倡的C#,进行软件开发。单独使用GTK 非常棒,但是一个问题就在于,需要手写的代码太多了。画一个按键,按键的布局,按键的事件,这些都需要自己一行行手写,而且还得留意代码的顺序。而其中一个我觉得是很大的门槛在于,布局需要盲打,即,你只能先在脑中有个界面的想法,写好代码后才能看到界面的结果。当然对于嵌入式设计中的很多界面设计都是盲打,比如uCGUI,但是如果有一个工具能像Visual Studio之类的集成开发环境一样能画界面,再生成代码,那开发的速度将大大提升。Glade就很好的解决了这一问题。Glade很像Expression Blend的作用,它仅仅生成一个xml文件,描述了界面是怎样布局的,界面上需要绑定那些事件(Signal)。通过Glade+GTK开发的程序每次在运行时都会解析这个xml文件生成一个界面(是不是跟WPF一样~),main函数里的代码量大大减少,所需要的就是新建一个builder,解析这个xml,传给gtk中的窗口类型,再显示这个窗口,之后进入Gtk的主循环即可。但是,Glade+GTK劣势于Blend的一个关键特性是,不支持属性绑定。虽然GTK中的Glib在2.26以后就增加了

相关文档
最新文档