c语言动画函数 c语言动画微课

怎么用C语言编程实现一个简单的动画

1.可以考虑用Turbo C的绘图函数(附加graphic.h库)或者用opengl+glut等来实现。 2.前者一般就是纯粹的画点画线。网上也能找到教程。3.主要说一下后者。可以导入图片,并且二维、三维动画都可以做,甚至是用来开发游戏。后者可以用vc6.0或者vs2005来开发。跨平台。参考教程: 看你的描述要做比较偏数学的东西,那你自己得弄明白如何去实现绘制算法。要实现的动画本身而搭的基本框架不会很复杂的,可能100行代码都不用。4.另外还有opencv、GDI之类的可能更适合二维图像处理库,但我自己不是很了解了,你也可以查一查用哪种绘图库比较适合你。

创新互联公司为企业级客户提高一站式互联网+设计服务,主要包括成都做网站、成都网站建设、成都外贸网站建设App定制开发重庆小程序开发、宣传片制作、LOGO设计等,帮助客户快速提升营销能力和企业形象,创新互联各部门都有经验丰富的经验,可以确保每一个作品的质量和创作周期,同时每年都有很多新员工加入,为我们带来大量新的创意。 

如何利用C语言实现动画

可以用windows.h的头文件

然后里面system("cls");

清除屏幕重新从第一行开始画

还有tc环境画图下有graphics.h头文件有画图的函数,但是vc没有,如果想在控制台

下画图,给你一段代码,直接添加你用的api函数就行了

#include windows.h

#include stdlib.h

#include conio.h

#include stdio.h

#include tchar.h

extern "C"

用C语言怎么做动画

可以用windows.h的头文件

然后里面system("cls");

清除屏幕重新从第一行开始画

还有tc环境画图下有graphics.h头文件有画图的函数,但是vc没有,如果想在控制台

下画图,给你一段代码,直接添加你用的api函数就行了

#include windows.h

#include stdlib.h

#include conio.h

#include stdio.h

#include tchar.h

extern "C"

{

WINBASEAPI HWND WINAPI GetConsoleWindow();

}

int main(int argc, char *argv[]) //主线程运行结束,辅助线程也结束。

{

HWND hwnd;

HDC hdc;

printf("There are some words in console window!\n在控制台窗口中绘图!\n");

system("Color 3D");

hwnd = GetConsoleWindow();

hdc = GetDC(hwnd);

MoveToEx(hdc,100,100,NULL);

LineTo(hdc, 200, 300);

Rectangle(hdc, 10, 30, 300, 50);

TextOut(hdc, 10, 10, _TEXT("Hello World\nYesNoConcel!"), 20);

ReleaseDC(hwnd, hdc);

getch();

printf("After drawing!\n");

return 0;

}

这个好像是只有用c++编译器,具体我也忘了,如果.c后缀不行就用cpp后缀,基本语法c和c+差不多

怎么用C语言写下雪的动画效果

#include stdio.h

#include stdlib.h

#include string.h

#include time.h

/*

* 清除屏幕的shell 命令/控制台命令,还有一些依赖平台的实现

* 如果定义了 __GNUC__ 就假定是 使用gcc 编译器,为Linux平台

*    否则 认为是 Window 平台

*/

#if defined(__GNUC__)

//下面是依赖 Linux 实现

#include unistd.h

#define sleep_ms(m) \

usleep(m * 1000)

//向上移动光标函数 Linux

static void __curup(int height)

{

int i = -1;

while (++iheight)

printf("\033[1A"); //先回到上一行  

}

#else 

// 创建等待函数 1s 60 帧 相当于 16.7ms = 1帧, 我们取16ms

// 咱么的这屏幕 推荐 1s 25帧吧 40ms

// 这里创建等待函数 以毫秒为单位 , 需要依赖操作系统实现

#include Windows.h

#define sleep_ms(m) \

Sleep(m)

//向上移动光标

static void __curup(int height)

{

COORD cr = {0,0};

// GetStdHandle(STD_OUTPUT_HANDLE) 获取屏幕对象, 设置光标

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cr);

}

#endif /*__GNUC__ 跨平台的代码都很丑陋 */

// 定义初始屏幕的宽高像素宏

#define _INT_WIDTH        (100)

#define _INT_HEIGHT        (50)

// 屏幕刷新帧的速率

#define _INT_FRATE        (40)

// 雪花飘落的速率,相对于 屏幕刷新帧 的倍数

#define _INT_VSNOW        (10)

/*

* 错误处理宏,msg必须是""括起来的字符串常量

* __FILE__        : 文件全路径

* __func__        : 函数名

* __LINE__        : 行数行

* __VA_ARGS__    : 可变参数宏,

* ##表示直接连接, 例如 a##b = ab

*/

#define cerr(msg,...) \

fprintf(stderr, "[%s:%s:%d]" msg "\n",__FILE__,__func__,__LINE__,##__VA_ARGS__);

/*

*  屏幕结构体, 具有 宽高

*  frate  : 绘制一帧的周期, 单位是 毫秒

*  width  : 屏幕的宽,基于窗口的左上角(0,0)

*  height : 屏幕的高

*  pix    : 用一维模拟二维 主要结构如下

*             0 0 0 1 0 0 1 0 1 0

*             0 1 0 1 0 1 0 1 2 0

*             . . .

*             = 0表示没像素, 1表示1个像素,2表示2个像素....

*/

struct screen {

int frate; // 也可以用 unsigned 结构

int width;

int height;

char *pix;

};

/*

* 创建一个 屏幕结构指针 返回

*

* int frate    : 绘制一帧的周期

* int width    : 屏幕宽度

* int height    : 屏幕高度

* return        : 指向屏幕结构的指针

* */

struct screen* screen_create(int frate, int width, int height);

/*

* 销毁一个 屏幕结构指针, 并为其置空

* struct screen** : 指向 屏幕结构指针的指针, 二级销毁一级的

* */

void screen_destory(struct screen** pscr);

/**

* 屏幕绘制函数,主要生成一个雪花效果

*

* struct screen* : 屏幕数据

* return          : 0表示可以绘制了,1表示图案不变

*/

int screen_draw_snow(struct screen* scr);

/**

* 屏幕绘制动画效果, 绘制雪花动画

*

* struct screen* : 屏幕结构指针

*/

void screen_flash_snow(struct screen* scr);

// 主函数,主业务在此运行

int main(int argc, char *argv[])

{

struct screen* scr = NULL;

//创建一个屏幕对象

scr = screen_create(_INT_FRATE, _INT_WIDTH, _INT_HEIGHT);

if (NULL == scr)

exit(EXIT_FAILURE);

//绘制雪花动画

screen_flash_snow(scr);

//销毁这个屏幕对象

screen_destory(scr);

return 0;

}

/*

* 创建一个 屏幕结构指针 返回

*

* int frate    : 绘制一帧的周期

* int width    : 屏幕宽度

* int height    : 屏幕高度

* return        : 指向屏幕结构的指针

* */

struct screen*

screen_create(int frate, int width, int height)

{

struct screen *scr = NULL;

if (frate0 || width = 0 || height = 0) {

cerr("[WARNING]check is frate0 || width=0 || height=0 err!");

return NULL;

}

//后面是 为 scr-pix 分配的内存 width*height

scr = malloc(sizeof(struct screen) + sizeof(char)*width*height);

if (NULL == scr) {

cerr("[FATALG]Out of memory!");

return NULL;

}

scr-frate = frate;

scr-width = width;

scr-height = height;

//减少malloc次数,malloc消耗很大,内存泄露呀,内存碎片呀

scr-pix = ((char *)scr) + sizeof(struct screen);

return scr;

}

/*

* 销毁一个 屏幕结构指针, 并为其置空

* struct screen** : 指向 屏幕结构指针的指针, 二级销毁一级的

* */

void

screen_destory(struct screen** pscr)

{

if (NULL == pscr || NULL == *pscr)

return;

free(*pscr);

// 避免野指针

*pscr = NULL;

}

//构建开头 的雪花,下面宏表示每 _INT_SHEAD 个步长,一个雪花,需要是2的幂

//static 可以理解为 private, 宏,位操作代码多了确实难读

#define _INT_SHEAD (12)

static void __snow_head(char* snow, int len)

{

int r = 0;

//数据需要清空

memset(snow, 0, len);

for (;;) {

//取余一个技巧 2^3 - 1 = 7 = 111 , 并就是取余数

int t = rand()  (_INT_SHEAD - 1);

if (r + t = len)

break;

snow[r + t] = 1;

r += _INT_SHEAD;

}

}

#undef _INT_SHEAD

//通过 上一个 scr-pix[scr-width*(idx-1)] = scr-pix[scr-width*idx]

//下面的宏 规定 雪花左右摇摆 0 向左一个像素, 1 表示 不变, 2表示向右一个像素

#define _INT_SWING (3)

static void __snow_next(struct screen* scr, int idx)

{

int width = scr-width;

char* psnow = scr-pix + width*(idx - 1);

char* snow = psnow + width;

int i, j, t; // i索引, j保存下一个瞬间雪花的位置,t 临时补得,解决雪花重叠问题

//为当前行重置

memset(snow, 0, width);

//通过上一次雪花位置 计算下一次雪花位置

for (i = 0; iwidth; ++i) {

for (t = psnow[i]; t0; --t) { // 雪花可以重叠

// rand()%_INT_SWING - 1 表示 雪花 横轴的偏移量,相对上一次位置

j = i + rand() % _INT_SWING - 1;

j = j0 ? width - 1 : j = width ? 0 : j; // j如果越界了,左边越界让它到右边,右边越界到左边

++snow[j];

}

}

}

/**

* 屏幕绘制函数,主要生成一个雪花效果

*

* struct screen* : 屏幕数据

* return          : 0表示可以绘制了,1表示图案不变

*/

int

screen_draw_snow(struct screen* scr)

{

// 静态变量,默认初始化为0,每次都共用

static int __speed = 0;

int idx;

if (++__speed != _INT_VSNOW)

return 1;

//下面 就是 到了雪花飘落的时刻了 既 __speed == _INT_VSNOW

__speed = 0;

//这里重新构建雪花界面,先构建头部,再从尾部开始构建

for (idx = scr-height - 1; idx  0; --idx)

__snow_next(scr, idx);

//构建头部

__snow_head(scr-pix, scr-width);

return 0;

}

//buf 保存scr 中pix 数据,构建后为 (width+1)*height, 后面宏是雪花图案

#define _CHAR_SNOW ‘*‘

static void __flash_snow_buffer(struct screen* scr, char* buf)

{

int i, j, rt;

int height = scr-height, width = scr-width;

int frate = scr-frate; //刷新的帧频率    

//每次都等一下

for (;;sleep_ms(frate)) {

//开始绘制屏幕

rt = screen_draw_snow(scr);

if (rt)

continue;

for (i = 0;iheight; ++i) {

char* snow = scr-pix + i*width;

for (j = 0; jwidth; ++j)

buf[rt++] = snow[j] ? _CHAR_SNOW : ‘ ‘;

buf[rt++] = ‘\n‘;

}

buf[rt - 1] = ‘\0‘;

//正式绘制到屏幕上

puts(buf);

//清空老屏幕,屏幕光标回到最上面

__curup(height);

}

}

#undef _CHAR_SNOW

/**

* 屏幕绘制动画效果, 绘制雪花动画

*

* struct screen* : 屏幕结构指针

*/

void

screen_flash_snow(struct screen* scr)

{

char* buf = NULL;

// 初始化随机数种子,改变雪花轨迹

srand((unsigned)time(NULL));

buf = malloc(sizeof(char)*(scr-width + 1)*scr-height);

if (NULL == buf) {

cerr("[FATAL]Out of memory!");

exit(EXIT_FAILURE);

}

__flash_snow_buffer(scr, buf);

//1.这里理论上不会执行到这,没加控制器. 2.对于buf=NULL,这种代码 可以省掉,看编程习惯

free(buf);

buf = NULL;

}


当前文章:c语言动画函数 c语言动画微课
本文路径:http://myzitong.com/article/dojpiph.html