【转载】[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,一经查实,立即删除!

相关文章

math.sqrt 有问题_JavaScript中带有示例的Math.SQRT2属性

math.sqrt 有问题JavaScript | Math.SQRT2属性 (JavaScript | Math.SQRT2 Property) Math.SQRT2 is a property in math library of JavaScript that is used to find the value of square root of 2. It is generally used to solve problems related to circular figures. Ma…

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

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

内核编译配置选项含义

Linux 2.6.19.x 内核编译配置选项简介 作者&#xff1a;金步国 版权声明 本文作者是一位自由软件爱好者&#xff0c;所以本文虽然不是软件&#xff0c;但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发&#xff0c;但必须保留作者署名&#xff0c;亦不得对声…

js编码处理(转)

js编码处理(转) 1. 使用 JS 中的 encodeURIComponent 或 encodeURI 方法。 说明&#xff1a; encodeURIComponent(String) 对传递参数进行设置。不编码字符有 71 个&#xff1a; ! &#xff0c; &#xff0c; ( &#xff0c; ) &#xff0c; * &#xff0c; - &#…

手动去设置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…

Java SecurityManager checkListen()方法与示例

SecurityManager类的checkListen()方法 (SecurityManager Class checkListen() method) checkListen() method is available in java.lang package. checkListen()方法在java.lang包中可用。 checkListen() method invokes checkPermission with the given SocketPermission(&q…

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

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

PostgreSQL 中的递归查询 与oracle 的比较

PostgreSQL 中的递归查询&#xff0c;2种方法&#xff1a; 1、用with decursive WITH RECURSIVE d AS (SELECT d1.id,d1.parent_id,d1.caption FROM course_types d1 where d1.dr 0 and d1.idtypeId union ALL SELECT d2.id,d2.parent_id,d2.caption FROM course_types d2, d …

教你如何玩转GitHub

使用GitHub ①目的&#xff1a;借助GitHub托管项目代码 基本概念&#xff1a; ①仓库(Repository)&#xff1a; 用来存放项目代码&#xff0c;每个项目对应一个仓库&#xff0c;多个开源项目对应多个仓库 ②收藏(Star)&#xff1a; 收藏项目&#xff0c;方便下次查看 ③…

Java SecurityManager checkDelete()方法与示例

SecurityManager类的checkDelete()方法 (SecurityManager Class checkDelete() method) checkDelete() method is available in java.lang package. checkDelete()方法在java.lang包中可用。 checkDelete() method calls checkPermission with FilePermission(filename,"d…

jQuery中的treeview插件

jQuery做树状结构真的很简单,下面做一个最简单的示例: 在html文件中引用: <link rel"stylesheet" href"../jquery.treeview.css" /> <link rel"stylesheet" href"../red-treeview.css" /> <link rel"styles…

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

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

asp.net中的窗体身份验证(最简单篇)

在创建网站中&#xff0c;常常会使用到身份验证。asp.net中内置了几种身份验证的方式&#xff0c;如Windows、Froms、Passport等。这几种身份验证的方式各有不同。一般来说&#xff0c;网站的身份验证方式都会经过以下几个步骤&#xff1a; 1、输入用户名和密码&#xff0c;单击…

bat文件调用dos命令 (dos淘金)

ECHO命令是大家都熟悉的DOS批处理命令的一条子命令&#xff0c;但它的一些功能和用法也许你并不是全都知道&#xff0c;不信你瞧&#xff1a; 1&#xff0e; 作为控制批处理命令在执行时是否显示命令行自身的开关 格式&#xff1a;ECHO [ON|OFF] 如果想关闭“ECHO OFF”命令…

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…

Java RandomAccessFile writeBytes()方法与示例

RandomAccessFile类writeBytes()方法 (RandomAccessFile Class writeBytes() method) writeBytes() method is available in java.io package. writeBytes()方法在java.io包中可用。 writeBytes() method is used to write the sequence of bytes (i.e. string) to the file. E…

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

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

Jquery对复选框的操作

<from> 你的爱好是?<br/> <input type"checkbox" name"items" value"篮球" />篮球 <input type"checkbox" name"items" value"乒乓球" />乒乓球 <input type"checkbox" na…

HttpServletRequest(request的一些API)

一、request的运行流程 首先&#xff0c;自己写一个web工程&#xff0c;也就是建一个工程&#xff1b;当把该web工程发布到Tomcat服务器当中&#xff0c;可以让外界访问&#xff0c;这就成了一个web应用。 在客户端输入一个网站&#xff0c;是web应用资源的地址URL&#xff0c…

DCI:James O. Coplien和Trygve Reenskau提出的新架构方法

http://www.infoq.com/cn/news/2009/05/dci-coplien-reenskau 转载于:https://www.cnblogs.com/yelinpalace/archive/2009/06/13/1502573.html