howzyao 发表于 2022-10-26 14:36:01

C++写的弹球快完善了,跑的试试.

使用了慢羊羊的MMTime对延时修正后,基本上输出帧稳定了.
大家试试








howzyao 发表于 2022-10-26 15:54:41

本帖最后由 howzyao 于 2022-10-26 16:03 编辑

000 main_cpp基于
gcc4.9.2支持的dos版图形库: (好处是无视win api的使用,更容易让c/c++学习上手,若有需要,请发贴,我再发附件)
graphics.h
libbgi.a

图形:
需要手动设置以下6个链接器参数
才能正常使用此图形库
-lbgi
-lgdi32
-lcomdlg32
-luuid
-loleaut32
-lole32

声音:
使用以下2个链接器参数
才能正常使用windows的多媒体接口
-lwinmm
-mwindows

图形的帧控制:
001 mmtime_h
是得到函数执行时间的长度,
加上手动指定延时的时间长度,
最终每次执行绘图时的延迟一致,
以保证函数运行的不定长时间导
至的忽快忽慢现象,以证画面稳定

图形的绘制:
002 e_h
一个类对像,类中的方法按照
图形库的要求,绘出简单图形并以
改变座标位置的方式造成的视觉差
来实现移动,碰撞等效果.

输入控制:
使用图形库自带的输入函数.

#include "./include/e.h"


int main(int argc, char *argv[])
{

    //FreeConsole();
    initwindow(800,600,"e3退出--点击关闭");
    e ball(0,32,5,WHITE);            // 0==ball 1==bar 2==slug 3==block
    e bar (1,5,80,7,LIGHTGRAY,1);
    e slug(2,16,5,15,LIGHTRED,2);
    e block(3,160,45,20,1,0);
    cout<< getactivepage();

    MMtimer myy;

    while( !bar.rexit() && bar.rewin()>-1 ) //ball.alive() && block.towin()
    {

      if( !bar.running(block) )
      block.stageinitial(ball,bar,slug );
      else if( bar.running(block))                      //block.towin()
      {
            bar.input();
            bar.control(ball);
            bar.work(ball,block,slug); // block.stagerunning( ball,bar,slug );

      }

      myy.myySleep(20);
      //delay(20);

      // designed a pause key there can be...
      // also save it can be...
    }
    //exited thank you for your playing...

    getch();

    return EXIT_SUCCESS;
}


#ifndef MMTIME_H_INCLUDED
#define MMTIME_H_INCLUDED

#pragma once
#include <windows.h>

class MMtimer
{
private:
        static LARGE_INTEGER m_clk;                        // 保存时钟信息
        static LONGLONG m_oldclk;                        // 保存开始时钟和结束时钟
        static int m_freq;                                        // 时钟频率(时钟时间换算率),时间差

public:
        static void myySleep(int ms);
};

#endif // MMTIME_H_INCLUDED



#ifndef E_H_INCLUDED
#define E_H_INCLUDED


#include <cstdlib>
#include <iostream>
//#include "./include/MMtime.h"
#include "../lib_h/graphics.h"
#include "../include/mmtime.h"
//-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32
//-lwinmm-mwindows


using namespace std;
static char tstage,tlife,tscore;

struct e
{
    struct o{ int s,*p,left,top,right,bottom,l,w,c,x,y,xy,status;
             void init(int,int);
             void moving();
             void angle(o&);
             void screen();
             bool crash(o&,e&);
             void stopby(o&);
             void fire(e&);
             void crash(e&);
             void touch(o&,e&,e&); };
    o*p;
    int F,N,LK,RK,M,f,name,win,stage,score,life,exit,run; // 0==ball 1==bar 2==slug 3==block
    e();
    ~e(){ for(int i=0;i<N;i++)delete [] p.p; delete [] p; };
    e(int,int,int,int);
    e(int,int,int,int,int,int);
    bool alive();
    bool towin();
    void init01(e&,e&);
    void input(int m=mousex(),int lk=ismouseclick(WM_LBUTTONDOWN),int rk=ismouseclick(WM_RBUTTONDOWN));//实际可以不要形参,我也是新手,为了看清逻辑写上
    void control(e&);
    void mutiball();
    void work(e&,e&,e&);
    bool rexit(){return exit;};
    bool rewin(){return win;};
    bool running(e&);
    void stageinitial(e&,e&,e&);
};


#endif // E_H_INCLUDED


实际上,类方法里面的代码,还存在很多不合理的地方,实在是精力有限,改不动了.如有要挑战改细节的(如,球正好碰到2块之间,没有正常弹回的等等 )跟贴,我发源码.

zhangjinxuan 发表于 2022-10-27 19:17:05

顶{:7_146:}

Zzzzyyyyhhhhh 发表于 2022-11-16 21:57:22

123woshishui 发表于 2022-11-18 00:15:48

{:7_146:}

zhangjinxuan 发表于 2022-11-18 09:32:04

真不错~

hornwong 发表于 2022-12-9 22:32:38

{:5_108:}
页: [1]
查看完整版本: C++写的弹球快完善了,跑的试试.