团队作业3--王者光耀(体会)
任务
-
英雄移动
- 转换左右方向,不改变英雄位置,该操作无需时间冷却
- 移动操作,改变方向和位置,该操作限次为1s内可移动speed次,速度为1,1s最多可移动一次,速度为2,1s做多可移动2次
- 设置了上下左右四个移动操作,左右两个换向操作
-
战斗画面
- 用面向过程写的,一个函数从(0,0)开始扫描,扫到地图末尾
- 中间若(x,y)等于某个物体的坐标,判断类别并输出相应标识符,一个一个判断,代码量稍大
- 后来想把输出显示写到类方法里面作为display,但是效果欠佳,原因是在绘制背景时画的是空白,到display的时候再去覆盖,这样一帧有一帧无,闪烁严重;若是不绘制空白,英雄走动之后会留下残影不能清除
代码展示
操作
利用getch()来获得键盘某键敲击状态,需要<windows.h>
//void kar::operate(char c)//操作
if(blood<=0)return ; //死亡不可移动
switch (c)
{
case 'q':dir=-1;break; //向左转
case 'e':dir=1;break; //向右转
case 'Q':dir=-1;break; //向左转,大写键输入
case 'E':dir=1;break; //向左转,大写键输入
case '4':dir=-1;break; //向左转
case '6':dir=1;break; //向左转
default:move(c);break; //转到移动
}
//void kar::move(char c) //移动
move2=clock(); //获取当前时间
if(move2-move1<(1000/speed))return ; //移动冷却时间 ,冷却是时间没到,不予处理
switch(c)
{
case 'a':dir=-1;nowpos.ix+=dir;if(nowpos.ix<0)nowpos.ix=0;break; //左
case 'd':dir=1;nowpos.ix+=dir;if(nowpos.ix>49)nowpos.ix=49;break; //右
case 'w':dir=-2;nowpos.iy+=dir/2;if(nowpos.iy<0)nowpos.iy=0;break; //上
case 's':dir=2;nowpos.iy+=dir/2;if(nowpos.iy>4)nowpos.iy=4;break; //下
case 0x4B:dir=-1;nowpos.ix+=dir;if(nowpos.ix<0)nowpos.ix=0;break; //左
case 0x4D:dir=1;nowpos.ix+=dir;if(nowpos.ix>49)nowpos.ix=49;break; //右
case 0x48:dir=-2;nowpos.iy+=dir/2;if(nowpos.iy<0)nowpos.iy=0;break; //上
case 0x50:dir=2;nowpos.iy+=dir/2;if(nowpos.iy>4)nowpos.iy=4;break; //下
case '1':dir=-1;nowpos.ix+=dir;if(nowpos.ix<0)nowpos.ix=0;break; //左
case '3':dir=1;nowpos.ix+=dir;if(nowpos.ix>49)nowpos.ix=49;break; //右
case '5':dir=-2;nowpos.iy+=dir/2;if(nowpos.iy<0)nowpos.iy=0;break; //上
case '2':dir=2;nowpos.iy+=dir/2;if(nowpos.iy>4)nowpos.iy=4;break; //下
case 'A':dir=-1;nowpos.ix+=dir;if(nowpos.ix<0)nowpos.ix=0;break; //左
case 'D':dir=1;nowpos.ix+=dir;if(nowpos.ix>49)nowpos.ix=49;break; //右
case 'W':dir=-2;nowpos.iy+=dir/2;if(nowpos.iy<0)nowpos.iy=0;break; //上
case 'S':dir=2;nowpos.iy+=dir/2;if(nowpos.iy>4)nowpos.iy=4;break; //下
default:return ; //若是其他操作,不刷新冷却时间
}
move1=move2; //刷新冷却
界面绘制
用的是字符标识符,字符可以在word文档-插入-字符里找,有很多;代码太长了,只展示部分
for(w=2;w<10;w++) //塔攻击警示
{
if(x[w]==NULL)continue; //指针为空,下一个
if(x[w]->prepos==pos(i,r)){ //(i,r)与塔攻击位置相等,输出警示
write("⊕");break; //void write(const char *p);是将p字符串写入到待输出列表,好像看到windows.h的函数有write,不过这个是自己写的
}
}
if(w!=10)continue; //该点若已经画了攻击标识符就判断下一个坐标
for(p=10;p<29;p++){
w=0;
if(x[p]==NULL)continue; //空,下一个
if(x[p]->nowpos==pos(i,r)){ //小兵的位置
if(x[p]->dir==1) //小兵的方向
write("↗"); //右
else write("↖"); //左
w=1;
break;
}
}
##耗时 在整个过程中,总耗时超过32 hours 其中: 总框架构思:2 hours 英雄与子弹类:8 hours 主函数构架:5 hours 画面设计及优化:10 hours 组合队员代码:3 hours 总优化以及后期观察:4 hours
##心路历程 ###令我印象最深刻的就是: 学了继承不久,想用基类指针来存派生类,传参图个方便,结果基类指针调用子类函数时,老是报错,最后发现了virtual的好用之处。。。 ####子类加了什么函数就在基类里面加相应的virtual函数就ok了