【程式設計】【C#】【遊戲設計】馬力歐跳跳跳

【素材下載】

在遊戲進行時,當玩家按了空白鍵或上鍵,可以讓馬力歐角色往上跳,到頂後落地。

為了要完成這樣的動作,我們把「馬力歐角色往上跳,到頂後落地」這個動作用計時器元件來完成,將計時器元件拖曳至表單:

下一步,在計時器的Tick事件處理函式中處理馬力歐的跳躍動作:

int 角色移動量 = 15; 
private void timer1_Tick(object sender, EventArgs e)
{
    角色.Top -= 角色移動量; //向上移動,也就是往上跳的意思
    if (角色.Top < 50) 角色移動量 = 0 - 角色移動量; //當馬力歐跳到頂時,將角色移動量變負,使得馬力歐往下移動,也就是落地

    if (  (角色.Top +角色.Height + 20) > 遊戲背景.Height ) {  //當馬力歐腳著地時…,20是地上磚塊的高度              
        角色移動量 = 0 - 角色移動量; //著地時,轉變移動的方向
        timer1.Enabled = false; //計時器timer1關閉
    }
}

計時器每跳一次(一個滴答),讓馬力歐以垂直的方向移動,往上是將其Top進行減的動作,往下則是將其Top進行加的動作。

我們設置一個到頂的位置為50,當馬力歐這個角色的元件位置(Top)一直減到小於50時,表示到頂,要進行落地的處理。

落地的處理只要將角色移動量變個號就行了…

然後,落地後,就關閉掉計時器,表示停止移動。

以上是計時器處理馬力歐角色跳與落地的想法與程式作法。

接下來,就是判斷是否按了空白鍵與上鍵,是的話,就啟動計時器,由計時器每隔一段時間,進行馬力歐的垂直移動,以完成跳躍與落地的連續性動作。

if (e.KeyCode == Keys.Space || e.KeyCode == Keys.Up) //按下空白鍵或上鍵的時候…
{
    timer1.Enabled = true;     //計時器timer1打開,由計時器來負責馬力歐的跳躍與落地的位置變換
}

整支程式列表如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MarionRunRunRun
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            角色.Parent = 遊戲背景;  //將角色圖片方塊的Parent屬性設為遊戲背景圖片方塊,Parent表示上一層,父層…
            遊戲背景.BackColor = Color.Transparent; //將戲背景的BackColor設為透明,
        }

        int 移動量 = 10;

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Right && 遊戲背景.Left > (this.ClientSize.Width - 遊戲背景.Width)) //按了右鍵的話 而且 …
            {
                角色.Location = new Point(角色.Location.X + 移動量, 角色.Location.Y); //一旦角色的Parent屬性設為遊戲背景圖片時,角色圖片會跟著跑,因此,需要進行水平位置的移動,使得角色保持中間位置
                遊戲背景.Left -= 移動量; //背景向左                       
            }
            if (e.KeyCode == Keys.Left && 遊戲背景.Left < 0) //按了左鍵的話 而且 遊戲背景.Left 超過 畫面左邊的情況下
            {
                角色.Location = new Point(角色.Location.X - 移動量, 角色.Location.Y);
                遊戲背景.Left += 移動量; //背景向右                
            }
            if (e.KeyCode == Keys.Space || e.KeyCode == Keys.Up) //按下空白鍵或上鍵的時候…
            {
                timer1.Enabled = true;     //計時器timer1打開,由計時器來負責馬力歐的跳躍與落地的位置變換
            }
        }

        int 角色移動量 = 15; 
        private void timer1_Tick(object sender, EventArgs e)
        {
            角色.Top -= 角色移動量; //向上移動,也就是往上跳的意思
            if (角色.Top < 50) 角色移動量 = 0 - 角色移動量; //當馬力歐跳到頂時,將角色移動量變負,使得馬力歐往下移動,也就是落地

            if (  (角色.Top +角色.Height + 20) > 遊戲背景.Height ) {  //當馬力歐腳著地時…,20是地上磚塊的高度              
                角色移動量 = 0 - 角色移動量; //著地時,轉變移動的方向
                timer1.Enabled = false; //計時器timer1關閉
            }
        }
    }
}

 

 

課外補充

按下空白鍵…,要如何防止再次進行空白鍵的處理? 一個作法就是設置一個旗標isPressed,初值為false,進入空白鍵的判斷加上這個旗標必須為false,當進入空白鍵處理時,立刻設此旗標為true,防止再次進入。

在另一個事件KeyUp,將這個旗標設為false…

private bool isPressed = false;
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if(e.KeyCode == Keys.Space && !isPressed )
    {
        isPressed = true;
        // do work
    }
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    if (isPressed )
        isPressed = false;
}

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料