#include <stdioh>
struct clock {
int hour;
int minute;
int second;
};
typedef struct clock CLOCK;
/
函数功能:时、分、秒时间的更新
函数参数:无
函数返回值:无
/
void Update(CLOCK myclock) {
myclock->second++;
if (myclock->second == 60) { /若second值为60,表示已过1分钟,则 minute值加1/
myclock->second = 0;
myclock->minute++;
}
if (myclock->minute == 60){ /若minute值为60,表示已过1小时,则 hour值加1/
myclock->minute = 0;
myclock->hour++;
}
if (myclock->hour == 24) { /若hour值为24,则hour的值从0开始计时/
myclock->hour = 0;
}
}
/
函数功能:时、分、秒时间的显示
函数参数:无
函数返回值:无
/
void Display(CLOCK myclock) { /用回车符'\r'控制时、分、秒显示的位置/
printf("%2d:%2d:%2d\r", myclock->hour, myclock->minute, myclock->second);
}
/
函数功能:模拟延迟1秒的时间
函数参数:无
函数返回值:无
/
void Delay(void) {
long t;
for (t = 0; t < 290000000; t++) {
/循环体为空语句的循环,起延时作用/
}
}
int main(){
CLOCK myclock;
long i;
myclockhour = myclockminute = myclocksecond = 0; /hour,minute,second赋初值0/
for (i = 0; i < 100000; i++) { /利用循环结构,控制时钟运行的时间/
Update(&myclock); /时钟更新/
Display(&myclock); /时间显示/
Delay(); /模拟延时1秒/
}
return 0;
}
显示当前时间的时钟
为游戏对象创建层级关系
编写脚本并与对象关联
使用命名空间
使用方法更新游戏物体
按时间进行旋转
在此教程中我们编写一个简单的C#脚本来制作时钟指针动画。
要求大家已经对Unity的编辑器有了基本的了解,其实,只需用过Unity几分钟就可以开始该案例了。
很快我们就能完成以下成果。
制作时钟
不用任何Unity资源包,我们从0开始创建Unity工程。缺省的场景中有一个位于 (0, 1, -10), 朝着z轴的负方向的摄像机,为了使摄像机中显示的透视图与场景一致,选择摄像机,并在菜单中选择执行 GameObject / Align View将摄像机与当前场景对齐。
啥是 游戏物体 ?
子物体又是哈东东?
我们就简单用立方体来制作时钟的指针,为每个指针使用 GameObject/ Create Other / Cube 创建立方体。对于时针,设置其位置为 (0, 1, 0) ,三个轴上的缩放分别为 (05, 2, 05) ,对分针位置为 (0, 15, 0) ,缩放 (025, 3, 025) ,秒针的则分别是: (0, 2, 0) 和
(01,4, 01)。
创建的时钟,以及其中游戏物体间的层级关系。
制作时钟指针动画
要让时钟动起来,就得写点脚本了。在工程视图中右键,选择 Create/ C# Script 新建一个C#脚本,将其命名为 ClockAnimator。 双击打开之,将其中内容清空,从空文件开始。
首先,我们要引用Unity的命名空间,接着就是定义 ClockAnimator 类。将其定义为一个公开的类,继承自[MonoBehaviour]
using UnityEngine;
public class ClockAnimator : [MonoBehaviour]
}
神马是命名空间?
类又是啥?
关于[MonoBehaviour]类?
这样我们就创建了一个可以作为组件的最小的类。保存之,接着从 Project 窗口中把它直接拖放到 Hierarchy (层级)视图的 Clock 游戏物体上,建立其与该游戏对象的关联。当然,也可以使用 Clock 游戏物体的 Add Component 按钮。
将ClockAnimator与Clock关联
要让指针动起来,我们得使用指针组件的 Transform 对象。首先,在刚才的脚本中为每个指针添加一个 Transform 变量,并保存它。这样,这些公开变量就成为可在编辑器中被赋值的组件属性,编辑器会获得这些游戏物体的 Transform 组件,并将它们赋予这些变量,选择 Clock ,将指针对应的游戏物体赋给这些属性。
变量是什么?
using UnityEngine;
public class ClockAnimator : [MonoBehaviour]{
}
为空的ClockAnimator属性和填写属性后的ClockAnimator
下面在脚本中添加一个update方法。这是一个特殊的方法,它会在每一帧播放时调用,我们在这个方法中实现时钟指针的旋转。
using UnityEngine;
public class ClockAnimator : [MonoBehaviour]{
}
}
方法是啥?
[ Update ] 方法是否应当公开?
保存脚本,编辑器会提示组件中已经有了update方法,并在脚本组件的左侧出现一个复选框,这样我们就能禁用该脚本组件了,当然此时,还是要保持它处于可用状态。
ClockAnimator更新的显示了复选框
每个小时,时针要转动360/12度;分钟指针则是每分钟转动360/60度;而秒针是每秒旋转360/60度。为了程序中使用方便,我们把这些值定义为私有的浮点常量。
using UnityEngine;
public class ClockAnimator : [MonoBehaviour] {
}
常量有什么特殊性?
为了让时钟转动起来,每次update时,我们先得到当前系统的时间。System命名空间中的[DateTime] 结构体 可以用来存储时间,而该结构体中的静态属性Now可以返回当前时间,这样,每次update时,我们就先得到该值并将其存储到一个临时变量中。
using UnityEngine;
using System;
public class ClockAnimator : [MonoBehaviour]{
}
什么是结构体?
属性又是什么?
要让指针转动,就需要更新指针的旋转,而这可以通过设置指针的localRotation实现。使用四元数:[Quaternion]可以定义任意角度的旋转。
因为摄像机朝向是z轴,Unity使用的是左手坐标系统,因此指针应该是绕着Z轴负方向进行旋转。
using UnityEngine;
using System;
public class ClockAnimator : [MonoBehaviour] {
}
时间显示为12:44
四元数quaternion是什么?
旋转又是啥?
改进时钟的实现
很好!在游戏的运行模式中,时钟已经可以显示当前的时间了,但是使用离散的时间值让它看起来更像是一个电子钟。下面增加一个选项,实现模拟时间显示。在脚本中添加一个公开的布尔变量 analog ,用它来决定update方法中的显示方式,这样我们就能在编辑器中直接控制时钟的显示方式了,即使是在游戏运行时。
using UnityEngine;
using System;
public class ClockAnimator : [MonoBehaviour] {
}
添加了analog模式的ClockAnimator
对于模拟现实显示的选项,我们使用和之前稍稍不同的方式。这次不用[DateTime]Now,我们用[DateTime]NowTimeOfDay,这是一个时间段[TimeSpan]。返回的是自每天午夜开始到现在已经经过的小时,分钟和秒数。由于这个值是双精度数,使用时我们需要将它们转换为float类型。
类型转换的意思是
using UnityEngine;
using System;
public class ClockAnimator : [MonoBehaviour] {
}
按照模拟方式显示的时钟
现在时钟也可以按模拟方式显示了。
unitypackage PDF
原文链接:
>
如果Qt中的定时器函数执行时间太长,可能会导致界面卡顿或响应不及时。这可能是因为定时器回调函数中执行了耗时 *** 作或者因为定时器的间隔设置过短,导致频繁调用定时器回调函数。为了解决这个问题,可以采取以下措施:
1 将耗时 *** 作迁移到后台线程中执行,避免阻塞主线程。
2 调整定时器间隔,避免频繁调用定时器回调函数。如果定时器回调函数确实需要频繁执行,可以考虑适当提高定时器回调函数的优先级。
3 对定时器回调函数进行优化,在保证功能正确的前提下,尽可能减少执行时间。
4 对界面进行分析,找出可能导致卡顿的原因,进行优化。
综上所述,避免定时器回调函数执行时间过长是提高Qt应用程序运行效率、提升用户体验的重要措施之一。
程序代码如下:
#include<iostream>
#include<windowsh>
using namespace std;
class Clock{
public:
Clock(short h=0,short m=0,short s=0):h(h),m(m),s(s){
}
void displayTime();
private:
short h;
short m;
short s;
};void Clock::displayTime(){
while(true){
cout<<h<<':'<<m<<':'<<s<<" ";
Sleep(1000);
cout<<'\r';
if(!(s=++s%60))
if(!(m=++m%60))
h=++h%24;
}
} int main()
{
Clock A(23,59,55);
AdisplayTime();
return 0;
}
扩展资料:
定义一个日期类,包括年、月、日三个成员变量,显示日期的方法如下:
publicclassDemo{
publicstaticvoidmain(String[]args){
Datedate1=newDate(1994,5,22);
date1showInfo();
Datedate2=newDate();
date2year=1995;
date2month=6;
date2day=29;
date2showInfo();
}
}
//日期类:
publicclassDate{
intyear;
intmonth;
intday;
//构造方法
publicDate(intyear,intmonth,intday){
thisyear=year;
thismonth=month;
thisday=day;
}
publicDate(){
}
publicvoidshowInfo(){
Systemoutprintln(year+"年"+month+"月"+day+"日");
}
}
最详细的:
void SetIsotropic (HDC hdc, int cxClient, int cyClient)
{
SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 1000, 1000, NULL) ;
SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
}
void RotatePoint (POINT pt[], int iNum, int iAngle)
{
int i ;
POINT ptTemp ;
for (i = 0 ; i < iNum ; i++)
{
ptTempx = (int) (pt[i]x cos (TWOPI iAngle / 360) +
pt[i]y sin (TWOPI iAngle / 360)) ;
ptTempy = (int) (pt[i]y cos (TWOPI iAngle / 360) -
pt[i]x sin (TWOPI iAngle / 360)) ;
pt[i] = ptTemp ;
}
}
void DrawClock (HDC hdc)
{
int iAngle ;
POINT pt[3] ;
for (iAngle = 0 ; iAngle < 360 ; iAngle += 6)
{
pt[0]x = 0 ;
pt[0]y = 900 ;
RotatePoint (pt, 1, iAngle) ;
pt[2]x = pt[2]y = iAngle % 5 33 : 100 ;
pt[0]x -= pt[2]x / 2 ;
pt[0]y -= pt[2]y / 2 ;
pt[1]x = pt[0]x + pt[2]x ;
pt[1]y = pt[0]y + pt[2]y ;
SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
Ellipse (hdc, pt[0]x, pt[0]y, pt[1]x, pt[1]y) ;
}
}
void DrawHands (HDC hdc, SYSTEMTIME pst, BOOL fChange)
{
static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150,
0, -200, 50, 0, 0, 800, -50, 0, 0, -200,
0, 0, 0, 0, 0, 0, 0, 0, 0, 800 } ;
int i, iAngle[3] ;
POINT ptTemp[3][5] ;
iAngle[0] = (pst->wHour 30) % 360 + pst->wMinute / 2 ;
iAngle[1] = pst->wMinute 6 ;
iAngle[2] = pst->wSecond 6 ;
memcpy (ptTemp, pt, sizeof (pt)) ;
for (i = fChange 0 : 2 ; i < 3 ; i++)
{
RotatePoint (ptTemp[i], 5, iAngle[i]) ;
Polyline (hdc, ptTemp[i], 5) ;
}
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxClient, cyClient ;
static SYSTEMTIME stPrevious ;
BOOL fChange ;
HDC hdc ;
PAINTSTRUCT ps ;
SYSTEMTIME st ;
switch (message)
{
case WM_CREATE :
SetTimer (hwnd, ID_TIMER, 1000, NULL) ;
GetLocalTime (&st) ;
stPrevious = st ;
return 0 ;
case WM_SIZE :
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
case WM_TIMER :
GetLocalTime (&st) ;
fChange = stwHour != stPreviouswHour ||
stwMinute != stPreviouswMinute ;
hdc = GetDC (hwnd) ;
SetIsotropic (hdc, cxClient, cyClient) ;
SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
DrawHands (hdc, &stPrevious, fChange) ;
SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
DrawHands (hdc, &st, TRUE) ;
ReleaseDC (hwnd, hdc) ;
stPrevious = st ;
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
SetIsotropic (hdc, cxClient, cyClient) ;
DrawClock (hdc) ;
DrawHands (hdc, &stPrevious, TRUE) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY :
KillTimer (hwnd, ID_TIMER) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
以上就是关于C语言作业:结构体编程练习 在屏幕上模拟显示一个数字式时钟 源代码能给我的话+50,感谢全部的内容,包括:C语言作业:结构体编程练习 在屏幕上模拟显示一个数字式时钟 源代码能给我的话+50,感谢、Unity C#入门教程——动画时钟实现、qt定时器函数执行时间长等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)