两个窗体的性能和资源重新分配使用情况,而一个窗体带有切换情况
本文关键字:窗体 情况 用情 一个 性能 两个 资源 分配 新分配 | 更新日期: 2023-09-27 18:24:44
我正在编写一个没有鬼魂的简单pacman游戏。所以只有一个象征作为玩家,一些墙壁和物品。
现在我想选择是自己用箭头键玩游戏,还是自动解决。用户玩游戏的形式是完整的。现在,我应该创建一个新的Form(Paint
事件和Load
事件的代码相同),只更改必须更改的内容,还是应该通过切换案例决定将所有代码放在一个Form中?
我通过PreviewKeyDown事件捕获目录,并将其保存到字符串变量"direction"中。然后启动计时器来降低玩家的一般移动速度。
private void Game_Form_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
//Unterscheide nach Richtung und kontrolliere ob in dieser Richtung Wand ist
switch (e.KeyCode)
{
case Keys.Up:
if (maze[pos_player_index.Item1, pos_player_index.Item2 - 1] == '#')
{
break;
}
else
{
key = "up";
}
break;
.
.
.
}
//Starte Timer Bewegungsgeschwindigkeit t_move
t_move.Start();
}
然后在OnTickEvent中,我决定如何处理玩家的符号,并检查是否有墙。然后我为玩家呼叫刷新。迷宫本身只在全局绘制事件中,因此只绘制一次。
void t_move_Tick(对象发送方,EventArgs e){//Hilfsvariable的Richtung Unterscheiden der Richtung(例如Möglichkeit的Komentieren)开关(钥匙){
case "up":
//Setzen des neuen Index
pos_player_index = new Tuple<int, int>(pos_player_index.Item1, pos_player_index.Item2 - 1);
//Überschreiben des Zeichens im Labyrinth durch Leerzeichen -> aufgesammelt
maze[pos_player_index.Item1, pos_player_index.Item2] = ' ';
//Neuzeichnen der Spielfigur
p_player.Refresh();
break;
因此,图形和控制的代码是完全不同的。
正如其他人所提到的,复制代码是个坏主意——突然之间,您将不得不实现两次所有更改。
有许多方法可以分离程序中的功能。
目前,最简单的方法是使当前表单成为执行"共享"功能的abstract class PacmanForm
,并具有class UserPacmanForm : PacmanForm
和class RobotPacmanForm : PacmanForm
。
但是我不认为winforms设计器那么喜欢抽象类。如果您希望能够使用设计器,请在尝试之前创建项目的备份。
另一种选择是将公共代码移动到一个单独的PacmanGame
类,例如,该类具有以下方法:
- 构造函数,可能是您当前在
Form.Load
事件处理程序中的代码 - 一种渲染游戏的
Render(Graphics g)
方法 - 处理移动的
Move(Direction d)
方法
然后,您可以创建两个单独的表单,这两个表单都使用PacmanGame
实例。
PS。我在回答中没有把重点放在性能上,因为性能在这里不是问题。瓶颈很可能是绘制游戏的代码。