howzyao 发表于 2022-10-20 21:03:33

popball的架子搭起来了,这次学乖了MP3换成了MID,大家跑的试试

esc退出 p暂停 鼠标x轴 wsad上下左右(测试几个音效声音) 背景音乐是网上下载的mid,樱桃小丸子

欢迎下载运行,欢迎反馈,谢谢








howzyao 发表于 2022-10-20 21:20:42

原理如下:
使用一个坐标类,来控制所有图形向buf的刷写
class e
{
        int len;
        int *x,*y,*state,*mx,*my;
        public:
                e();
           ~e();
                e(int);
        void putpng(IMAGE&,IMAGE&);
        void set_statu(int,int);
        void set_xy(int,int,int);
        intget_len();
        intget_state();
        void paddle_move(IMAGE&);
        void block_stage(int);
};

//创建 1个背景,16个球,60个块和1个拍子 (实际上这个数量无关绘图对像IMAGE的数量,只是想在哪里putimage就指定坐标,
摆放即可,easyx教程都有,这里做个抛砖引玉了.

e bg(1);
e ball(16);
e block(60);
e paddle(1);



图形库,用的是easyx的两个头文件和一个库文件,官网上有,就不发了.
所有图形:abcd
这是文件中对应的4个png图及其防止黑边的mask图,利用了direct.h使用了相对路径,
再也不会出现前几次的黑屏失误了.
IMAGE a,      b,       c,   d;
IMAGE amask,bmask, cmask, dmask;
void loadimg()
{
        loadimage(&amask,"./res/bg00.png");
        loadimage(&a,"./res/bg01.png");
        loadimage(&bmask,"./res/ball00.png");
        loadimage(&b,"./res/ball01.png");
        loadimage(&cmask,"./res/block00.png");
        loadimage(&c,"./res/block01.png");
        loadimage(&dmask,"./res/paddle00.png");
        loadimage(&d,"./res/paddle01.png");
}


//把流程做了到了一起,读图到内存,对像设置状态,及一个个地初始化好位置,直接把块设置到第6关(6排)
void init()
{
        loadimg();
       
        bg.set_statu(0,1);
       
        init_paddle();
       
        init_ball();
       
        block.block_stage(6);
       
       
}


刷新的话,直接把IMAGE对像作为参数使用类中的方法即可 (类中方法基本上都是for)

void update()
{
        bg.putpng(amask,a);
        ball.putpng(bmask,b);
        block.putpng(cmask,c);
        paddle.putpng(dmask,d);
}



//主函数很少,就是设置好鼠标(不跑出图形窗口和标题) 开始绘图,进入whie后 getmsg() 作返回及控制拍子移动和将来的打子弹

int main()
{
    set_cursor_title();
    init();
    BeginBatchDraw();
    while(getmsg())
    {
            update();
      FlushBatchDraw();
      Sleep(20);
    }
    over();
    return 0;
}





//类的构造和析构和指定个数构造也很简单:

e:: e():len(0),x(NULL),y(NULL),state(NULL),mx(NULL),my(NULL)
{}
e:: ~e()
{
        delete [] x;
        delete [] y;
        delete [] state;
        delete [] mx;
        delete [] my;
}
e:: e(int n):len(n)
{
        x=new int;
        y=new int;
        state=new int;
        mx=new int;
        my=new int;
        for(int i=0;i<len;i++)
        {
                x=0;
                y=0;
                state=0;
                mx=0;
                my=0;
        }
}




//所有对像的移动,就是靠它:
void e:: putpng(IMAGE&mask,IMAGE&own)
{
        for(int i=0;i<len;i++)
        {
                if(state>0)
                {
                        x += mx;
                        y += my;
                        putimage(x,y,&mask,SRCAND);
                        putimage(x,y,&own,SRCPAINT);
                }
        }
}


其它的,也都是想一些,写一些的.这个效果真还行,不像原始graphics.h卡卡地,很流畅.

最后附一个早前写的原始graphics.h的较完整的已上传到坛里了,和这个easyx版本的无可比性




howzyao 发表于 2022-10-20 21:30:30

本帖最后由 howzyao 于 2022-10-22 04:08 编辑

忘了一个头,说明也补上:


#include <graphics.h>                // easyx的头
#include <mmsystem.h>         // play方法,放mp3或wav
#include <Vfw.h>                   //MCI方法,放mid
#include <direct.h>                 //./res/.... 可用
#include <conio.h>                        //getch() kbhit()
#include <stdio.h>                        //sprintf()输入提示
#include <math.h>                        //处理碰撞
MOUSEMSG msg;                        //处理getmsg中的操作
char name;                        //配合sprintf用
HWND mciwnd;                        //vfw.h用 柄,放mid
HWND hwnd;                                //约束鼠标 和 设置 图形窗 初始到桌面上的位置已及后续在getmsg中的鼠标操作
RECT screen;                                //同上
POINT screenlt,screenrb;                //同上
HCURSOR nullcursor;                //把光标想换成自己的资源:空 (暂未实现,用windows自带十字暂时用着)

这是所有需要的变量

水边的小姑娘 发表于 2022-10-21 09:39:18

cooooooooooooooooooooooooool,可以正常运行嘞,音乐好听~

howzyao 发表于 2022-10-21 11:21:48

水边的小姑娘 发表于 2022-10-21 09:39
cooooooooooooooooooooooooool,可以正常运行嘞,音乐好听~

{:5_95:}
谢谢回馈.
太好了,现在可以无障碍发布了.

zhangjinxuan 发表于 2022-10-22 09:15:38

各个设备运行正常{:10_256:}
页: [1]
查看完整版本: popball的架子搭起来了,这次学乖了MP3换成了MID,大家跑的试试