团队作业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了
posted @ 2018-06-28 21:31  梦幻魅羽  阅读(108)  评论(0编辑  收藏  举报