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

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

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

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

            源代码如下:

 

ContractedBlock.gifExpandedBlockStart.gifCode_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, 
1305016030);
    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(
11, maxx - 1, maxy - 1); /*画方框*/
    
while!kbhit() )
    {
        putstar();
        setcolor(RED);
        setlinestyle(SOLID_LINE, 
0, THICK_WIDTH);
        ellipse(midx, midy, 
1305016030);
        setcolor(BLACK); 
/*画一个围绕地球的光环*/
        ellipse(midx, midy, 
1305016030);
        
for(i = 0; i <= 13; i++)
        {
            setcolor(i 
% 2 == 0 ? LIGHTBLUE : BLACK);
            ellipse(midx, midy, 
0360100100 - 8 * i); /*画地球*/
            setcolor(LIGHTBLUE);
            ellipse(midx, midy, 
0360100 - 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(
-300);

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

    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 + 11); /*用圆表示大星*/
    }
    srand(seed);
}

 

            运行效果截图如下(使用我自己的截屏函数):

            

转载于:https://www.cnblogs.com/hoodlum1980/archive/2009/05/28/1491374.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核设计与实现---系统调用

系统调用1 API、POSIX和C库2 系统调用系统调用号3 系统调用处理程序指定恰当的系统调用参数传递4 系统调用的实现参数验证5 系统调用上下文绑定一个系统调用的最后步骤从用户空间访问系统调用为什么不通过系统调用的方式实现1 API、POSIX和C库 API&#xff1a;应用编程接口。一…

手动去设置HTTP响应行、响应头、响应体

①手动去设置HTTP响应行中的状态码&#xff0c;这里用到了response的setStatus(int sc);这个方法 package com.itheima.line;import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpSer…

基本的二分查找、寻找第一个和最后一个数的二分查找

二分查找1 二分查找的框架2 寻找一个数&#xff08;基本的二分搜索&#xff09;3 寻找左侧边界的二分搜索4 寻找右侧边界的二分查找5 合并二分查找场景&#xff1a;有序数组寻找一个数、寻找左侧边界&#xff08;有序数组第一个等目标数的下标&#xff09;、寻找右侧边界&#…

Linux内核设计与实现---中断和中断处理程序

中断和中断处理程序1 中断异常2 中断处理程序上半部与下半部的对比3 注册中断处理程序释放中断处理程序4 编写中断处理程序重入和中断处理程序共享的中断处理程序中断处理程序实例5 中断上下文6 中断处理机制的实现7 中断控制禁止和激活中断禁止指定中断线中断系统的状态8 总结…

response细节点

一、 1&#xff09;、response获得的流不需要手动关闭&#xff0c;Tomcat容器会帮你自动关闭 2&#xff09;、getWriter和getOutputStream不能同时调用 //error package com.itheima.content;import java.io.IOException; import javax.servlet.ServletException; import java…

linux内核设计与实现---下半部和推后执行的工作

下半部和推后执行的工作1 下半部为什么要用下半部下半部的环境内核定时器2 软中断软中断的实现软中断处理程序执行软中断使用软中断3 tasklettasklet的实现使用taskletksoftirqd4 工作队列工作队列的实现工作、工作队列和工作者线程之间的关系使用工作队列5 下半部机制的选择6 …

Mac VSCode配置C语言环境(可以调试)

Mac VSCode配置C语言环境c_cpp_properties.jsontasks.jsonlaunch.json新建一个文件夹&#xff0c;用vscode&#xff0c;然后再新建一个test.c文件。 #include <stdio.h>int main(void) {int a1,b1;int cab;printf("%d\n",c);return 0; }这篇文章说怎么配置c_c…

vShpere Client在win 7 RC下和2008下 无法正常连接esx主机之解决办法

vShpere Client在win 7 RC下和2008下 无法正常连接esx主机之解决办法 在win7下和2008下打开client后连接esx主机会出现2个错误提示, 第一个是 第二个是 然后就连接失败了,开始以为是CC的esx主机安装有问题,后来找了找,借助了强大google工具,终于找到解决办法.解决办法如下: 1.从…

localhost与127.0.0.1之间的关系更改

其实localhost的默认IP地址为127.0.0.1&#xff0c;因为这是一种映射关系。 更改步骤如下&#xff1a; C:\Windows\System32\drivers\etc 下的hosts 打开hosts可以看到 更改即可

Linux内核设计与实现---内核同步方法

内核同步方法1 原子操作原子整数操作原子性与顺序性的比较原子位操作2 自旋锁自旋锁是不可递归的其他针对自旋锁的操作自旋锁和下半部3 读-写自旋锁4 信号量创建和初始化信号量使用信号量5 读-写信号量6 自旋锁和信号量7 完成变量8 互斥锁互斥锁API9 禁止抢占10 顺序和屏障1 原…

UNIX环境高级编程---进程间通信总结

进程间通信1 管道匿名管道命名管道2 消息队列3 信号量POSIX信号量有名信号量无名信号量有名信号量和无名信号量的公共操作4 共享内存5 信号相关函数6 套接字针对 TCP 协议通信的 socket 编程模型针对 UDP 协议通信的 socket 编程模型针对本地进程间通信的 socket 编程模型总结L…

搜索---广度优先遍历、深度优先遍历、回溯法

参考文章&#xff1a;https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E6%90%9C%E7%B4%A2.md 广度优先搜索&#xff08;BFS&#xff09; 广度优先搜索是按层来处理顶点的&#xff0c;距离开始点最近的那些顶点首先被访问&#…

如何更改Visual Studio 2008中类文件引用的默认名称空间?

在编写程序的时候&#xff0c;如果某些名称空间经常用到&#xff0c;每次创建一个文件的时候&#xff0c;都需要手工添加名称空间&#xff0c;是不是很烦人呢&#xff1f;多说人会回答&#xff1a;是的。如果新建文件的时候就自动加上自己需要的名称空间该多好啊。&#xff1a;…

Linux内核设计与实现---内存管理

内存管理1 页2 区3 获得页获得填充为0的页释放页4 kmalloc()gfp_mask标志kfree()5 vmalloc()6 slab层slab层的设计7 slab分配器的接口8 在栈上的静态分配9 高端内核的映射永久映射临时映射10 每个CPU的分配11 新的每个CPU的接口编译时的每个CPU数据运行时每个CPU数据12 使用每个…

多语言开发 之 通过基页类及Session 动态响应用户对语言的选择

在用户通过UserLogin.aspx登录系统时 提供其对语言的选择选择后 将所选存入Session 以便登录系统后的其他页面进行按语言显示当然相关页面需要支持多语言具体信息可参看使用 根据语言环境不同 而显示不同的 资源本地化 ASP.NET 网页 App_Code下定义基页类 BasePage.cs Codeusin…

Linux内核设计与实现---虚拟文件系统

虚拟文件系统1 通用文件系统2 文件系统抽象层3 Unix文件系统4 VFS对象及其数据结构其他VFS对象5 超级快对象超级块操作6 索引节点对象索引节点操作7 目录项对象目录项状态目录项缓存目录项操作8 文件对象9 和文件系统相关的数据结构10 和进程相关的数据结构11 Linux中的文件系统…

Java里面的几种路径的区别

1&#xff0c;相对路径 相对路径就是指由这个文件所在的路径引起的跟其它文件&#xff08;或文件夹&#xff09;的路径关系。 也就是说&#xff1a; 对于如图所示&#xff1a;一news.html为例 在WEB15工程下的WebContent下的WEB-INF下的news.html 当我访问的news.html的时候…

Linux内核设计与实现---块I/O层

块I/O层1 解刨一个块设备2 缓冲区和缓冲区头3 bio结构体新老方法对比4 请求队列5 I/O调度程序I/O调度程序的工作Linus电梯最终期限I/O调度程序预测I/O调度程序完全公正的排队I/O调度程序空操作的I/O调度程序I/O调度程序的选择系统中能够 随机访问 固定大小数据片的设备被称为块…

算法---数

数1 最大公约数2 最小公约数3 进制转换4 阶乘统计阶乘尾部0的个数5 字符串加法减法二进制加法6 多数投票问题数组中出现次数多于n/2的元素7 相遇问题改变数组元素使所有元素都相同1 最大公约数 欧几里得算法&#xff1a;两个整数的最大公约数等于其中较小的那个数和两数相除余…

Linux内核设计与实现---进程地址空间

进程地址空间1 内存描述符分配内存描述符销毁内存描述符mm_struct与内核线程2 内存区域VMA标志VMA操作内存区域的树形结构和内存区域的链表结构3 操作内存区域find_vma()find_vma_prev()find_vma_intersection()4 mmap()和do_mmap()&#xff1a;创建地址空间mmap&#xff08;&a…