微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > LabWindows/CVI虚拟仪器设计技术场景与游戏设计之: 下雪场景

LabWindows/CVI虚拟仪器设计技术场景与游戏设计之: 下雪场景

时间:11-13 来源:3721RD 点击:

4.3 下雪场景

4.3.1 下雪场景设计方法

动画场景(背景)在动画以及游戏设计中起到烘托角色和渲染气氛的作用。动画场景分为场景和背景两部分,场景是角色可以穿行其中的活动场面或自然景观;背景是起烘托和渲染作用的角色背后的景色。场景是动画设计过程当中不可缺少的一部分,在某种意义上,场景可以决定整个动画及游戏的风格。场景设计所涉及的面很广,要找到场景与整体风格的切入点,达到情节的和谐统一。

动画场景的创意设计与其他创意设计有相似的过程和方法。在创意前要做周密的设计和准备,即使创意不同凡响,也要使创意循着一个确定目标去发展。动画场景的创意设计是整个动画创意的一部分,应以整体效果为最终目标来思考和把握。实际上,动画场景设计的所有创意要建立在理解动画情境的基础上,动画设计师应不断与程序设计者在整体构思上保持一致,保证创意的完整性和协调性。

从时间上讲,场景艺术也就是时间艺术,在心理空间中营造物理空间的虚拟造型和概念,根据动画及游戏来调节场景的大小、高度等。而动画场景的运动性是建立在时间和空间的基础上的,空间中的角色和物体由于速度的变化而引起的位移和变形,设计者可以充分发挥想象的空间,制造出高水平的视觉效果。

在LabWindows/CVI 程序开发中,场景制作无疑是一个非常重要的环节,对于一些注重细节的用户来说,美观的界面,动态的效果无疑能大大提高软件的亲和力。对于下雪场景大家都不会陌生,用程序代码来控制雪花的下落与堆积也是比较有意思的,其原理并不复杂。先将背景设置为黑色,随机画出许多白点(雪花),然后使这些雪花不断地向下移动,并在底部形成堆积效果,随时间的流失逐渐融化,循环往复,一个下雪场景就完成了。

4.3.2 下雪场景程序设计

(1)面板设计

编写一个下雪场景效果程序,背景设置为黑色,随机产生白色的雪花,随时间的流失不断下落,堆积到地上,雪层不断加厚,但雪层也会随之部分融化,产生一种比较逼真的效果。背景采用Canvas 控件,雪花由CanvasDrawPoint 函数实现,雪花下落由异步定时器控制。面板设计如图4-7 所示,面板中主要控件属性设置如表4-5 所示。

图4-7 下雪场景面板

表4-5 控件属性设置表

常量名

控件类型

控件的主要属性

PANEL

Panel

标题:下雪场景回调函数:PanelCB

CANVAS

Canvas

( 下雪场景背景)

(2)程序源代码

//头文件声明
#include "toolbox.h"
#include "asynctmr.h"
#include <utility.h>
#include <ansi_c.h>
#include "下雪场景.h"
//全局静态变量
static int TimerID;
static int panelHandle;
static int Snow[1000][3];
static int PWidth;
static int PHeight;
//声明异步定时器
int CVICALLBACK timer (int reserved, int timerId, int event, void *callbackData, int eventData1, int eventData2);
//主函数
int main (int argc, char *argv[])
{
int i;
if (InitCVIRTE (0, argv, 0) == 0)
return –1;
if ((panelHandle = LoadPanel (0, " 下雪场景.uir", PANEL)) < 0)
return –1;
SetCtrlAttribute (panelHandle, PANEL_CANVAS, ATTR_PEN_COLOR, VAL_WHITE);
SetCtrlAttribute (panelHandle, PANEL_CANVAS, ATTR_PEN_WIDTH, 1);
GetPanelAttribute (panelHandle, ATTR_HEIGHT, &PHeight);
GetPanelAttribute (panelHandle, ATTR_WIDTH, &PWidth);
//用当前时间产生随机数
SetRandomSeed (0);
//随机产生雪花
for (i = 0; i < 1000; i ++)
{
Snow[i][0] = (int) (Random(0, 1) * PWidth);
Snow[i][1] = (int) (Random(0, 1) * PHeight);
Snow[i][2] = 10 + (Random(0, 1) * 5);
}
//装载异步定时器
TimerID = NewAsyncTimer (0.2, –1, 1, timer, 0);
DisplayPanel (panelHandle);
RunUserInterface ();
//释放异步定时器资源
DiscardAsyncTimer (TimerID);
DiscardPanel (panelHandle);
return 0;
}
//面板回调函数
int CVICALLBACK PanelCB (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_CLOSE:
// 停止异步定时器
SuspendAsyncTimerCallbacks ();
// 延时0.2s
Delay (0.2);
QuitUserInterface (0);
break;
}
return 0;
}
//异步定时器--绘制下雪场景
int CVICALLBACK timer (int reserved, int timerId, int event, void *callbackData, int eventData1, int eventData2)
{
int i;
static int OldX;
static int OldY;
static int colory;
static int RGBValue;
switch (event)
{
case EVENT_TIMER_TICK:
// 禁止弹出运行时错误对话框
DisableBreakOnLibraryErrors ();
for (i = 0; i < 1000; i ++)
{
OldX = Snow[i][0];
OldY = Snow[i][1];
Snow[i][1] = Snow[i][1] + Snow[i][2];
if (Snow[i][1] > PHeight)
{
Snow[i][1] = 0;
Snow[i][2] = 5 + ((double)rand () / RAND_MAX * 50);
Snow[i][0] = (double)rand () / RAND_MAX * PWidth;
OldX = 0;
OldY = 0;
}
SetCtrlAttribute (panelHandle, PANEL_CANVAS, ATTR_PEN_COLOR, VAL_BLACK);
// 绘制雪花点
CanvasDrawPoint (panelHandle, PANEL_CANVAS, MakePoint (OldX, OldY));
// 设置雪花灰度渐变色阶
colory = 8 * (Snow[i][2] -10);
colory = 60 + colory;
RGBValue = MakeColor (colory, colory, colory);
SetCtrlAttribute (panelHandle, PANEL_CANVAS, ATTR_PEN_COLOR, RGBValue);
CanvasDrawPoint (panelHandle, PANEL_CANVAS, MakePoint (Snow[i][0], Snow[i][1]));
}
break;
}
return 0;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top