#include "map.h"
#include "hgeSprite.h"
#include "hgefont.h"
#include "GfxFont.h"
#include "GfxEdit.h"
#include <windows.h>
//HGE *hge = 0;
//hgeSprite *sprite[7];//0:墙壁 1:可走路线 2:箱子存放区 3:障碍物 4:箱子 5:人 6:清除图
HTEXTURE text,text1;
hgeFont* fnt;
GfxFont* g_font = 0,* g_font1 = 0;
int current_step = 1; //记录当前第几关
char *end_char = "";
Map::Map(void)
{
}
Map::~Map(void)
{
}
//地图构造器:len:长 wid:宽
Map::Map(int len,int wid){
/*length = len;
width = wid;*/
}
//设置地图宽度
void Map::setWidth_begin(int width_b){
width_begin = width_b;
}
void Map::setWidth_end(int width_e){
width_end = width_e;
}
//设置地图高度
void Map::setHeight_begin(int height_b){
height_begin = height_b;
}
void Map::setHeight_end(int height_e){
height_end = height_e;
}
//导入图像宽度
void Map::setSkeep_width(int skeep_w){
skeep_width = skeep_w;
}
//导入图像高度
void Map::setSkeep_height(int skeep_h){
skeep_height = skeep_h;
}
void Map::setSpr(hgeSprite **spr1){
//spr = spr1;
}
//画静太图:边界、障碍物,箱子存放标识
void Map::draw(){
for(int i=width_begin;i<=width_end;i+=skeep_width)
{
for(int j=height_begin;j<=height_end;j+=skeep_height)
{
sprite[1]->Render(i,j);
if(i==width_begin||i==width_end-(width_end-width_begin)%skeep_width)
sprite[0]->Render(i,j);
else
if(j==height_begin||j==height_end-(height_end-height_begin)%skeep_height)
sprite[0]->Render(i,j);
}
}
for(int k=0;k<AIM_COUNT;k++)
aim[k]->display();
for(int k=0;k<STONE_COUNT;k++)
stone[k]->display();
}
//绘制通关后的地图
void Map::drawEndMap(){
for(int i=width_begin;i<=width_end;i+=skeep_width)
{
for(int j=height_begin;j<=height_end;j+=skeep_height)
{
sprite[6]->Render(i,j);
//for(int k=0;k<10000;k++){}
}
}
}
//向地图中导入箱子
void Map::setBox(Box *p,int n=BOX_COUNT){
for(int i=0;i<n;i++){
box[i] = new Box((p+i)->getX(),(p+i)->getY());
}
}
//向地图中导入箱子存放位置标识
void Map::setAim(Aim *a1, int n=AIM_COUNT){
for(int i=0;i<n;i++){
aim[i] = new Aim((a1+i)->getX(),(a1+i)->getY());
}
}
//向地图中导入障碍物
void Map::setStone(Stone *s1, int n=STONE_COUNT){
for(int i=0;i<n;i++){
stone[i]= new Stone((s1+i)->getX(),(s1+i)->getY());
}
}
//向地图中导入人物
void Map::setPerson(Person *p1){
person = new Person(p1->getX(),p1->getY());
}
Person* Map::getPerson(){
return person;
}
int Map::getHeight_begin(){
return height_begin;
}
int Map::getHeight_end(){
return height_end;
}
int Map::getWidth_begin(){
return width_begin;
}
int Map::getWidth_end(){
return width_end;
}
int Map::getSkeep_height(){
return skeep_height;
}
int Map::getSkeep_width(){
return skeep_width;
}
//绘制人物
void Map::drawPerson(){
//gotoxy(person->getX()-1,person->getY()-1);
person->display();
}
//绘制箱子
void Map::drawBox(){
for(int i=0;i<BOX_COUNT;i++){
//gotoxy(box[i]->getX()-1,box[i]->getY()-1);
box[i]->display();
}
}
//释放箱子存放标识所分配的内存空间
void Map::deleteAim(){
for(int i=0;i<AIM_COUNT;i++)
delete aim[i];
}
//释放箱子所分配的内存空间
void Map::deleteBox(){
for(int i=0;i<BOX_COUNT;i++)
delete box[i];
}
//释放障碍物所分配的内存空间
void Map::deleteStone(){
for(int i=0;i<STONE_COUNT;i++)
delete stone[i];
}
void Map::deletePerson(){
delete person;
}
//判断指定坐标上是否为障碍物
bool Map::isContenStone(float xx,float yy){
float sx,sy;
int xd = skeep_width,yd = skeep_height;
for(int i=0;i<STONE_COUNT;i++){
/*sx = stone[i]->getX();
sy = stone[i]->getY();
if(yy>sy-yd && yy<sy+yd && xx>sx-xd && xx<sx+xd)
return true;*/
if(stone[i]->isStone(xx,yy))
return true;
}
return false;
}
//判断指定坐标上是否为箱子
bool Map::isContenBox(float xx,float yy){
float bx,by;
int xd = skeep_width,yd = skeep_height;
for(int i=0;i<BOX_COUNT;i++){
/*bx = box[i]->getX();
by = box[i]->getY();
if(yy>by-yd && yy<by+yd && xx>bx-xd && xx<bx+xd)
return true;*/
if(box[i]->isBox(xx,yy))
return true;
}
return false;
}
void Map::moveBox(float from_x,float from_y,float to_x,float to_y){
float bx,by;
int xd = skeep_width,yd = skeep_height;
for(int i=0;i<BOX_COUNT;i++){
/*bx = box[i]->getX();
by = box[i]->getY();
if(from_y>by-yd && from_y<by+yd && from_x>bx-xd && from_x<bx+xd){
box[i]->setX(to_x);
box[i]->setY(to_y);
break;*/
if(box[i]->getX() == from_x && box[i]->getY() == from_y)
{
box[i]->setX(to_x);
box[i]->setY(to_y);
}
}
}
//判断是否胜利,即:该图上箱子是否都已经放置指定地点
bool Map::isWin(){
int flag = 0;
for(int i=0;i<AIM_COUNT;i++)
if(isContenBox(aim[i]->getX(),aim[i]->getY()))
flag++;
if(flag == AIM_COUNT)
return true;
return false;
}
//地图屏幕展现
void Map::show(/*Map &m*/){
for(int i=0;i<AIM_COUNT;i++)
aim[i]->setSpr(sprite[2]);
for(int i=0;i<STONE_COUNT;i++)
stone[i]->setSpr(sprite[3]);
for(int i=0;i<BOX_COUNT;i++)
box[i]->setSpr(sprite[4]);
person->setSpr(sprite[5]);
this->draw(); //静态图展现:边界、障碍物、存放箱子目的地
this->drawBox(); //显现箱子
this->drawPerson();//显现人物
}
//程序入口,根据参数n:游戏关数,加载相应关数数据
void Map::load(int n){
if(n==1){
Person p1(340,290);
Box b1[] = {
Box(160,200),
Box(280,230),
Box(220,200)
};
Aim a1[] = {
Aim(220,170),
Aim(250,170),
Aim(280,170)
};
Stone s1[] = {
Stone(250,200),
Stone(280,200),
Stone(310,200),
Stone(130,170),
Stone(160,170),
Stone(190,170),
Stone(310,170),
Stone(220,140),
Stone(280,140)
};
this->setPerson(&p1);
this->setBox(b1,3);
this->setAim(a1,3);
this->setStone(s1,9);
this->setWidth_begin(100);
this->setWidth_end(700);
this->setHeight_begin(50);
this->setHeight_end(550);
this->setSkeep_width(30);
this->setSkeep_height(30);
}
if(n == 2){
Person p1(440,370);
Box b1[] = {
Box(260,250),
Box(380,250),
Box(320,250)
};
Aim a1[] = {
Aim(320,220),
Aim(350,220),
Aim(380,220)
};
Stone s1[] = {
Stone(350,250),
Stone(440,250),
Stone(410,250),
Stone(440,220),
Stone(260,220),
Stone(290,220),
Stone(410,220),
Stone(320,190),
Stone(380,190)
};
this->setPerson(&p1);
this->setBox(b1,3);
this->setAim(a1,3);
this->setStone(s1,9);
this->setWidth_begin(200);
this->setWidth_end(600);
this->setHeight_begin(100);
this->setHeight_end(500);
this->setSkeep_width(30);
this->setSkeep_height(30);
}
}
//执行人物移动逻辑分析:核心程序
void Map::run(){
}
bool Map::render()
{
hge->Gfx_BeginScene(); //开始渲染
hge->Gfx_Clear(0); //设置清屏颜色
if(current_step <= 0 || current_step > STEPS)
{
this->drawEndMap();
g_font->Print(1,1,"%s","重载游戏—F1 退出—Esc");
g_font1->Print(260,240,"%s",end_char);
}
else
{
this->show();
g_font->Print(1,1,"%s\n%s%d","重置—F1 退出—Esc","当前关数:",current_step);
}
hge->Gfx_EndScene(); //结束渲染
return false;
}
bool Map::frameFunc()
{
int x1 = this->getWidth_begin();
int x2 = this->getWidth_end();
int y1 = this->getHeight_begin();
int y2 = this->getHeight_end();
int xd = this->getSkeep_width();
int yd = this->getSkeep_height();
float px = this->getPerson()->getX();
float py = this->getPerson()->getY();
if(hge->Input_KeyUp(HGEK_ESCAPE))
return true;
if(hge->Input_KeyUp(HGEK_F1))
{
if(current_step<=0 || current_step>STEPS)
{
current_step = 1;
this->load(current_step);
return false;
}
this->deleteAim();
this->deleteBox();
this->deleteStone();
this->deletePerson();
this->load(current_step);
return false;
}
if(hge->Input_KeyUp(HGEK_UP))
if(py > y1+yd)
{
py -= yd;
if(this->isContenStone(px,py))
py += yd;
else if(this->isContenBox(px,py))
if(this->isConte