Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中复制Spinrite动画效果_C_Animation_Arm - Fatal编程技术网

在C中复制Spinrite动画效果

在C中复制Spinrite动画效果,c,animation,arm,C,Animation,Arm,我想复制Spinrite在屏幕右上角显示的微调器效果,以表明它仍在运行且未冻结。你可以在2:18看到一个例子- 在奶牛回家之前,我们可以讨论Spinrite的功效,但不可否认,考虑到它的运行情况,它有一个不错的UI 我将在ARM平台上复制C中的效果,但我寻求的是一般性建议,而不是代码,例如如何增加动画的步骤 提前感谢。我很久没有在ARM平台上工作了。过去有一个阿基米德 我似乎无法对这个问题发表评论,因此我将在这里要求澄清: 您在动画的图形中使用了什么?我的意思是动画GIF,一组位图文件,或者每次

我想复制Spinrite在屏幕右上角显示的微调器效果,以表明它仍在运行且未冻结。你可以在2:18看到一个例子-

在奶牛回家之前,我们可以讨论Spinrite的功效,但不可否认,考虑到它的运行情况,它有一个不错的UI

我将在ARM平台上复制C中的效果,但我寻求的是一般性建议,而不是代码,例如如何增加动画的步骤


提前感谢。

我很久没有在ARM平台上工作了。过去有一个阿基米德

我似乎无法对这个问题发表评论,因此我将在这里要求澄清:

您在动画的图形中使用了什么?我的意思是动画GIF,一组位图文件,或者每次都从头开始画画,还有别的吗

我相信在ARM上你可以设置一个定时器中断回调。但是,即使应用程序本身已冻结,也可能会调用该函数,从而错误地导致用户相信它正在工作

我不知道您使用的是什么UI库或任何东西,但我所研究过的大多数UI库都有一种在事件队列上轮询()的方法。每次poll()返回时,计算自上次重绘动画以来经过的时间,如果它足够大,则执行下一帧。如果没有,则减少poll()超时,这样就不会在poll()中阻塞太长时间

或者,有时您可以让操作系统将定时事件推送到事件队列上。每次从事件队列中读取一个帧时,都会重新绘制一个帧。这可能特别有用,因为如果事件处理事件的速度较慢,并且开始出现积压,则动画速度会减慢。也就是说,旋转器将正常全速旋转,在应用程序颠簸和挣扎时缓慢旋转,在应用程序挂起时停止旋转

这就是你要找的信息吗

至于增加动画的步骤,我相信你不是在谈论类似于:

int step = 0;

...

step = (step + 1) % max_steps;

这是一些老技术,但看起来吉布森已经更新了他的用户界面。我记得他的旋转器是/\\|角色。。。但我离题了。:)

这是在文本模式下,最有可能通过挂接DOS中的计时器中断并每隔一次画一次计时器的记号来完成

标准的DOS定时器大约每55毫秒发出一次滴答声

通过使用goofy extended DOS字符集写入指针0xA0000,可以在X86上的DOS中直接绘制屏幕

(请注意,这是我的老记忆,我已经15年多没有做过这些事情了:) 换句话说,要在屏幕的第一行/第一列绘制字母“A”,您需要执行以下操作

char *screen = 0xA0000; *screen = 'A'; 字符*屏幕=0xA0000; *屏幕='A'; 更高级一点,(无错误或边界检查)

#定义第80列 #定义第25行 #定义VIDMEM_基准0xA0000 //行和列是基于1的 //请注意,在实际实现中,您将确保行/列在屏幕边界内 //如果您在最后一行,您可能会向上滚动屏幕等。 void writeScreen(字符、大小行、大小列) { char*screenBase=VIDMEM_BASE; screenBase+=((第1行)*列)+第1列; *screenBase=色卡; } 考虑到以上内容,您必须弄清楚这些东西在您的ARM系统上是如何工作的,并进行复制。为手臂寻找一个港口的ncurses或Borlands的conio系统可能会给你一个良好的开端。我知道Borland的Turbo Vision库有一个移植到Linux的端口,但我不确定它是否曾经移植到ARM。如果您感兴趣,这里有一个到sourceforge页面的链接。turbovision在它的时代是一个很好的文本模式GUI,这是值得的

希望这有帮助

#define COLUMNS 80 #define ROWS 25 #define VIDMEM_BASE 0xA0000 // Row and column are 1 based // Note that in a real implementation you would make sure row/column are within the screen bounds // and if you were on the last row, you might scroll the screen up etc. void writeScreen( char theChar, size_t row, size_t column ) { char *screenBase = VIDMEM_BASE; screenBase += ((row - 1) * COLUMNS) + column - 1; *screenBase = theChar; }