<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] * * * * * ## 對象編輯器(Object Editor) ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-09-55-39.png) 對象(Object)是我們在游戲中使用的以及用來做各種操作的一切的基礎組件。大部分情況下對象都會有一個對應的精靈(Sprite),以方便我們在游戲場景中可以看到對象本身,但也有些情況下它們會被放到幕后而不顯示出來,只是作為控制器來處理一些特殊的事件或用于計時之類的操作,對象可以被賦予一些行為操作,也可以與其他對象發生交互事件,事實上你在游戲中看到的大部分內容都是基于不同對象之間的交互所產生的結果。而我們說“基于”是因為我們其實并沒有吧對象直接放進游戲場景中,游戲中你看到的是對象的實例,一個實例可以理解成是對象資源的副本(或克隆體)。你需要牢記這一點,因為實例和對象本身是不一樣的,它們各自擁有自己的一套函數來作用于它們本身。 為了搞明白這一點,請仔細思考一下GameMaker Studio 2制作的游戲。所有的角色、怪物、球、墻壁等等都只是你在資源樹中所創建的對象。你可以在“場景編輯器”中把對象放進對應的游戲場景,以對象為模版創建出實例。實例會根據編輯器中書寫的代碼實現相應的調整,比如縮放尺寸或著色,或其它基于對象模版的其它屬性。所以當我們說有些東西會影響或改變一個實例時,我們其實是說一個對象在這個場景內的一個實例會發生變化。只有那一個實例會變化,其余實例則不受影響。但是,如果我們對對象本身進行操作和修改,那意味著我們修改了資源樹中的對象本身,這種操作會影響所有由這個對象所產生的實例。因此,對象其實就是實例的模版,而實例才真正參與到我們的場景中來用于制作游戲。 要在游戲中創建對象,你只需要在對象資源文件夾上點擊鼠標右鍵然后選擇“創建(Create)”選項即可,這會打開下面的窗口: ### 詳情(Details) 這這個窗口中你可以給對象起個名字,名稱中不能包含空格或非法字符(僅允許字母和數字以及下劃線“_”符號),并且應該簡單明了容易記住,以提高之后使用過程中的辨識度,畢竟你可能會創建大量的對象。比如很多人喜歡用前綴或后綴來區分不同的資源類型,好比“obj_Ship”和“Ship_obj”之類。 接下來你可以為對象選擇一個用于顯示的精靈,在精靈選項上點擊鼠標左鍵會彈出一個**素材選擇器**(Asset Explorer),里面會顯示出資源樹中所有的精靈組件: ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-09-57-06.png) 當你選好指定給對象的精靈后,點擊![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-09-12-58-08.png)按鈕就可以直接修改精靈各項屬性,如果你沒有事先準備給該對象實用的精靈,也可以點擊![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-09-12-59-22.png)圖標來直接新建一個精靈并直接指定給這個對象。你還可以單擊編輯圖像的按鈕![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-09-13-00-23.png)來啟動圖像編輯器直接編輯精靈的圖像內容。 ### 碰撞蒙版(Collision Mask) 在精靈區域下方有一個按鈕可以指定對象的碰撞蒙版。通常情況下對象的碰撞蒙版默認是與其精靈的保持一致的,但在一些特殊情況下,你可能希望設置一個不同的蒙版形狀。比如說你做一個上下游戲時可能角色的精靈用了矩形碰撞蒙版,但是使用圓形的碰撞蒙版會更加平滑,這種情況下你可以單擊“碰撞蒙版(Collision Mask)”然后選擇一個新的精靈資源,此時這個對象的實例會表現為之前指定的精靈資源的造型,但是基于新設置的這個精靈資源的碰撞蒙版來檢測碰撞事件。 ### 屬性(Properties) 這里涵蓋了對象的四項基本屬性 #### 可見性(Visible) 這個屬性代表了當游戲場景啟動時,該實例是否可見,大多數情況下都是默認可見的,但有的時候也會用的不可見資源——比如,你可以用不可見的對象設置路徑點來控制怪物的移動,或做一些計時操作。隱形的對象仍然可以正常執行各事件中的代碼,如果設置了碰撞蒙版則也能正常與其他對象實例發生碰撞觸發事件……你只是看不到它們,它們不盡興任何繪制的操作。默認情況下這個選項是選中的。 #### 固體(Solid) 當你勾選了固體的選項后,就意味著這個對象會在觸發碰撞事件之前就完成碰撞行為。這其實是個很簡單功能,它所做的只是在實例發生碰撞事件的瞬間,在執行任何碰撞事件中的代碼之前就把它放回碰撞發生前所處的位置上,因此需要謹慎使用。 #### 持久化(Persistent) **持久化**——一個持久化的對象是不會隨著游戲場景的變化而消失的,它會一直存在并跟著跳轉到新的游戲場景中。如果你不明確的銷毀或通過代碼要求它執行銷毀操作,它永遠不會消失。這意味著一旦在場景中使用一個持久化對象,它就可以貫穿全程在游戲中進行使用,而且持續執行屬性中各類事件里的代碼,“創建(Create)”事件除外,因為這個事件只有當對象實例首次生成時才觸發,變換游戲場景并不會處罰這個事件。 #### 使用物理特性(Uses Physics) 當你勾選“使用物理特性(Uses Physics)的選項時,GameMaker Studio 2 就會使這個對象具備物理特性。勾選這個選項后會打開一個新的窗口,在該窗口中你可以定義該對象的物理屬性,其生成的實例都會繼承這些屬性。關于這塊的內容在后文中“物理特性”一節會詳細說明。 ## 選項(Option) 選項部分可以定義對象的各項屬性,以及游戲場景內生成的實例的行為方式。在這里你可以添加事件——即游戲代碼的“構建模塊”,設置對象是否具有父類,如果需要制作帶物理屬性的游戲也可以在此進行配置。 ### 事件(Event) 那么事件到底是什么?基本而言,就是在游戲過程中,你通過代碼實現的觸發某些操作的觸發條件。在GameMaker Studio 2中,從一個游戲場景開始到結束,會不停循環監測游戲步驟進程(步驟進程是一個單位的游戲時間,單位屬性可在游戲場景的速度設置中控制)來判斷是否有事件被觸發,然后你就可以把你的代碼或拖拽代碼塊(DnD Action)放到這些事件中運行,讓我們用一個包含事件和代碼的例子來說明以上內容: ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-01-31.png) 你在我們的示例中可以看到列表中有很多響應事件,但當你首次創建對象時這個列表是空白的,你必須清楚自己需要哪些事件,以及這些事件被觸發時實例該作出怎樣的反應。要往這列表中添加事件,你需要點擊事件列表底部的”添加事件(Add Event)“按鈕,會彈出下面這個窗口: ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-01-39.png) 這是一個對象可以響應的基礎事件列表,其中有一些事件還有更細化的子事件,比如你選擇按鍵事件后可以進一步選擇具體響應哪一個按鍵。一旦選擇了響應事件,會在右側創建出一個代碼窗口,你可以在此編輯代碼,給對象賦予針對該事件所需要作出的響應操作。 在任何事件上單擊鼠標右鍵都可以看到以下選項: ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-01-46.png) **添加事件(Add Event)**——從事件列表添加新事件 **剪切/復制/粘貼事件(Cut/Copy/Paste Event)**——剪切、復制(到粘貼板)或者粘貼所選事件,可以使用標準的快捷鍵:Ctrl + X ,Ctrl + C ,Ctrl + V **復刻事件(Duplicate Event)**——復制所選事件內所有的內容并直接塞進你指定的新事件中 **更換事件(Change Event)**——這會提示你重新選擇一次觸發事件,選擇以后觸發事件會被替換成新的事件 **轉換為拖放/代碼模式(Change to Drag&Drop/GML)**——把當前事件的編程模式在拖放模式或GML代碼模式之間進行切換 **刪除事件(Delete Event)**——刪除當前事件,還可以用Shift和鼠標左鍵一次選擇多個事件同時刪除 你還要注意,你可以重新給事件命名,或至少寫個備注,備注會在編輯器旁顯示,備注方式如下,把這行內容寫到編輯器第一行即可: > /// @description Your text here (這里寫備注) 比如你可以這樣命名一個計時事件: > /// @description This is the AI Fight alarm 然后你會看到事件編輯器里是這樣顯示的: ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-01-52.png) 請注意,以上的事件只是簡要描述了工作原理,所有可用事件的詳細信息需要去對象事件列表詳細查看。 ### 父類(Parent) 在使用GameMaker Studio 2操作對象時,你可以設置父/子類的層級關系。點擊對象編輯器中“父類(Parent)”按鈕就可以打開以下窗口,其中可以選擇其它對象并賦予層級關系 ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-02-06.png) 因此,在游戲項目中所有的對象都可以分配一個父對象,這有什么用呢?當一個對象擁有自己的父對象時,它可以共享父對象的所有代碼、事件以及行為。這種共享稱為“繼承”,擁有父類的對象則稱為“子對象(子類)”。子類不僅共享父類的代碼,而且當你在父類上對代碼進行查看和修改操作后子類將自動同步這些變化,這樣可以節省大量的時間和精力。 如果覺得上面說的太復雜,你可以換一種理解方式,父類就是把一些擁有相同屬性、特征的對象聚合起來,把這些共有的特性集中在一起,又不影響其獨有的屬性特征,如果還是不太理解,來看看下面這個例子… 如下圖所示,假如你有一個“玩家”的對象和四種不同的“敵人”的對象。現在如果玩家對象與任何一個敵人對象發生接觸時就會死亡,通常情況下你需要給玩家對象寫四個不同的碰撞事件來處理跟四種不同的敵人的碰撞事件。但是如果我們給所有的敵人創建同一個父類對象,那么我們就可以給玩家對象與這個父對象寫一個碰撞事件,那么當玩家對象與任意一個敵人對象發生接觸時都會沿用父對象中的碰撞事件來觸發玩家死亡事件。很方便對不對! ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-02-11.png) 在左側,我們做了四個單獨的碰撞事件,而右側我們只有一個,因為我們創建了“父類對象”,并且指定給了所有敵人對象為父類,要注意不用把所有的事件和代碼都寫到父對象里去。 我們再舉一個例子,如果你要在一個游戲中創建10種不同樣子的對象,但是這10種對象的行為操作以及事件完全一致。此時你可以先創建一個父對象,并在其中寫入將所有行為操作相關的事件代碼,然后分別創建10個對象并把父對象設置為這個對象,只需設置不同的精靈資源而不需要處理任何的事件代碼就行了。當你把這些對象放到游戲場景中創建實例后,你會發現它們看似完全不同卻又能執行完全相同的操作事件,因為他們都繼承了父類的事件代碼。 最后,你還可以混合使用該技巧。讓我們用最后一個例子來說明這一點……比如說你想創建兩個怪物,一個是上下移動的,另一個則是左右移動的,但你希望這兩種怪物擁有完全相同的生命值以及在與玩家發生碰撞事件后能觸發完全相同的傷害事件。在這種情況下你會發現兩者大部分時間都是一致的,只有少數的一兩個行動不同,此時我們可以把一個對象設置為另一個的父對象,同時我們也可以定義子對象的個別事件。這些事件會覆蓋父類的相同事件代碼,這代表當滿足該事件觸發條件時,會執行新的事件代碼而不是父類中的相關操作。你也可以通過“inherited”函數來強制調用原父類中被覆蓋的相關代碼。 ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-02-18.png) 上圖中左側是一個寫有5個事件的父對象,右側則可以看到對應的子對象,這個子對象中只定義了2個事件,但是他會繼承父類的事件,所以他其實擁有與之一致的5個相同的事件。區別在于,子對象中“步驟(Step)”和“繪制(Draw)”這兩個事件將覆蓋父類中對應的事件。 如圖所示,不管你在何處使用父對象,同樣會作用于其衍生的對象(子對象),無論你針對任何個特定的實例進行應用都會起效。當你在代碼中使用“with()”語句時也會有相同效果,當你針對父對象調用諸如“instance_position”、“instance_number”等函數時,同時也會對其子對象生效。最后,這個功能對變量的修改也是有效的,比如上圖的例子中,如果把第一個對象的速度設置為10,那第二個對象的速度也會變成10,因為它是前者的子對象。 在多數情況下,創建一個最基礎的基類作為父類是個好習慣,在這個基類中寫入所有默認的通用代碼,但絕不要在游戲中用它創建實例。比如碰撞檢測、引用變量等都可以寫進父類而不用在子類中單獨設置。你同時應該了解父類也可以擁有自己的父類。當然,絕不可能把A設置成既是B的父類又是B的子類這種循環結構,只能創建層級對象結構,比如A是B的父類,而B是C的父類這種。這種方式對于保持游戲結構十分有效,強烈建議大家學習并使用這種機制。 ### 物理(Physics) 當你首次創建一個新的對象資源時,你會發現這里有一個“使用物理特性(Use Physics)”的選項默認是未勾選的。一旦選中這個選項將徹底改變這個對象實例在游戲場景中的行為,因為這個選項會開啟對象的物理屬性,這意味著傳統的運動和碰撞方法已經全部失效(前提是當前場景也開啟了物理屬性)。當你選中該選項后,會出現以下物理編輯器窗口: ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-02-29.png) 在開始編輯對象各物理屬性值之前,最后首先設置好對象的**碰撞形狀**(Collision Shape)。在普通的碰撞系統中,碰撞事件是基于定義給對象的精靈的碰撞蒙版的,而開啟了物理特性以后就不再如此了。我們需要自己重新給對象定義一個**“碰撞形狀”**(我們稱這個屬性為“**裝置**”),這個形狀可以是一個圓形也可以是矩形,或是你自定義的一個多邊形,單擊**修改碰撞形狀**(Modify Collision Shape)按鈕就可以打開下面這個窗口 ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-02-32.png) 這看起來很像是路徑編輯器,并且功能也大致相同,但是基于你所設定的蒙版不同,也會有如下一些限制: * 如果你設定了一個圓形蒙版,則只能拉動路徑點來放大或縮小這個圓 * 如果你設定的是矩形蒙版,則可以移動四個較重的任意一個,但整個其它三個點會自動調整位置以確保矩形造型不變 * 如果你自定義了一個多邊形蒙版,這個蒙版至少需要3個點,至多只能有8個點,并且所有的角必須是向外凸起的(參見下圖右側為錯誤示例) ![](http://7xqa61.com1.z0.glb.clouddn.com/Wechat/GMS文檔翻譯草稿/編輯器窗口/_image/2017-05-08-10-02-35.png) 一旦你設置好碰撞形狀,你就可以通過修改以下的參數來定義你的對象的基本物理屬性了: ### 密度(Density) 密度是指物體單位體積的質量,這可以用于表示該物體在世界中所占據的空間以及質量的多寡。因此氣球的密度很小,因為它質量很小卻占據了很大的空間,而鉛棒的密度很大,因為其質量大而占據空間小。在GameMaker Studio 2的物理世界中,會根據你輸入的密度以及形狀的面積大小來自動計算質量。這會直接影響對象的慣性以及碰撞后發生的力反饋,因此如果你創建一個很小的對象卻賦予很高的密度,就會產生質量(比如鉛棒),但如果你定義了一個很大的形狀卻密度很小,其質量就會很小(比如氣球) ### 彈性(Restitution) 在物理世界中,彈性指的是“物體或系統在經過彈性形變后恢復到原始狀態”,而在GameMaker Studio 2中的剛體(rigid bodies)是無法發生形變的,因此實際上彈性指的是剛體到底有多“彈”。這個設置會影響對象與其它對象發生碰撞時“彈跳”的次數及力度,同時會與重力和摩擦力一起作用于實例之上共同起效。 ## 碰撞組(Collision Group) 默認情況下,所有物理對象的碰撞組都是0,這意味著這些對象都能正常進行交互操作,但也表示必須在發生碰撞事件的情況下才能發生交互,否則。但是你也可以制定對象屬于某個特定的“碰撞組”。當你給對象指定碰撞組后(比如把三個對象都放進“2”號組),GameMaker Studio 2會把這些對象生成的實例都定義為持續觸發碰撞事件,即便這些對象的碰撞事件里是空白的,它們也會遵循它們所處的游戲場景的物理屬性。反之,當你給你的對象設定了負數的碰撞組(比如給四個對象分配到“-1”組),就是在告訴GameMaker Studio 2 這些對象永遠不會發生碰撞事件,它們之間的所有碰撞事件都會被忽略。 > 注意:使用碰撞組功能會明顯提升物理系統對性能的消耗,只有在絕對必需的情況下才該是用這個功能,并且應當用盡少的組來完成。 ### 線性阻尼(Linear Damping) 阻尼可以降低對象實例的速度,并且不同于摩擦力,因為摩擦力只有在兩個實例接觸時才起效。 而且阻尼比摩擦更容易實現,但要注意的是阻尼并不是摩擦力的替代品,這兩個效果可以也應該一并使用。 ### 角阻尼(Angular Damping) 如果你在現實世界中旋轉任何物體時,除非有電機或在真空環境中,否則都會隨著外力(比如與周圍空氣的摩擦力)的影響而逐漸變慢。我們可以用這個選項來模擬這種效果,降低實例的旋轉速度,如果不設置這個值,所有旋轉的實例都會永遠旋轉下去。 ### 摩擦力(Friction) 摩擦力是不同材料元素之間抵抗相對滑動的力,而在GameMaker Studio 2的物理世界中,則是指兩個實例相碰撞以后造成的動量損失。因此當兩個實例碰撞時,受摩擦力影響,這個值越大損失的棟梁也越大。 最后,這里還有三個額外的開關選項可以用來作用于你的對象,分別是:感應器,啟動喚醒和動態化,這些功能的作用如下: ### 感應模式(Sensor) 選中該項以后,GameMaker Studio 2會“忽略”對象的物理屬性,但仍可正常返回與周圍其它對象的碰撞事件。通過這種方式,你可以在一個場景內創建一個不帶有物理屬性的實例,但使其仍然可以與其它實例觸發碰撞效果,比如使玩家去開一扇門,或是與場景內其它對象進行交互產生行為。 > 要注意當兩個對象初次接觸觸發碰撞事件以后感應就會自動關閉,這意味著這兩個對象后續的重合不會觸發碰撞事件中的事件。如果他們在接觸后停止了重合行為,之后又重新接觸重合會另外單獨觸發一次碰撞事件。 ### 啟動喚醒(Start Awake) 在默認情況下這個選項是選中的,這意味著對象所生成的實例在場景內初始化狀態就是喚醒狀態。通常情況你會愿意讓對象在游戲一啟動就處于喚醒狀態(即立刻能被場景內的物理特性所影響),但有時候由于一些特殊的需求這可能并不是你所需要的效果。為此,你可以取消這個選框然后直接創建未喚醒的實例,直到你設置的事件觸發喚醒它以后,才會受整個場景內的物理特性作用影響。 ### 動態化(Kinematic) 在物理類游戲中,偶爾有一些對象實例你不希望它受重力或其它動態對象的碰撞所影響(平如橫版動作游戲中的那些浮在空中的平臺)。對于這類對象,如果直接把密度設置為0只意味著這個對象在物理模型中是靜態的,但是它也會變的無法與其它對象產生交互作用。但只要針對靜態對象選中了這個選項,即便它不會受碰撞或重力的影響,也可以通過變量來使其運動或旋轉起來。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看