两个表单与一个表单的性能和资源使用情况

时间:2015-11-26 08:43:16

标签: c# winforms performance

我正在编写一个没有幽灵的简单pacman游戏。所以只有象征作为玩家,一些墙壁和物品。

现在我想选择是否自己用箭头键来玩游戏,或者自动解决。 用户玩游戏的表格已完成。 现在我应该创建一个新表单(具有Paint事件和Load事件的相同代码)并仅更改必须更改的内容,或者我应该通过switch case决定将所有代码放在一起一个表格?

我通过PreviewKeyDown事件捕获dircetion并将其保存到字符串变量“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中我决定如何处理玩家的符号并检查是否有墙。然后我为玩家调用Refresh。 迷宫本身只在全局绘画事件中,因此只绘制一次。

void t_move_Tick(对象发送者,EventArgs e)         {             // Unterscheiden der Richtung durch Hilfsvariable(范例KommentiereneinerMöglichkeit)             开关(键)             {

            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;

因此,图形和控制的代码严格不同。

1 个答案:

答案 0 :(得分:0)

正如其他人所提到的,复制代码是一个坏主意 - 突然间你必须实现所有更改两次

有很多方法可以分离程序中的功能。

目前,最简单的方式是让您当前的表单成为执行“共享”功能的abstract class PacmanForm,并拥有class UserPacmanForm : PacmanFormclass RobotPacmanForm : PacmanForm

然而我认为winforms设计师不太喜欢抽象类。如果您希望能够在尝试之前使用设计器,创建项目的备份

另一种方法是将公共代码移动到单独的PacmanGame类,例如,具有以下方法:

  • 构造函数,可能是您Form.Load事件处理程序
  • 中当前的代码
  • 呈现游戏的Render(Graphics g)方法
  • 处理移动的Move(Direction d)方法

然后,您可以创建两个使用PacmanGame实例的单独表单。

PS。在我的回答中我没有关注性能,因为性能在这里不是问题。瓶颈很可能是绘制游戏的代码。