在C中复制旋转动画效果

时间:2010-12-01 12:37:45

标签: c animation arm

我想复制Spinrite在屏幕右上角显示的微调器效果,表明它仍在运行且尚未冻结。您可以在2:18 - http://youtu.be/XRmDwVj5CRM

看到此示例

我们可以讨论Spinrite的功效,直到奶牛回家,但不可否认的是,考虑到它的运行情况,它有一个不错的用户界面。

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

那里有一些老技术,但看起来像Gibson已经更新了他的UI。我记得他的旋转器是/ \ | - 字符......但我离题了。 :)

这是在文本模式下,很可能通过在DOS中挂钩定时器中断并绘制定时器的每个其他节拍来完成。

标准的DOS计时器大约每隔55毫秒勾选一次。

您可以使用高飞扩展DOS字符集写入指针0xA0000,直接在X86上的DOS中绘制屏幕。

(请注意,这是来自OLD内存,自从我做了这些东西以来已有15年多了:) 换句话说,要在屏幕的第一行/列上绘制字母“A”,您需要执行以下操作。

    char *screen = 0xA0000;
    *screen = 'A';

为了更高级,(没有错误或边界检查。)

#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;
}

考虑到上述情况,您必须弄清楚这些东西如何在您的ARM系统上运行并复制它。看一下针对ARM的ncurses或Borlands conio系统的端口可能会给你一个良好的开端。我知道Borland的Turbo Vision库有一个到Linux的端口,但我不确定它是否已经移植到ARM。如果您有兴趣,这里是sourceforge页面的link。 Turbo Vision在当时是一个很好的文本模式GUI,值得它。

希望这有帮助。

答案 1 :(得分:0)

我已经很久没有在ARM平台上工作了。曾经有阿基米德。

我似乎无法对这个问题发表评论,所以我会在这里要求澄清:

你在为动画的图形使用什么?我的意思是动画GIF,一组位图文件,或者每次从头开始绘图,还有什么?

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

我不知道您正在使用什么UI库或其他任何东西,但我曾经做过的大部分工作都有一种方法可以在事件队列上进行poll()。每次poll()返回时,计算自上次重新绘制动画以来经过的时间,如果它足够大,则执行下一帧。如果没有,则减少poll()超时,这样就不会在poll()中阻塞太长时间。

或者,有时您可以让操作系统将定时事件推送到事件队列中。每次从事件队列中读取一帧时重绘一帧。这可能特别有用,因为如果事件处理事件的速度很慢并且开始得到积压,则动画速度会减慢。即当应用程序挣扎并挣扎时,微调器将正常旋转全速,缓慢旋转,并在应用程序挂起时停止。

这是您正在寻找的那种信息吗?

至于增加动画的步数,我相信你不会谈论类似的事情:

int step = 0;

...

step = (step + 1) % max_steps;