zoukankan      html  css  js  c++  java
  • C++第九课:逐步深入[独自思考]

    putimage(图片x的坐标,图片y的坐标,IMAGE *srcSource,SRCAND);

    SRCAND这里代表绘制出的像素颜色 = 屏幕颜色 AND 图像颜色,与运算规则。

    putimage(图片x的坐标,图片y的坐标,IMAGE *srcSource,SRCPAINT);

    SRCPAINT这里代表绘制出的像素颜色 = 屏幕颜色 OR 图像颜色,或运算规则。

    最后一位参数本是默认过的,也可以不写,但在这里,你添加上这些参数,就能对图像进行操作。

    当然还有很多参数,下面罗列出一些,有兴趣的朋友,可以自己查查看,但是能用到的几乎就这SRCAND和SRCPAINT两种。

    DSTINVERT 绘制出的像素颜色 = NOT 屏幕颜色

    MERGECOPY 绘制出的像素颜色 = 图像颜色 AND 当前填充颜色

    MERGEPAINT 绘制出的像素颜色 = 屏幕颜色 OR (NOT 图像颜色)

    NOTSRCCOPY 绘制出的像素颜色 = NOT 图像颜色

    NOTSRCERASE 绘制出的像素颜色 = NOT (屏幕颜色 OR 图像颜色)

    PATCOPY 绘制出的像素颜色 = 当前填充颜色

    PATINVERT 绘制出的像素颜色 = 屏幕颜色 XOR 当前填充颜色

    PATPAINT 绘制出的像素颜色 = 屏幕颜色 OR ((NOT 图像颜色) OR 当前填充颜色)

    SRCCOPY 绘制出的像素颜色 = 图像颜色

    SRCERASE 绘制出的像素颜色 = (NOT 屏幕颜色) AND 图像颜色

    SRCINVERT 绘制出的像素颜色 = 屏幕颜色 XOR 图像颜色

    前面已经能输出图片,下面小编就给图片弄些字体在上面,首先排除中文字,因为在运行后,如果敲击中文字会很麻烦,这里就用字母代替。

    下面写到的功能就是从A~Z的字母随机性产生,你敲击一个字母,只要跟图片上显示的字母一致,就让图片消失,然后消失的图片再次重新出现。

    既然是随机机制,就需要用到rand()函数:

    rand()%6;
    

    这句代码的意思就是随机0-5之中某个数,返回值是int类型,或者char也行。

    我们都知道大写字母对应的二进制数是65到90,小写字母对应的二进制数是97到122,不懂的请搜索ASCII编码对照表。

    那么我想输出大写的随机字母,该如何写呢?首先要保证它的数值在65~90之中,不能超出也不能低于这些数。

    思考的方法,英文字母有多少个?如何让它等于65-90,代码如下:

    rand()%26+65;
    

    就是说随机为0的值时,再加上65,是不是等于65了?以此类推,为最高值25时,再加上65,不就是90了吗?

    想通了的话,下面就实现代码输出字母的功能。

    char m_Output = rand() % 26 + 65;
    
    outtextxy(i + 25, j + 25, output);

    outtextxy();三个参数的意思依次是:字母出现的x坐标、y坐标、输出的字

    因为考虑到输出的字母要保证在绘制的图形内部,也要考虑到它的坐标问题,所以它放置的位置一定要符合逻辑,传统的思维都是写一段代码让它执行即可,但是编译器它没有思维,我们怎么能让编译器读懂你所写的代码意思呢?

    实现代码如下:

    char m_Output = rand() % 26 + 65;
    for (j = 0; j < background.getheight(); j++)
    {
    
    	putimage(0, 0, &background);
    	putimage(i, j, &LB2, SRCAND);
    	putimage(i, j, &LB1, SRCPAINT);
    
    	outtextxy(i+25,j+25,output);
    }
    

    不管行与不行,先运行看看,你会发现字母出现了,但也出现了黑底,问题就需要解决。这里就用到了清除黑底的函数,也就是透明化。

    setbkmode(TRANSPARENT);透明化

    加在outtextxy()函数下面,保证每次出现图片和字母时都在透明化。

    最后就是写出一个功能,敲出同样的字母,使萝卜图消失。

    而键盘有两种状态,一个是敲击,还有未敲击。敲击时编译器能得到你所按下键钮的消息,就可以执行下面的操作。

    kbhit();就是实现敲击键钮状态的函数

    当然有些编译器会报错:The POSIX name for this item is deprecated。Instead, use the ISO C++ conformant name : _kbhit。

    意思:这个物品的 posix 名称已经过时了。相反,使用 iso c + + 相符的名称:_kbhit()

    还需要引用一个头文件:

    #include <conio.h>

    这个头文件就是包含了_kbhit()函数

    if(_kbhit())  //如果敲击才会执行下面的代码

    {

       char cInput = _getch();  //_getch();敲击键盘不需要按回车键

       if(cinput==output || cinput==output+32)  //加上32代表小写字母a-z,也就是97-122

        {

        break;      //当输入的键钮和出现的字母相同,就退出当前循环

        }

    }
    实现的代码如下:

    void InitGame()
    {
      //保存图片的对象
      IMAGE background, LB1, LB2;
      //同步
      srand((unsigned int)time(NULL));

      //载入图片
      loadimage(&background, "images//background.jpg", 600, 600);
      loadimage(&LB1, "images//LB1.jpg", 50, 50);
      loadimage(&LB2, "images//LB2.jpg", 50, 50);

      //初始化界面的宽度和高度,在这里用background对象就能获取宽度和高度
      initgraph(background.getwidth(), background.getheight());
      //随机的大写字母
      char output = rand() % 26 + 65;
      int i = rand() % background.getwidth();
      int j = 0;
      for (j = 0; j < background.getheight(); j++)
      {

        putimage(0, 0, &background);
        putimage(i, j, &LB2, SRCAND);
        putimage(i, j, &LB1, SRCPAINT);

        outtextxy(i+25,j+25,output);
        setbkmode(TRANSPARENT);
        if (_kbhit()) //有操作
        {
          char input = _getch();
          if (input == output || input==output+32)
          {
            break;
          }
        }

        sleep(100);    //图片消失后,缓冲一些十分之一秒
      }

    }

    写好后,就能运行成功一次,当图片消失后,它就不会再重新出现萝卜图了,为什么?因为没有无限循环。

    while();先想想放置在哪?

    考虑的问题:字母消失后是不是需要再循环?萝卜图是不是需要再循环?萝卜上的字体消失后是不是需要再循环?输入的按钮消息是不是需要再循环?

    BeginBatchDraw();双缓冲,作用:减少跳屏

    EndBatchDraw();关闭

    遥看漫漫长路,任重而道远。

    条条英符铸平凡,行行代码显乾坤;
  • 相关阅读:
    springboot~使用docker构建gradle项目
    CH BR8(小学生在上课-逆元和互质数一一对应关系)
    UNIX环境高级编程第二版代码笔记
    【Linux学习笔记】用nc实现两台主机间的文件传输(不需要输密码)
    hdu 1159
    轻量级的原型设计工具-Axure RP
    在Ubuntu 12.10 上安装部署Openstack
    [Android 中级]Voip之CSipSimple类库的编绎
    OpenStack云计算快速入门之一:OpenStack及其构成简介
    OpenStack云计算快速入门之二:OpenStack安装与配置
  • 原文地址:https://www.cnblogs.com/VisiousDragon/p/12128439.html
Copyright © 2011-2022 走看看