【转载】[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, 
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);
}
目录
相关文章
|
3月前
|
自然语言处理 图形学
【unity实战】一个通用的FPS枪支不同武器射击控制脚本
【unity实战】一个通用的FPS枪支不同武器射击控制脚本
37 0
|
3月前
|
人工智能 图形学
【unity小技巧】使用动画状态机脚本实现一个简单3d敌人AI功能
【unity小技巧】使用动画状态机脚本实现一个简单3d敌人AI功能
33 0
|
3月前
|
图形学
【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用
【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用
110 0
|
9月前
|
算法 图形学
Unity——导航系统补充说明
Unity——导航系统补充说明
|
人工智能 数据可视化 机器人
GIF动画渲染、让灯塔闪烁、创建航空动态图……ChatGPT代码解释器插件「不止于代码」
GIF动画渲染、让灯塔闪烁、创建航空动态图……ChatGPT代码解释器插件「不止于代码」
193 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏10之一组sprite动画
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏10之一组sprite动画
151 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏20之enemy被攻击显示后退动画(block效果)
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏20之enemy被攻击显示后退动画(block效果)
158 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏08控制sprite移动
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏08控制sprite移动
116 0
|
vr&ar 图形学
【Unity3D 灵巧小知识点】 ☀️ | Unity中 使用代码 激活/取消激活 某个游戏对象的方法
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、r美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。
【Unity3D 灵巧小知识点】 ☀️ | Unity中 使用代码 激活/取消激活 某个游戏对象的方法
|
容器 内存技术
【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条
原文:【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条   这一章讲解FluidMoveBehavior的另一个应用,这是一个绝对原创的做法,目前已经被微软收录在silverlight.net,作者就是烤地瓜本人^^ 。
1068 0