【程式設計】【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; }