📄 game.cpp
字号:
}
m_pDraw->Blt(j*40+19+10,i*40+40+20,m_pSurface,&rect);
// tag表示道具的种类
rect.left = 480 + m_ScreenItem[i][j].counter/10%3*44;
rect.top = 40+m_ScreenItem[i][j].tag*44;
rect.right = 480 + 44 + m_ScreenItem[i][j].counter/10%3*44;
rect.bottom = 40+44+m_ScreenItem[i][j].tag*44;
m_pDraw->Blt(j*40+19-2,i*40+40-24+m_ScreenItem[i][j].yoffset,m_pSurface,&rect);
m_ScreenItem[i][j].counter++;
if (m_ScreenItem[i][j].counter == 1000)
{
m_ScreenItem[i][j].counter = 0;
}
break;
case 9: // 爆炸效果
{
// status在此处表示爆炸效果的编号
/*
2
1
...
1
6 5 ... 5 0 7 ... 7 8
3
...
3
4
*/
m_ScreenItem[i][j].counter--;
if (m_ScreenItem[i][j].counter == 0) // 爆炸结束
{
if (m_ScreenItem[i][j].tag != -1)
{
m_ScreenItem[i][j].type = 8; // 炸出来的道具
m_pSoundEffect[APPEAR]->Play(); // 播放道具出现音效
}
else
{
m_ScreenItem[i][j].type = 0;
}
}
int temp = m_ScreenItem[i][j].counter/6;
if (temp>4) temp=4;
rect.left = 40+(4-temp)*40;
rect.top = 200+m_ScreenItem[i][j].status*40;
rect.right = 40+40+(4-temp)*40;
rect.bottom = 200+40+m_ScreenItem[i][j].status*40;
m_pDraw->Blt(j*40+19,i*40+40,m_pSurface,&rect);
}
break;
default:
break;
}
}
// 显示玩家 DrawPlayer
for (int PlayerIndex=0;PlayerIndex<PLAYER_NUM;PlayerIndex++)
{
if ((m_Player[PlayerIndex].y+20)/40 == i && m_Player[PlayerIndex].type != TYPE_NULL)
{
if (m_Player[PlayerIndex].status == STATUS_DIED) // 被炸?
{
rect.left = 280;
rect.top = 280;
rect.right = 280+60;
rect.bottom = 280+60;
if (m_Player[PlayerIndex].counter == 60)
{
m_pSoundEffect[DIE]->Play();
}
if (m_Player[PlayerIndex].counter < 60)
{
rect.top += 60;
rect.bottom += 60;
}
if (m_Player[PlayerIndex].counter != 0)
{
m_Player[PlayerIndex].counter--;
m_pDraw->Blt(m_Player[PlayerIndex].x+19-10,m_Player[PlayerIndex].y+40-20,m_pSurface,&rect);
}
}
else
{
rect.left = m_Player[PlayerIndex].way*52*5+m_Player[PlayerIndex].frame*52;
rect.top = m_Player[PlayerIndex].image*62;
rect.right = m_Player[PlayerIndex].way*52*5+52+m_Player[PlayerIndex].frame*52;
rect.bottom = m_Player[PlayerIndex].image*62+62;
m_pDraw->Blt(m_Player[PlayerIndex].x+19-6,m_Player[PlayerIndex].y+40-20,m_pSurfacePlayer,&rect);
}
}
}
}
// 处理踢出来的泡泡
DoKick();
// 处理扔出来的泡泡
DoCast();
m_timeNew = timeGetTime();
if (m_timeNew >= m_timeOld + 500)
{ //每半秒就更新一下fps
m_fps = (float) m_counter * 1000.0f / (m_timeNew - m_timeOld); //计算fps,fps_count是刷新次数统计
m_counter = 0; //清空刷新次数
m_timeOld = m_timeNew; //使过去的时间等于当前的时间
}
m_counter++;
char str[256];
if (m_bHelp)
{
sprintf(str,"FPS: %f 主角信息 x: %d y: %d way: %d speed: %d",m_fps,m_Player[0].x,m_Player[0].y,m_Player[0].way,m_Player[0].speed);
m_pDraw->DrawText(NULL,str,19,40);
sprintf(str,"F1 for help show/hide");
m_pDraw->DrawText(NULL,str,19,60);
sprintf(str,"F2 for reset");
m_pDraw->DrawText(NULL,str,19,80);
sprintf(str,"F3 for window/fullscreen");
m_pDraw->DrawText(NULL,str,19,100);
}
/*
sprintf(str," 电脑信息 lay: %d",m_PlayerLay[1]);
m_pDraw->DrawText(NULL,str,19,60);
*/
// 显示小图标
for (i=0;i<PLAYER_NUM;i++)
{
if (m_Player[i].type != TYPE_NULL)
{
rect.left = 4*52;
rect.top = m_Player[i].image*62;
rect.right = 4*52+52;
rect.bottom = m_Player[i].image*62+38;
m_pDraw->Blt(655,60+i*44,m_pSurfacePlayer,&rect);
if (m_Player[i].type == TYPE_USER)
{
DWORD length = sizeof(str);
GetComputerName(str,&length);
m_pDraw->DrawText(NULL,str,705,87+i*44);
}
else
{
sprintf(str,"电脑玩家 %d",i);
m_pDraw->DrawText(NULL,str,705,87+i*44);
}
}
}
// 显示身上的特殊道具
if (m_Player[0].pin)
{
rect.left = 480;
rect.top = 260;
rect.right = 480+44;
rect.bottom = 260+44;
m_pDraw->Blt(665,464,m_pSurface,&rect);
}
if (m_GameCounter == DISPLAYCOUNTER)
{
m_pSoundEffect[START+m_GameState-1]->Play();
}
if (m_GameCounter>0)
{
rect.left = 0;
rect.top = (m_GameState-1)*80;
rect.right = 240;
rect.bottom = 80+(m_GameState-1)*80;
m_pDraw->Blt(200,100,m_pSurfaceWord,&rect);
m_GameCounter--;
if (m_GameCounter == 0 && m_GameState == GAME_START)
{
m_GameState = GAME_FREE;
}
}
// 鼠标
rect.left = 160;
rect.top = 40;
rect.right = 160+32;
rect.bottom = 40+32;
m_pDraw->Blt(m_CursorPos.x,m_CursorPos.y,m_pSurface,&rect);
HRESULT hr;
if (FAILED(hr = m_pDraw->Present()))
{
if( hr == DDERR_SURFACELOST )
{
RestoreSurfaces();
}
}
return S_OK;
}
void CGame::DoInput()
{
m_pInput->GetKeyboardState();
if (m_pInput->IsKeyDownToggle(DIK_SPACE))
{
if (m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].type!=7)
{
if (m_Player[0].bomb != 0)
{
m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].type = 7;
m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].counter = 300;
m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].status = m_Player[0].power;
m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].who = 0;
m_Player[0].bomb--;
m_pSoundEffect[LAY]->Play();
}
}
else
{
if (m_Player[0].cast && m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].counter<240)
{
m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].type = 0;
MOVEBOMB move;
move.mode = 1;
move.way = m_Player[0].way;
move.x = (m_Player[0].x+20)/40*40;
move.y = (m_Player[0].y+20)/40*40;
move.power = m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].status;
move.counter = m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].counter;
move.offset = 0;
move.addorsub = true;
move.who = m_ScreenItem[(m_Player[0].y+20)/40][(m_Player[0].x+20)/40].who;
m_bombCast.push_back(move);
}
}
}
if ((m_pInput->IsKeyDownToggle(DIK_LCONTROL) || m_pInput->IsKeyDownToggle(DIK_RCONTROL)) && m_Player[0].pin == true && m_Player[0].status == STATUS_DIED && m_Player[0].counter > 60)
{
m_Player[0].pin = false;
m_Player[0].status = STATUS_FREE;
}
int done;
if (m_pInput->IsKeyDown(DIK_UP) && (m_Player[0].status == STATUS_FREE) && (m_Player[0].y != 0))
{
done = CAN_MOVE;
m_Player[0].way = WAY_UP;
if (m_Player[0].y % 40 == 0) // 判断阻挡
{
done = CAN_BLOCK;
// 正前方为空
if ((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==0 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==8 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==9 ))
{
// 右上方为空 ...OK!
if ((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==0 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==8 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==9 ))
{
done = CAN_MOVE; // 直接往前走
}
else // 右上方有东西
{
if (m_Player[0].x%40 == 0)
{
done = CAN_MOVE; // 直接往前走
}
else if (m_Player[0].x%40 <= 30)
{
m_Player[0].way = WAY_LEFT;
done = CAN_MOVE; // 向左边偏移
}
else if (m_Player[0].x%40 > 30)
{
if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==2 )
{
// 右上方是箱子,推
done = CAN_PUSH;
}
else if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==7 )
{
// 右上方是泡泡,踢
done = CAN_KICK;
}
}
}
}
else // 正前方有东西
{
// 右上方为空 ...OK!
if ((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==0 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==8 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==9 ))
{
if (m_Player[0].x%40 == 0)
{
if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 )
{
// 正上方是箱子,推
done = CAN_PUSH;
}
else if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 )
{
// 正上方是泡泡,踢
done = CAN_KICK;
}
}
else if (m_Player[0].x%40 >= 10)
{
m_Player[0].way = WAY_RIGHT;
done = CAN_MOVE; // 向右边偏移
}
else if (m_Player[0].x%40 < 10)
{
if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 )
{
// 正上方是箱子,推
done = CAN_PUSH;
}
else if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 )
{
// 正上方是泡泡,踢
done = CAN_KICK;
}
}
}
else // 右上方有东西
{
// 此处较麻烦分4种情况: 1.左边可以移动,右边可以移动 如果x%40<20则左移,否则右移
// 2.左边可以移动,右边不可移动 如果x%40<=30则左移
// 3.左边不可移动,右边可以移动 如果x%40>=10则右移
// 4.左边不可移动,右边不可移动 不能移动
if (((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 ))
&& ((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==7 )))
{
if (m_Player[0].x%40 == 0)
{
if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 )
{
// 正上方是箱子,推
done = CAN_PUSH;
}
else if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 )
{
// 正上方是泡泡,踢
done = CAN_KICK;
}
}
else if (m_Player[0].x%40 < 20)
{
m_Player[0].way = WAY_LEFT;
done = CAN_MOVE; // 向左边偏移
}
else
{
m_Player[0].way = WAY_RIGHT;
done = CAN_MOVE; // 向右边偏移
}
}
if (((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 ))
&& !((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==7 )))
{
if (m_Player[0].x%40 == 0)
{
if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 )
{
// 正上方是箱子,推
done = CAN_PUSH;
}
else if (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 )
{
// 正上方是泡泡,踢
done = CAN_KICK;
}
}
else if (m_Player[0].x%40 <= 30)
{
m_Player[0].way = WAY_LEFT;
done = CAN_MOVE; // 向左边偏移
}
}
if ( !((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].type ==7 ))
&& ((m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==2 ) || (m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40+1].type ==7 )))
{
if (m_Player[0].x%40 >= 10)
{
m_Player[0].way = WAY_RIGHT;
done = CAN_MOVE; // 向右边偏移
}
}
}
}
}
test = done;
if (done == CAN_MOVE)
{
m_Player[0].status = STATUS_MOVE; // 设置移动标志
m_Player[0].counter = m_Player[0].step / m_Player[0].speed; // counter此处表示需要多少桢
if (m_Player[0].step % m_Player[0].speed != 0)
{
m_Player[0].counter++;
}
}
else if (done == CAN_PUSH)
{
m_Player[0].presswaykey++;
if (m_Player[0].presswaykey>40)
{
// 设置推箱子标志
if (m_Player[0].x %40 < 10)
{
if (((m_Player[0].y-40)/40 != 0) && ((m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40].type == 0) || (m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40].type == 8) || (m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40].type == 9)))
{
m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].counter = 40;
m_ScreenItem[(m_Player[0].y-40)/40][m_Player[0].x/40].way = m_Player[0].way;
}
}
else
{
if (((m_Player[0].y-40)/40 != 0) && ((m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40+1].type == 0) || (m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40+1].type == 8) || (m_ScreenItem[(m_Player[0].y-80)/40][m_Player[0].x/40+1].type == 9)))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -