📄 runningstate.cs
字号:
using System;
using System.Windows.Forms;
using DiamondPet.UserLayer;
using System.Collections;
using System.Drawing;
namespace DiamondPet.LogicLayer.GameStateRunLogic
{
/// <summary>
/// RunningState 的摘要说明。
/// 游戏状态
/// </summary>
public class RunningState
{
/// <summary>
/// 状态管理器的引用
/// </summary>
public RunStateManager runStateManager;
/// <summary>
/// 算法类
/// </summary>
public GameStrategy gameStrategy;
/// <summary>
/// 命令队列
/// </summary>
public GameQueue runCommandQueue;
public RunningState()
{}
public RunningState(RunStateManager r)
{
runStateManager = r;
//算法类实例
gameStrategy = new GameStrategy(runStateManager.gameDate);
//定义命令队列的长度为100
runCommandQueue = new GameQueue(100);
}
/// 加入命令
public virtual void AddKeyCommand(Keys key,bool isdown)
{}
public virtual void RunStateLogic()
{}
/// <summary>
/// 每个类所必须的初始化工作,主要作用在状态转化时
/// </summary>
public virtual void Initialize(){}
#region 画界面
protected virtual void DrawAll()
{
}
/// <summary>
/// 画主界面
/// </summary>
public void DrawMainBg()
{
Draw.DrawTempImage(Pictures.picturesImage[GameConstResource.mainbg],GameConstResource.mainbgX,GameConstResource.mainbgY);
// Draw.DrawImage(Pictures.picturesImage[GameConstResource.mainbg],
// GameConstResource.mainbgX + runStateManager.gameDate.curGameItems.CurGameItemsPos.Y * GameConstResource.BlockWidth,
// GameConstResource.minorbgY,
// GameConstResource.BlockWidth,
// 220,
// GameConstResource.mainbgX + runStateManager.gameDate.curGameItems.CurGameItemsPos.Y * GameConstResource.BlockWidth,
// 0,
// GameConstResource.BlockWidth,
// 220);
}
/// <summary>
/// 画次界面
/// </summary>
public void DrawMinorBg()
{
Draw.DrawTempImage(Pictures.picturesImage[GameConstResource.minorbg],GameConstResource.minorbgX,GameConstResource.minorbgY);
}
/// <summary>
/// 绘制信息汇总
/// </summary>
public void DrawSelfInfor()
{
Draw.DrawImage(Pictures.picturesImage[2],GameConstResource.inforX,GameConstResource.inforY);
}
/// <summary>
/// 画动的方块
/// </summary>
public void DrawMoveBlock()
{
int i,j;
i = this.runStateManager.gameDate.curGameItems.CurGameItemsPos.X;
j = this.runStateManager.gameDate.curGameItems.CurGameItemsPos.Y;
for(int t = 0; t < this.runStateManager.gameDate.curGameItems.ItemLen; ++t)
{
//modified by hearmin on 2005.3.5
if(this.runStateManager.gameDate.curGameItems[t] == null)
break;
Draw.DrawImage(
Pictures.picturesImage[this.runStateManager.gameDate.curGameItems[t].ObjectId],
GameConstResource.gameFrameX + j * GameConstResource.BlockWidth,
GameConstResource.gameFrameY + i * GameConstResource.BlockHeight,
GameConstResource.BlockWidth,
GameConstResource.BlockHeight,
0,0,GameConstResource.BlockWidth,GameConstResource.BlockHeight
);
if ( this.runStateManager.gameDate.curGameItems[t].IsProperty() == true)
{
Draw.DrawImage(
Pictures.picturesImage[this.runStateManager.gameDate.curGameItems[t].BackColorId],
GameConstResource.gameFrameX + j * GameConstResource.BlockWidth + (GameConstResource.BlockWidth - GameConstResource.PropertyNormalWidth)/2,
GameConstResource.gameFrameY + i * GameConstResource.BlockHeight + (GameConstResource.BlockHeight - GameConstResource.PropertyNormalHeight)/2,
GameConstResource.PropertyNormalWidth,
GameConstResource.PropertyNormalHeight,
0,0,
GameConstResource.BlockWidth,GameConstResource.BlockHeight
);
}
i--;
}
}
//建议加个最高点的坐标,如果过了最高点就退出,用于简化操作,因为每次都空循环了很多
public void DrawMainBlock()
{
for (int i = 0; i < GameConstResource.BlockFrameHeight; i++)
{
for (int j = 0; j < GameConstResource.BlockFrameWidth; j++)
{
if ( this.runStateManager.gameDate.gFrame.gameFrame[i,j] != null)
{
Draw.DrawTempImage(
Pictures.picturesImage[this.runStateManager.gameDate.gFrame.gameFrame[i,j].ObjectId],
GameConstResource.gameFrameX + j * GameConstResource.BlockWidth,
GameConstResource.gameFrameY + i * GameConstResource.BlockHeight,
GameConstResource.BlockWidth,
GameConstResource.BlockHeight,
0,0,GameConstResource.BlockWidth,GameConstResource.BlockHeight
);
if ( this.runStateManager.gameDate.gFrame.gameFrame[i,j].IsProperty() &&
this.runStateManager.gameDate.gFrame.gameFrame[i,j].curObjectState != GameObject.ObjectState.Cleared)
{
Draw.DrawTempImage(
Pictures.picturesImage[this.runStateManager.gameDate.gFrame.gameFrame[i,j].BackColorId],
GameConstResource.gameFrameX + j * GameConstResource.BlockWidth + (GameConstResource.BlockWidth - GameConstResource.PropertyNormalWidth)/2,
GameConstResource.gameFrameY + i * GameConstResource.BlockHeight + (GameConstResource.BlockHeight - GameConstResource.PropertyNormalHeight)/2,
GameConstResource.PropertyNormalWidth,
GameConstResource.PropertyNormalHeight,
0,0,GameConstResource.BlockWidth,GameConstResource.BlockHeight
);
}
}
}
}
}
/// <summary>
/// 画分数
/// </summary>
public void DrawScore()
{
string score;
score = this.runStateManager.gameDate.gameScore.Score.ToString();
for(int i = 0;i < score.Length;++i)
{
Draw.DrawImage(Pictures.picturesImage[GameConstResource.scorePic]
,GameConstResource.scorePosX + i * GameConstResource.eachNumberWidth
,GameConstResource.scorePosY
,GameConstResource.eachNumberWidth
,GameConstResource.eachNumberHeight
,(Convert.ToInt32(score[i]) + 1) % 10 * GameConstResource.eachNumberWidth
,0
,GameConstResource.eachNumberWidth
,GameConstResource.eachNumberHeight
);
}
}
public void DrawPropetyBar()
{
ArrayList arr = this.runStateManager.gameDate.propertyQueue.Queue;
LogicLayer.PropertyObject tp = this.runStateManager.gameDate.propertyQueue.CurQueueObject as PropertyObject;
if ( this.runStateManager.gameDate.propertyQueue.IsEmpty == false)
{
//选中的道具,特大显示
Draw.DrawImage(Pictures.picturesImage[tp.BackColorId],
GameConstResource.PropertyBarX,
GameConstResource.PropertyBarY ,
GameConstResource.PropertyBigWidth,
GameConstResource.PropertyBigHeight,
0,0,
GameConstResource.PropertyBigWidth,
GameConstResource.PropertyBigHeight
);
int idx = runStateManager.gameDate.propertyQueue.StartIndex;
if ( idx > 0 && arr[ idx - 1] != null )
{
tp = arr[idx - 1] as PropertyObject;
Draw.DrawImage(Pictures.picturesImage[tp.BackColorId],
GameConstResource.PropertyEchoLeftLeft,
GameConstResource.PropertyEchoTop,
GameConstResource.PropertyNormalWidth,
GameConstResource.PropertyNormalHeight,
0,0,
GameConstResource.PropertyBigWidth,
GameConstResource.PropertyBigHeight
);
}
if ( idx + 1 < runStateManager.gameDate.propertyQueue.QueueSize && arr[ idx + 1] != null)
{
tp = arr[idx + 1] as PropertyObject;
Draw.DrawImage(Pictures.picturesImage[tp.BackColorId],
GameConstResource.PropertyEchoLeftRight,
GameConstResource.PropertyEchoTop,
GameConstResource.PropertyNormalWidth,
GameConstResource.PropertyNormalHeight,
0,0,
GameConstResource.PropertyBigWidth,
GameConstResource.PropertyBigHeight
);
}
}
}
public void DrawLevel()
{
Draw.DrawString(this.runStateManager.gameDate.updateOrWL.CurrentLevel.ToString(),
Color.Red,
GameConstResource.drawLevelPosX,
GameConstResource.drawLevelPosY);
GameObject[] tempObject = (GameObject[])this.runStateManager.gameDate.nextItemsQueue.Top();
//画下一块
int startPoxY = GameConstResource.startY + (GameConstResource.endY - GameConstResource.startY - GameConstResource.BlockWidth * tempObject.Length) / 2;
for(int i = tempObject.Length - 1;i >=0 ;--i)
{
Draw.DrawImage(Pictures.picturesImage[tempObject[i].ObjectId],
GameConstResource.posX,startPoxY + (tempObject.Length - i - 1) * GameConstResource.BlockWidth,GameConstResource.BlockWidth,GameConstResource.BlockHeight,0,0,GameConstResource.BlockWidth,GameConstResource.BlockHeight);
if(tempObject[i].IsProperty())
{
Draw.DrawImage(Pictures.picturesImage[tempObject[i].BackColorId],
GameConstResource.posX,startPoxY + (tempObject.Length - i - 1) * GameConstResource.BlockWidth,GameConstResource.BlockWidth,GameConstResource.BlockHeight,0,0,GameConstResource.BlockWidth,GameConstResource.BlockHeight);
}
}
//是否是时间模式
if(this.runStateManager.gameDate.timeControl.GameTime >= 0)
{
//画剩下多少时间
Draw.DrawString(this.runStateManager.gameDate.timeControl.ReturnMiniter().ToString()+":",Color.Blue,119,195);
Draw.DrawString(this.runStateManager.gameDate.timeControl.ReturnSecond().ToString(),Color.Blue,137,195);
}
else
{
Draw.DrawString("不限时",Color.Blue,114,195);
}
//画要到多少分升级
if(this.runStateManager.gameDate.updateOrWL.CurrentLevel < 7)
{
Draw.DrawString(this.runStateManager.gameDate.updateOrWL.NextLevelScore().ToString(),Color.Yellow,51,3);
}
else
{
Draw.DrawString("恭喜你已通版",Color.Yellow,51,3);
}
}
#endregion
#region 合并块
/// <summary>
/// 合并移动块和静止块
/// </summary>
protected void CombineBlock()
{
this.runStateManager.gameDate.curGameItems.PutItems();
}
protected bool CheckClearBlock()
{
bool bret = false;
for ( int i = 0; i < GameConstResource.BlockFrameWidth; i++)
{
for ( int j = runStateManager.gameDate.gFrame.highestBlock[i]; j < GameConstResource.BlockFrameHeight; j++)
{
if ( gameStrategy.CheckValid(j,i,runStateManager.gameDate.gFrame) == true)
{
if ( runStateManager.gameDate.gFrame.gameFrame[j,i].IsProperty() == true)
{
//被消去的是闪电
if ( runStateManager.gameDate.gFrame.gameFrame[j,i].BackColorId == GameConstResource.LightenBlockIndex)
{
((PropertyObject)runStateManager.gameDate.gFrame.gameFrame[j,i]).UseProperty(this);
}
else
{
runStateManager.gameDate.propertyQueue.AddElement(
PropertyObject.PropertyFactory(
runStateManager.gameDate.gFrame.gameFrame[j,i].BackColorId,
runStateManager.gameDate.gFrame.gameFrame[j,i].ObjectId)
);
}
}
//将被消方块的坐标加入队列
if ( runStateManager.gameDate.gFrame.gameFrame[j,i].curObjectState !=
GameObject.ObjectState.Cleared)
{
this.runStateManager.gameDate.ClearBlockList.Add(new System.Drawing.Point(j,i));
runStateManager.gameDate.gFrame.gameFrame[j,i].curObjectState =
GameObject.ObjectState.Cleared;
}
bret = true;
}
}
}
return bret;
}
#endregion
#region 检查命令
/// <summary>
/// 检查命令
/// </summary>
protected void CheckCommand()
{
while( !runCommandQueue.IsEmpty)
{
((Command)runCommandQueue.GetElement()).ExecuteCommand();
}
}
#endregion
#region 判断生死
public bool IsDie()
{
for(int i = 0;i < GameConstResource.BlockFrameWidth;++i)
{
if(this.runStateManager.gameDate.gFrame.GetRowIndex(i)
<= GameConstResource.dieX)
{
return true;
}
}
return false;
}
/// <summary>
/// 判断时间是否已经到了
/// </summary>
public void JudgeTimeOver()
{
if(this.runStateManager.gameDate.timeControl.IsTimeOver())
{
//时间到了以后转入结束状态
this.runStateManager.ChangeState(RunStateManager.LOSTORWIN);
}
}
#endregion
#region 下落速度判断
protected void CheckSlowSpeed()
{
if (runStateManager.gameDate.useSlowSpeed == true &&
runStateManager.gameDate.curSlowTime - runStateManager.gameDate.timeControl.GameTime > GameConstResource.SlowDownTimeContinued)
{
runStateManager.gameDate.useSlowSpeed = false;
GameConstResource.currentSpeed = runStateManager.gameDate.savedSpeed;
}
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -