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毫秒=1秒
1000/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