c语言中的简单动画(带有源码)

时间:2024-10-01 15:15:44

c语言中的简单动画(带有源码)

动画

1. 怎样实现动画

相信大家已经对动画的原理已经不陌生了。想要目标物体动起来,只需要逐个播放目标物体每一时刻位

置的图片。只要播放的速度足够快,人们就会在视觉上认为目标物体动起来了。一般来说电视每秒会播

放24帧静态画面,而游戏则更高60 120。

#include<stdio.h>
#include<easyx.h>
int main() {

	//初始化画布
	initgraph(800, 600);
	//设置原点
	setorigin(400,300);
	//调整坐标系
	setaspectratio(1, -1);
	//设置背景色
	setbkcolor(RGB(164, 225, 202));
	cleardevice();
	setfillcolor(WHITE);
	//绘制圆
	solidcircle(-400, 0, 70);



	//关闭拦截
	getchar();
	//关闭画布
	closegraph();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

实现圆的移动

//实现圆的移动 就会不断的改变圆心位置 进行绘制
  • 1
//实现圆的移动 就会不断的改变圆心位置 进行绘制

	for (int i = -400; i < 400; i+=25)
	{
		solidcircle(i, 0, 70);
		getchar();
		cleardevice();
	}

按一次回车 就会执行循环体
把圆心的x +25 清空画布在绘制
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

就实现动起来了

实现自动的动

使用sleep()

	for (int i = -400; i < 400; i+=5)
	{
		solidcircle(i, 0, 70);
		Sleep(10);
		cleardevice();
	}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

速度和帧数的计算

1000ms=1s  1000毫秒=11000/10 =100 每秒100次执行 也就是100个帧

x+=5  每一帧移动5  

动画要想流畅  帧数需要提高60  就是每秒执行的次数 
和移动的距离要适当 不可过大



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

移动的星星

#include<stdio.h>
#include<easyx.h>
#include<math.h>
#define PI 3.14
void fivePointedStarts() {
	//变化角度
	double delta = 2 * PI / 5;
	//起始角度
	double start = PI / 2;//90度
	//半径 
	int r = 90;
	//绘制五个点
	POINT points[5];
	for (int i = 0; i < 5; i++)
	{
		points[i].x = cos(start + i * delta * 2) * r;
		points[i].y = sin(start + i * delta * 2) * r;
	}
	//链接 五个点
	polygon(points, 5);
}

int main() {

	//初始化画布
	initgraph(800, 600);
	//设置原点
	setorigin(400,300);
	//调整坐标系
	setaspectratio(1, -1);
	//设置背景色
	setbkcolor(RGB(164, 225, 202));
	cleardevice();
	setfillcolor(WHITE);
	//绘制圆
	solidcircle(-400, 0, 70);

	//实现圆的移动 就会不断的改变圆心位置 进行绘制
	fivePointedStarts();
	//关闭拦截
	getchar();
	//关闭画布
	closegraph();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

//参数抽离

void fivePointedStarts(int x, int y,int r, double start) {
    //x y 就是五角星的圆心
    
	//变化角度
	double delta = 2 * PI / 5;
	//起始角度 外部传递
	//double start = PI / 2;//90度
	//半径  外部传递
	//int r = 90;
	//绘制五个点
	POINT points[5];
	for (int i = 0; i < 5; i++)
	{
		points[i].x = cos(start + i * delta * 2) * r + x;
		points[i].y = sin(start + i * delta * 2) * r + y;
	}
	//链接 五个点
	polygon(points, 5);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

移动的五角星

#include<stdio.h>
#include<easyx.h>
#include<math.h>
#define PI 3.14
void fivePointedStarts(int x, int y,int r, double start) {
	//变化角度
	double delta = 2 * PI / 5;
	//起始角度 外部传递
	//double start = PI / 2;//90度
	//半径  外部传递
	//int r = 90;
	//绘制五个点
	POINT points[5];
	for (int i = 0; i < 5; i++)
	{
		points[i].x = cos(start + i * delta * 2) * r + x;
		points[i].y = sin(start + i * delta * 2) * r + y;
	}
	//链接 五个点
	polygon(points, 5);
}

int main() {

	//初始化画布
	initgraph(800, 600);
	//设置原点
	setorigin(400,300);
	//调整坐标系
	setaspectratio(1, -1);
	//设置背景色
	setbkcolor(RGB(164, 225, 202));
	cleardevice();
	setfillcolor(WHITE);
	//绘制圆
	solidcircle(-400, 0, 70);

	int x, y = 0;
	for (x = -400; x <= 400; x += 5) // // 每次移动5像素
	{
		cleardevice();
		// 绘制中心为(x, y),半径为50,起始角度为90°的五角星
		fivePointedStarts(x, y, 50, PI / 2);
		// 绘制一帧画面后,让画面停留40毫秒
		Sleep(40);
	}

	//关闭拦截
	getchar();
	//关闭画布
	closegraph();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

实现往返运动

	//实现往返的运动

	int x, y;
	// 从(-400, 0)开始
	x = -400;
	y = 0;
	// 每次移动dx像素,初始为5
	int dx = 5;
	while (1)
	{
		cleardevice();
		fivePointedStarts(x, y, 50, PI / 2);
		Sleep(40);
		x = x + dx;
		// 是否碰到转向点
		if (x == -400 || x == 400)
		{
			// 向反方向移动
			dx = -dx;
		}
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

矩形运动

int x, y;
// 从(-300, 200)开始
x = -300;
y = 200;
int dx, dy;
while (1)
{
    // 到达左上角(-300, 200)后,开始以5像素每帧向右运动。
    if (x == -300 && y == 200)
    {
    dx = 5;
    dy = 0;
    }
    // 到达右上角(300, 200)后,以5像素每帧向下运动。
    else if (x == 300 && y == 200)
    {
    dx = 0;
    dy = -5;
    }
    // 到达右下角(300, -200)后,以5像素每帧向左运动。
    else if (x == 300 && y == -200)
    {
    dx = -5;
    dy = 0;
    }
    // 到达左下角(-300, -200)后,以5像素每帧向上运动。
    else if (x == -300 && y == -200)
    {
    dx = 0;
    dy = 5;
    }
    cleardevice();
    //绘制路径
	POINT points[4] = { {-300,200},{300,200},{300,-200},{-300,-200} };
	polygon(points, 4);
    fivePointedStar(x, y, 50, PI / 2);
    Sleep(40);
    x = x + dx;
    y = y + dy;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

圆周运动

让五角星围绕某一点圆周运动

某一点 0,0

//某一点 圆心
int x=0, y=0;
//角度变化 
double del = 2 * PI / 360;//每秒一度

//初始角度
double initdel = 0;

while (1)
{

    cleardevice();
    //绘制轨迹
    circle(0, 0, 140);
    //变化x y
    x = cos(initdel + del) * 140;
    y = sin(initdel + del) * 140;
    fivePointedStarts(x, y, 50, PI / 2);
    Sleep(40);
    initdel += del;
}




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

完整代码

#include<stdio.h>
#include<easyx.h>
#include<math.h>
#define PI 3.14
void fivePointedStarts(int x, int y,int r, double start) {
	//变化角度
	double delta = 2 * PI / 5;
	//起始角度 外部传递
	//double start = PI / 2;//90度
	//半径  外部传递
	//int r = 90;
	//绘制五个点
	POINT points[5];
	for (int i = 0; i < 5; i++)
	{
		points[i].x = cos(start + i * delta * 2) * r + x;
		points[i].y = sin(start + i * delta * 2) * r + y;
	}
	//链接 五个点
	polygon(points, 5);
}

int main() {

	//初始化画布
	initgraph(800, 600);
	//设置原点
	setorigin(400,300);
	//调整坐标系
	setaspectratio(1, -1);
	//设置背景色
	setbkcolor(RGB(164, 225, 202));
	cleardevice();

	
	//圆心
	int x=0, y=0;
	//角度变化 
	double del = 2 * PI / 360;//每秒一度

	//初始角度
	double initdel = 0;

	while (1)
	{
		
		cleardevice();
		//绘制轨迹
		circle(0, 0, 140);
		//变化x y
		x = cos(initdel + del) * 140;
		y = sin(initdel + del) * 140;
		fivePointedStarts(x, y, 50, PI / 2);
		Sleep(40);
		initdel += del;
	}





	//关闭拦截
	getchar();
	//关闭画布
	closegraph();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

五星自转

改变初始角 一次加一
double startAngle = PI / 2;
double dStartAngle = 0.05;
while (1)
{
    cleardevice();
    fivePointedStar(0, 0, 50, startAngle);
    Sleep(40);
    startAngle = startAngle + dStartAngle;
}	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结合起来 自转+周转

#include<stdio.h>
#include<easyx.h>
#include<math.h>
#define PI 3.14
void fivePointedStarts(int x, int y,int r, double start) {
	//变化角度
	double delta = 2 * PI / 5;
	//起始角度 外部传递
	//double start = PI / 2;//90度
	//半径  外部传递
	//int r = 90;
	//绘制五个点
	POINT points[5];
	for (int i = 0; i < 5; i++)
	{
		points[i].x = cos(start + i * delta * 2) * r + x;
		points[i].y = sin(start + i * delta * 2) * r + y;
	}
	//链接 五个点
	polygon(points, 5);
}

int main() {

	//初始化画布
	initgraph(800, 600);
	//设置原点
	setorigin(400,300);
	//调整坐标系
	setaspectratio(1, -1);
	//设置背景色
	setbkcolor(RGB(164, 225, 202));
	cleardevice();

	
	//圆心
	int x=0, y=0;
	//角度变化 
	double del = 2 * PI / 360;//每秒一度

	//初始角度
	double initdel = 0;
	//初始自传角度
	double initrote = PI / 2;//90度
	//自转角度变化 
	double rotedel = 2 * PI / 120;//每秒3度
	while (1)
	{
		
		cleardevice();
		//绘制轨迹
		circle(0, 0, 140);
		//变化x y
		x = cos(initdel + del) * 140;
		y = sin(initdel + del) * 140;
		fivePointedStarts(x, y, 50, initrote);
		Sleep(40);
		initdel += del;
		initrote += rotedel;
	}

	//关闭拦截
	getchar();
	//关闭画布
	closegraph();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66