小游戏个人

  这次我主要负责写英雄类,小兵类,伤害类和主函数。

  之前用过用过游戏引擎写过几个小游戏,所以一开始大概有点思路。

主函数

ALL_ini();//初始化游戏
while
(1)//死循环 { GetLocalTime(&now);//开始执行代码的时间 //游戏此处执行 ALL_draw();//绘制窗口 ALL_play();//游戏运行 GetLocalTime(&last); //执行完代码的时间 sleep_time= find_time(last, now); Sleep(max(49 - sleep_time,0));//休息一段时间 GetLocalTime(&last); //执行完代码的时间 if ( win()) { break; } }

    主函数,游戏进行时的死循环代码。几段和时间有关的代码是用来控制帧率,也就是游戏1s中执行多少次的。每次运行完一次游戏,计算一下运行需要多久,然后通过Sleep函数控制休息时间,已控制每次循环开始的时间相差是固定的。

    最后一个是判断双方基地炸了没的代码。

图片的读取和显示

    这个大概是这次任务碰到的最大的两个问题之一,主要是因为不知道去哪里找相关的代码,然后大部分的例子都有用到窗口类之类的东西,所以看半天也看不懂是啥意思。

    最开始找到的显示图片的是用IMAGE这个类,但是PNG图片不能用,因为受不了jpg的白底,所以后面又找到了CImage这个类。然后我就被hdc hwnd这些莫名其妙的东西卡了很久很久。后面突然想通

hwnd = initgraph(640, 480);//创建窗口
hdc = GetDC(hwnd);//获得窗口hdc
bac.Draw(hdc, 0, 0);

   先获得hwnd,然后获得hdc,然后再在窗口上画就可以了。虽然到现在还是没搞懂这些代码是啥意思。但是大致知道怎么用了。

闪屏问题的解决

  这个问题其实到游戏几乎制作完成以后我才去解决,因为之前绘制的图片比较少,并没有出现闪屏问题,但是虽然绘制的图片增加,闪屏越来越严重。

  然后去百度,但是都是说什么双缓冲,还是有一些完全听不懂的名词,完全没看懂。不过无意间发现CImage这个类有个一个函数GetDC(),然后猜,既然这个图片也有DC,那肯定也可以在这个图片上绘制其他图片。

  所以我就先获得一张空白图片的DC,然后把其他所有图片都覆盖上去,在把这张绘制了全部图片的图片绘制到窗口上,这样每次游戏运行就只绘制了一张图片,闪屏的问题就解决了。PS:不过所以不透明度低于255的图片都会变得很奇怪,所以我就把几乎所有

图片透明度都调到了255。不过技能CD中的动画就变得很难看了,要啥自行车。

游戏运行的核心

   所有的物体,都有这样一个函数。按照游戏引擎的叫法,这个叫同步事件。

void step( list<tower> &Solid, list<Army> &Army_Slime, list<hurt> &Magic,queue<long long > &dead, hero &player_red,hero &player_blue,long long &object_ID)

  每个执行一个上面那个死循环么,所有物体都同步时间都会得到一次执行。

  其中的几个参数分别是,防御塔的链表(包括基地和泉水),小兵的列表,所有伤害(子弹,英雄的技能等等)的列表,死亡物体的ID队列。和两个英雄以及所以物体的ID。游戏运行时,就是把三个列表里的物体和两个英雄的同步时间执行一下(本来英雄也想写成列表的,但是就俩个觉得没必要就没写,但是导致代码量增加了一点)。

  

猜你喜欢

转载自www.cnblogs.com/Ike-shadow/p/9240248.html