繪制精靈
1.我們需要創建一個新的精靈(如何創建精靈請參照官方教程)隨意繪制一個圖形
2.設置好中心點為精靈的中心(如果中心點設置不是正中間的話,調整方向的時候會看起來怪怪的,事后可以自行改變來看看效果)
</br></br>
分析思路
我們的需求:是利用鼠標的每次點擊來使得目標移向鼠標點擊位置
由此我們可以得出以下需要解決的問題:
● 條件【鼠標點擊】,可得出以下結論:
1.鼠標按下直到松開算1下(點擊狀態)
2.鼠標按下直到松開游戲運行的每幀算1下(按壓狀態)
● 過程【移向點擊位置】,可得出以下結論:
1.通過一定速度移動到指定坐標
● 結果【到達點擊位置】,可得出以下結論:
1.到達位置后需要停止
</br></br>
實現過程
創建對象
創建一個新的對象并且綁定之前繪制的精靈(詳細方法見官方教程)
</br></br>
申明變量
申明不需要每幀都重置的一些變量,通過【事件 → 創建】在對象生成實例時申明變量。
需要申明的變量,輸入如下代碼(在自己寫編寫的時候不必要一次性把所有變量都書寫完畢,可以盡量先寫出來,之后用到一個新的在此添加一個即可):
mouse_site_x = x; //鼠標點擊時的X坐標
mouse_site_y = y; //鼠標點擊時的X坐標
tmp_x = mouse_site_x; //臨時存儲X坐標,用以判斷需要到達坐標的變化來改變實例方向
tmp_y = mouse_site_y; //臨時存儲X坐標,用以判斷需要到達坐標的變化來改變實例方向
move_time = 30; //代表移動的時間
constant_speed_x = 0; //x軸位移的速度
constant_speed_y = 0; //y軸位移的速度
</br></br>
運動與停止
1.首先我們要記錄下鼠標點擊狀態下的X、Y坐標點。
方法1:GMS自帶事件接口判斷鼠標點擊,在這里必須使用全局鼠標事件,非全局鼠標事件只有點擊到當前對象的實例上才有效。(注:選擇全局鼠標事件后,同一對象上的非全局鼠標事件將無效化)
</br>
在其中添加如下代碼:
mouse_site_x = mouse_x; //賦值鼠標X坐標
mouse_site_y = mouse_y; //賦值鼠標Y坐標
</br>
方法2:使用函數接口寫在【事件 → 步】里面:
if mouse_check_button(mb_left) //按下鼠標后每一幀都會檢測,注意:兩種方式2選1
{
mouse_site_x = mouse_x;
mouse_site_y = mouse_y;
}
if mouse_check_button_pressed(mb_left) //點擊1次鼠標算一次,注意:兩種方式2選1
{
mouse_site_x = mouse_x;
mouse_site_y = mouse_y;
}
</br>
2.處理位移速度
方法1:勻速移動,方法是在每次賦值終點坐標時計算X,Y的速度。需要在之前的賦值代碼中加入速度X、Y軸移動速度的計算,以下采用1中的方法2續寫(方法1直接加入新增代碼即可)
if mouse_check_button(mb_left)
{
mouse_site_x = mouse_x; //賦值X坐標
mouse_site_y = mouse_y; //賦值Y坐標
constant_speed_x = (mouse_site_x - x)/move_time; //勻速時x位移的速度
constant_speed_y = (mouse_site_y - y)/move_time; //勻速時y位移的速度
}
if mouse_check_button_pressed(mb_left)
{
mouse_site_x = mouse_x; //賦值X坐標
mouse_site_y = mouse_y; //賦值Y坐標
constant_speed_x = (mouse_site_x - x)/move_time; //勻速時x位移的速度
constant_speed_y = (mouse_site_y - y)/move_time; //勻速時y位移的速度
}
</br>
方法2:變速運動,方法是每一幀都會根據一些條件來動態改變速度。直接在if完結之后加入計算公式。
constant_speed_x = (mouse_site_x - x)/move_time; //x位移的速度
constant_speed_y = (mouse_site_y - y)/move_time; //y位移的速度
<br /><br /><br />
3.處理位移
步驟2算出來的X、Y的速度合起來即為物體當前幀的速度,那么直接針對X、Y的位置進行每幀移動即可
if x != mouse_site_x x += constant_speed_x; //位置重疊前一直保持位移
if y != mouse_site_y y += constant_speed_y; //位置重疊前一直保持位移
</br>
4.旋轉方向處理
由于是直線運動只需要在每次終坐標改變時改變旋轉角度即可:
if tmp_x != mouse_site_x || tmp_y != mouse_site_y
{
image_angle = point_direction(x, y, mouse_site_x, mouse_site_y); //改變旋轉角度
tmp_x = mouse_site_x; //重置臨時變量
tmp_y = mouse_site_y; //重置臨時變量
}
</br>
采用全局變速位移時在【事件 → 步】中的最終代碼
if mouse_check_button_pressed(mb_left) //點擊1次鼠標算一次,注意:兩種方式2選1
{
mouse_site_x = mouse_x;
mouse_site_y = mouse_y;
constant_speed_x = mouse_site_x - x; //勻速時x位移的速度
constant_speed_y = mouse_site_y - y; //勻速時y位移的速度
}
constant_speed_x = (mouse_site_x - x)/move_time; //x位移的速度
constant_speed_y = (mouse_site_y - y)/move_time; //y位移的速度
if x != mouse_site_x x += constant_speed_x;
if y != mouse_site_y y += constant_speed_y;
if tmp_x != mouse_site_x || tmp_y != mouse_site_y
{
image_angle = point_direction(x, y, mouse_site_x, mouse_site_y);
tmp_x = mouse_site_x;
tmp_y = mouse_site_y;
}
本次教程到此結束,有任何疑問和意見可以留言或者Q群詢問
教程中源文件百度網盤
提取密碼:3v5b