【转载】[TC]飞船动画例子--《C高级实用程序设计》

简介: 【声明和备注】本例子属于转载来源于《C高级实用程序设计》(王士元,清华大学出版社)第11章,菜单设计与动画技术,第11.5节,一个动画例子。             本例讲解的是在一个繁星背景下,一个由经纬线组成的蓝色地球,并环绕有红色光环,一蓝色宇宙飞船从左至右缓缓飞过,周而复始,给人一种遨游太空的神秘感。

            【声明和备注】本例子属于转载来源于《C高级实用程序设计》(王士元,清华大学出版社)第11章,菜单设计与动画技术,第11.5节,一个动画例子。

            本例讲解的是在一个繁星背景下,一个由经纬线组成的蓝色地球,并环绕有红色光环,一蓝色宇宙飞船从左至右缓缓飞过,周而复始,给人一种遨游太空的神秘感。本例属于C语言图形程序,使用 Turbo C 2.0 编译。本来我想贴到 BCCN 论坛,无奈该论坛挂了,无法登录。所以暂且就贴到自己的 BLOG 上了。

            这个例子采用的基本技术主要是 TC 提供的图形函数,动画部分是采用了 getimage 和 putimage 函数,并使用 XOR 方式合成到屏幕上实现“擦除”和“更新”的动画效果。我调整了原范例中的函数命名和可能是属于印刷错误的错误。

            源代码如下:

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code_Planet.C
/**************************************
 * <<C高级实用程序>>(王士元)Page 324
 *
 *             人造卫星环绕地球运行图
 *
 *    2009.05.27 00:35
 *************************************
*/
 
#include 
<graphics.h>
#include 
<stdlib.h>
#include 
<stdio.h>
#include 
<conio.h>
/*#include <cpyscr.h>*/

#define IMAGE_SIZE 10

void draw_image(int x, int y);
void putstar(void);

void main()
{
    
int graphdriver = DETECT;
    
int graphmode, color;
    
void *pt_addr;
    
int x, y, maxx, maxy, midy, midx, i;
    unsigned 
int size;
    registerbgidriver(EGAVGA_driver);
    registerbgifont(TRIPLEX_FONT);
    initgraph(
&graphdriver, &graphmode, "C:\\TC\\");
    maxx 
= getmaxx();
    maxy 
= getmaxy();
    midx 
= maxx/2;
    x 
= 0;
    midy 
= y = maxy/2;
    setcolor(YELLOW);
    settextstyle(TRIPLEX_FONT, HORIZ_DIR, 
4);
    settextjustify(CENTER_TEXT, CENTER_TEXT);
    outtextxy(midx, 
400, "AROUND THE WORLD");
    setbkcolor(BLACK);
    setcolor(RED);
    setlinestyle(SOLID_LINE, 
0, THICK_WIDTH);
    ellipse(midx, midy, 
130, 50, 160, 30);
    setlinestyle(SOLID_LINE, 
0, NORM_WIDTH);
    draw_image(x, y);    
/*画飞船*/
    size 
= imagesize(x, y - IMAGE_SIZE,
        x 
+ (4 * IMAGE_SIZE), y + IMAGE_SIZE);
    pt_addr 
= malloc(size);
    getimage(x, y 
- IMAGE_SIZE,
        x 
+ (4 * IMAGE_SIZE), y + IMAGE_SIZE, pt_addr);
    putstar();    
/*画星星*/
    setcolor(WHITE);
    setlinestyle(SOLID_LINE, 
0, NORM_WIDTH);
    rectangle(
1, 1, maxx - 1, maxy - 1); /*画方框*/
    
while( !kbhit() )
    {
        putstar();
        setcolor(RED);
        setlinestyle(SOLID_LINE, 
0, THICK_WIDTH);
        ellipse(midx, midy, 
130, 50, 160, 30);
        setcolor(BLACK); 
/*画一个围绕地球的光环*/
        ellipse(midx, midy, 
130, 50, 160, 30);
        
for(i = 0; i <= 13; i++)
        {
            setcolor(i 
% 2 == 0 ? LIGHTBLUE : BLACK);
            ellipse(midx, midy, 
0, 360, 100, 100 - 8 * i); /*画地球*/
            setcolor(LIGHTBLUE);
            ellipse(midx, midy, 
0, 360, 100 - 8 * i, 100);
        }
        putimage(x, y 
- IMAGE_SIZE, pt_addr, XOR_PUT); /*恢复原画面*/
        x 
= x >= maxx ? 0 : x+6;
        putimage(x, y 
- IMAGE_SIZE, pt_addr, XOR_PUT); /*在另一位置显示飞船*/
    }
    
/*CopyScreen("c:\\demo.bmp", 0, 0, maxx, maxy);*/
    free(pt_addr);    
/*释放缓冲区*/
    closegraph();
    
return;
}

void draw_image(int x, int y) /*画飞船*/
{
    
int arw[8]; /*梯形飞船本体*/
    arw[
0] = x + 10; arw[1] = y - 10;
    arw[
2] = x + 34; arw[3] = y - 6;
    arw[
4] = x + 34; arw[5] = y + 6;
    arw[
6] = x + 10; arw[7] = y + 10;

    setcolor(
14);

    moveto(x 
+ 10, y - 4);    /*上面飞船尾巴*/
    linerel(
-30, -16);

    moveto(x 
+ 10, y);            /*中间飞船尾巴*/
    linerel(
-30, 0);

    moveto(x 
+ 10, y + 4);    /*下面飞船尾巴*/
    linerel(
-30, 16);

    setcolor(
3);                        /*画飞船本体*/
    setfillstyle(
1, LIGHTBLUE);
    fillpoly(
4, arw);
}

void putstar(void)    /*画星星*/
{
    
int seed = 1858;
    
int i, dotx, doty, h, w, color, maxcolor;
    maxcolor 
= getmaxcolor(); /*最多颜色数*/
    w 
= getmaxx();
    h 
= getmaxy();
    srand(seed);
    
for(i = 0; i < 250; i++)
    {
        dotx 
= 1 + random(w-1);
        doty 
= 1 + random(h-1);
        color 
= random(maxcolor);
        setcolor(color);
        putpixel(dotx, doty, color);    
/*用点表示小星*/
        circle(dotx 
+ 1, doty + 1, 1); /*用圆表示大星*/
    }
    srand(seed);
}
目录
相关文章
|
11月前
|
人工智能 供应链 算法
1688开店必看丨新手商家人手一份的运营指南!
在中国电商的宏大叙事中,当大众的目光多聚焦于淘宝、京东等直面消费者的零售巨头时,一条潜行于幕后的“超级供应链动脉”正以前所未有的力量重塑着中国商业的毛细血管。这便是阿里巴巴集团旗下的核心B2B平台——1688。
2764 99
|
开发工具 git druid
解决Git中fatal: refusing to merge unrelated histories
Git的报错 在使用Git的过程中有时会出现一些问题,那么在解决了每个问题的时候,都需要去总结记录下来,下次不再犯。 一、fatal: refusing to merge unrelated histories 今天在使用Git创建项目的时候,在两个分支合并的时候,出现了下面的这个错误。
110195 6
|
9月前
|
人工智能 API 调度
从“会用 AI”到“指挥 AI”:AI调度官能力模型解析
AI调度官是面向多模型协同的新型系统角色,聚焦任务拆解、能力编排与运行约束,实现AI能力的统一调度、闭环管控与稳定执行,支撑可扩展、可解释、可持续演进的智能协同体系。
537 0
|
存储 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL 数据库课程设计:开启数据宇宙的传奇之旅
本文全面剖析数据库课程设计 MySQL,展现其奇幻魅力与严峻挑战。通过实际案例凸显数据库设计重要性,详述数据安全要点及学习目标。深入阐述备份与恢复方法,并分享优秀实践项目案例。为开发者提供 MySQL 数据库课程设计的全面指南,助力提升数据库设计与管理能力,保障数据安全稳定。
大数据新视界--大数据大厂之MySQL 数据库课程设计:开启数据宇宙的传奇之旅
|
8月前
|
弹性计算 安全 应用服务中间件
云服务器部署LNMP教程:2026年最新阿里云ECS使用指南
本文详解2026年阿里云ECS部署LNMP环境的两种方式:一键快捷部署(通过系统运维管理扩展程序,5分钟完成)和手动部署(支持Alibaba Cloud Linux/CentOS/Ubuntu,可深度定制与安全加固),涵盖Nginx、MySQL、PHP安装配置及连通性验证,适合新手入门与生产环境使用。(239字)
297 1
|
9月前
|
存储 弹性计算 人工智能
2026年阿里云服务器最新价格表及优惠详情参考
租用阿里云服务器一年要花多少钱?2026年阿里云最新价格表,2026年阿里云服务器最新价格表及优惠详情参考
1537 0
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】39. 梯度下降优化之动量法介绍及其Pytorch实现
【从零开始学习深度学习】39. 梯度下降优化之动量法介绍及其Pytorch实现
|
存储 API UED
鸿蒙特效教程02-微信语音录制动画效果实现教程
本教程适合HarmonyOS初学者,通过简单到复杂的步骤,一步步实现类似微信APP中的语音录制动画效果。
684 0
鸿蒙特效教程02-微信语音录制动画效果实现教程
|
网络协议 图形学 Windows
unity获取本机IP地址
在 Unity 中,通过 .NET 框架的 System.Net 命名空间提供的 Dns 和 NetworkInterface 类,可以获取本机的 IPv4 和 IPv6 地址。使用 Dns.GetHostEntry 方法获取主机信息,并根据地址族(AddressFamily.InterNetwork 或 AddressFamily.InterNetworkV6)筛选出相应的 IP 地址。代码示例展示了如何分别获取 IPv4 和 IPv6 地址并输出到控制台。
955 10
|
存储 监控 Java

热门文章

最新文章