Oyun yapımcısı ve oyun yapımcısı stüdyosu için çeşitli video eğitimleri.

Bu Game Maker video eğitiminde, harita tarafından oluşturulan ilkel bir strateji oyununun oluşturulmasını inceleyeceğiz. Stratejimizin yazılım bölümünü ayrıntılı olarak ele alacağız, işlevselliği genişletme olanaklarını tartışacağız.

Bir koşucu oyununun nasıl oluşturulacağına dair Game Maker video eğitimi. Bir oyun yaratma sürecini ele alacağımız en basit oyun, bir grup asteroitin içinden geçen bir uçaktır. Basit bir uçak, asteroitler ve çıktı oluşturacağız

Game Maker'da en basit harita düzenleyicinin nasıl oluşturulacağına ilişkin video eğitimi. Bu işlevi oyunlarda kullanma aralığı oldukça basittir, oyuncuların ihtiyaçlarına göre ve bir değişiklik için kartların oluşturulmasıdır. Oynanış... Örneğin platformcular için, TDS,

TDS tarzında bir oyun yaratma hakkında video eğitimi Game Maker, (tds, bir oyuncunun bir karakteri veya bir karakteri kontrol ettiği bir video oyunu türüdür. teknik araçlar, ateş ederek çok sayıda düşmanla savaşır). en popüler oyun v

Game Maker oyun kurucusunda bir platform oluşturma hakkında kısa bir video eğitimi, bu derste önceden hazırlanmış basit bir platform örneği ele alınır, kullanılan tüm komut dosyaları gösterilir ve işlevleri ve amaçları açıklanır.

Bu video Game Maker oyun tasarımcısıyla ilgili bir ders, bize sıfırdan basit bir labirent oyunu yaratma sürecini açıkça gösterecektir. Bazı spritelar oluşturacağız. oyuncu, düşman, bonuslar, tuzaklar. Veri programlamanın temellerini inceleyelim

Bu, GameMaker 8.1 oyun tasarımcısı hakkında bir tanıtım videosu eğitimidir, programdaki ana yeniliklere bakacağız ve arayüz nesnelerini analiz edeceğiz. Elbette örneklerden öğrenmekte fayda var, bugünkü örnek bizim hareketlerimizin en basitidir.

Game Maker'ı çalışmaya devam ediyoruz, odaları zaten yaptık. rakipler, duvarlar, kapılar, sandıklar ve çeşitli şifa paraları, tüm verileri ekranda gösteriyor ve hatta bir sonuç tablosu oluşturuyordu. Bu video eğitiminde, açma olasılığını ele alacağız

Oyunları seviyorsanız, hiç şüphesiz nasıl yapıldığını merak ettiniz. Oyun yapmak istiyorsanız (veya yapacaksanız), ancak deneyiminiz yoksa, bu yazıda size nasıl başlayacağınızı anlatacağım.

Tanıtım

Game Maker, Windows, Mac OS X, Ubuntu, Android, iOS, Tizen, Windows Phone, Windows 8, PlayStation 3, PS 4, PS Vita gibi çok çeşitli platformlar için oyunlar oluşturmanıza olanak tanıyan inanılmaz derecede basit bir oyun motorudur. Xbox One ve HTML 5. SteamWorks desteği vardır. Oyununuz başarılı olursa başka bir platforma geçiş yapmak zor olmayacaktır.

Mütevazı bilgi ve minimum motivasyonla bile geliştirme hızı, öznel olarak diğer motorlardan daha hızlıdır. Yeni başlayanlar için kurulum ve konfigürasyon olabildiğince basittir ve herhangi bir özel bilgi gerektirmez. Diğer platformlar için derleme, oyun kodunun değiştirilmesini gerektirmez ve tek bir tıklamayla (neredeyse) yapılır.

Game Maker'ın arkasındaki şirket olan YoYoGames, yakın zamanda Playtech tarafından satın alındı ​​ve size Game Maker'ın büyümeye devam edeceğine dair güven verdi. Duyurusu yapılan Game Maker 2.0 muhtemelen daha kullanıcı dostu ve daha basit olacak ve daha da fazla özelliğe sahip olacağını varsaymak mantıklı. Basın açıklamasına göre, GM 2.0 şirketi satın alma nedenlerinden biri.

Bu yazımda kısaca Game Maker'dan bahsedeceğim ve gelecekteki projenin basit bir taslağını yapacağız.

Bu motor kimin için ve hala hangi amaçla kullanılabilir?
Hepsi için. Hedef, herhangi bir 2D oyundur. Bununla birlikte, programlamanın yerel bir unsur olmadığı kişiler için olduğu kadar hızlı prototipleme ve bir oyun oluşturma için az çaba Oyun yapmak ve/veya bunlardan para kazanmak isteyen herkes için Game Maker mükemmel.

Game Maker'ın Artıları

- basit giriş;
- Java / C / C # ... söz diziminden herkese tanıdık;
- farklı platformlarda kolayca derleme yeteneği;
- yıllar içinde birçok sorunu çözen ve sizin için kodu yazan aktif bir topluluk;
- Kendiniz yazmanıza gerek olmayan standart işlevsellik çok sayıda kod;
- "s" uzantısı yoluyla genişletilebilirlik;
- Yardım (F1) çok basit ve harika açıklamalar ve örneklerle kullanımı kolaydır.

Game Maker'ın Eksileri

- ücretli (oyunu yayınlamak için büyüdüğünüzde bir lisans satın almanız gerekecek);
- yalnızca standart ve komut dosyaları için kullanıcı değişkenlerinin otomatik olarak değiştirilmesi yok;
- maksimum lisansın yüksek maliyeti (ancak herkesin tüm modüllere doğrudan ihtiyacı yoktur);
- teknik destek (Teknik desteğe iki kez başvurdum, 2 haftadan kısa sürede cevap vermediler);
- otomatik yeniden düzenleme olasılığı yoktur.

Şimdi oyunun yaratılmasına. Game Maker'ı kurup boş bir proje oluşturmak bence sorun değil. Genel olarak, başlangıç ​​olarak, tüm işlevleri düşünmek, diyagramlar çizmek, para kazanma üzerine düşünmek vb. iyi olurdu, ancak bu makalenin amacı bu değil, bu yüzden size bir proje oluşturmanın bir yolunu göstereceğim. acemi bir oyun geliştiricisi.

Projenin yapısını kısaca gözden geçirelim:

  • Sprites - sprite içeren klasör (resimler, animasyonlar);
  • Nesneler - kendi hazırlanmış olayları olan nesneler (örneğin, oluşturma, çizme, tıklama vb.);
  • Odalar - oyun odaları(ekranlar). Her ekran için kendi odasını yapmanız gerekir. Çok rahat;
  • Arkaplan - odayı doldurmak için kullanılabilecek arka planlar. Fayans takımı olarak da kullanılır
Gerisi henüz bizi ilgilendirmiyor.

Game Maker'da sprite nedir?

Oyunda kullanılan görsel/animasyondur. Şekli ve boyutu değiştirilebilen kendi maskeleri vardır. Maske, görüntünün nesnelerin çarpışma olaylarına tepki veren bir alanıdır (bu hareketli grafik bir nesneye atanmışsa), üzerine tıklar. Çizim noktasını (Başlangıç) ayarlayabilirsiniz - örneğin, merkezden, köşeden veya başka bir noktadan.

Bir hareketli grafik için bir Doku Grubu da ayarlayabilirsiniz. Oluşturmayı optimize etmek için gerekli (örneğin, artık bir oyun ekranımız olduğunda menü ekranında kullanılan resimlerle doku sayfalarını bellekte tutmaya gerek yok). Her Doku Grubu için üzerinde çalışacakları platformu belirtebilirsiniz. Örneğin, Android, Windows 8 tabletlerden daha az ayrıntılı görüntülere sahip olabilir.

Game Maker'da nesne nedir?

Bu, kendi yöntemlerine (işlevlerine) sahip bazı varlıkların açıklamasıdır. Her nesne kendini çizer (aksi belirtilmedikçe), standart olaylara tepki verir - tuş vuruşları, hareketli grafiğin tıklamaları vb. OOP'ye benzer şekilde, bu bir sınıftır.

Game Maker'da bir örnek nedir?

Bir nesne yalnızca bir varlığın açıklamasıysa, o zaman bir örnek, bir nesnenin örneğidir, oyunun kendisinde uygulamasıdır. Bir instance yaratarak ona hayat veriyorsunuz ve artık objede anlatılan tüm olaylar tepki vermeye başlayacak.
OOP'ye benzeterek, bir nesnedir.

Yapılacak ilk şey yaratmak yeni oda(sol panelde, Odalar - Oda Oluştur'a sağ tıklayın). Buna rm_game diyelim. Ayarlar sekmesinde pencere boyutunu ayarlayalım - Genişlik - 800, Yükseklik - 480, Hız - 60. oyun 800x480 bir pencerede geçecek, fps geçmeyecek ve 60 kareye yönelecektir. Kaydet kapat.

Biraz sprite ekleyelim. Sprites klasörüne sağ tıklayın -> Sprite Oluşturun. Buna spr_unit_shooter diyelim, resmi yükleyin (makalenin sonundaki github'da mevcut), örneğin 54x54 boyutunda ve ortalayın (Ortadaki düğme). Tamam düğmesi ve veriler kaydedildi.

Şimdi ilk birime ihtiyacımız var. Klasik bir çekim tesisi olsun. Ancak bundan önce, tüm özel birimler için ebeveyn olacak bir nesne oluşturmamız önerilir (evet, OOP'deki kalıtımla yaklaşık olarak aynıdır). Bu şekilde tüm birimler için tekrar eden mantıktan kaçınabilirsiniz ve ayrıca aşağıda göreceğiniz gibi oyun sırasında oluşturulan bu nesnenin her türlü "çocuk"una atıfta bulunmak mümkün olacaktır.

Sprite ve odalarda olduğu gibi boş bir nesne yaratırız. Buna o_unit_parent diyelim ve henüz onunla hiçbir şey yapmayalım. Şimdi o_unit_shooter oluşturalım ve Parent sütununda o_unit_parent öğesini seçelim. Bir hareketli grafik verelim - spr_unit_shooter. Bunu yapmak için, adın altındaki düğmeyi kullanın.

Sprite'ları, nesneleri, odaları vb. Adlandırın. sizin için uygun olanı yapabilirsiniz, ancak daha sonra kafanızı karıştırmamak için, şeyleri hemen uygun adlarıyla çağırmak daha iyidir, örneğin, spr_ ön ekine sahip sprite, obj_ veya o_ nesneleri, komut dosyaları - scr_, vb.

Şimdi, odada bir o_unit_shooter nesnesi oluşturduğunuzda, seçtiğiniz hareketli grafiği kendi kendine çizecektir (tabii onu kodla geçersiz kılmadığınız sürece).

Hareketli grafik programlı olarak ayarlanabilir, ancak bu durumda soldaki Proje Yapısı önizlemesinde görüntülenmeyecektir. Şimdi bir nesne örneği oluşturulduğunda tetiklenecek bir olay ekleyelim. Bu durumda, varsa değişkenlerin ilk başlatmasını belirtmeniz gerekir. Etkinlik Ekle'yi tıklayın. Gördüğünüz gibi Game Maker, her nesnenin yakalamasını sağlar. Büyük sayı Etkinlikler. İlgileniyoruz - Yarat.

Sağda, Eylemler konteynerinde birkaç sekmede görebileceğiniz gibi, teoride, tek bir kod satırı yazmadan tamamen eksiksiz bir oyun oluşturabileceğiniz çok sayıda sürükle "n" bırakma öğesi vardır. . Ama bu sapıklar içindir ve muhtemelen Game Maker 2.0'da bu gereksiz işlevsellik sonunda kaldırılacaktır.

Yürüt kodu simgesini sürükleyerek veya sağ tıklayarak Kontrol sekmesine gidin. Oyun mantığını yerleştirebileceğiniz bir metin düzenleyici açılacaktır.

Hatırladığınız gibi, birimlerin belirli bir süre ateş etmesi gerekiyor. Bu çok kolay bir şekilde yapılabilir. Create olayına şu kodu yazın: alarm = room_speed * 2;
Bu, oda_hızı * 2 adım (kareler) aracılığıyla tetiklenecek olan 0 numaralı alarmı başlattığımız anlamına gelir. oda_hızımız yaklaşık olarak bir saniyeye eşit olan 60'tır. Böylece alarm 120 kare (2 saniye) sonra devreye girer. alarm bir fonksiyondur, daha doğrusu bir nesne olayıdır, adım sayacı 0'a ulaştığı anda devreye girer. Diğer tüm olaylar gibi Add olayı ile eklenir. Şimdi alarma ekleyeceğimiz mantığı yazmamız gerekiyor ama önce tesisimizin ne ile çekim yapacağını oluşturalım.

16x16 boyutunda yeni bir sprite spr_bullet oluşturun ve ortalayın. Şimdi yeni bir o_bullet nesnesi oluşturuyoruz ve ona az önce yarattığımız sprite'ı veriyoruz. Create olayına hspeed = 7 kodunu ekleyin; tıpkı önceki nesnede olduğu gibi. Bu çizgi ile cismin yatay olarak 7 hızında hareket edeceğini ayarlamış oluyoruz (hspeed = birisi anlamadıysa yatay hız). Bu, her nesnenin yerleşik bir özelliğidir. Ona sıfır olmayan bir değer atayarak, bu nesne her adımda (Adım) belirtilen sayıda pikseli (bizim durumumuzda 7 sağa) hareket ettirmeye başlayacaktır. hspeed = -7 olarak ayarlarsak; - nesne her adımda -7 piksel hareket edecektir, yani. sağdan sola hareket edecektir.

İşte bu kadar, o_unit_shooter nesnesine dönüyoruz ve yeni bir olay oluşturuyoruz - Alarm 0. Bu olayda yazdığımız kod, Create olayında oluşturduğumuz sayaç çalıştığında tetiklenecektir. Alarm 0 olayında, tesisin ateşlendiği “mermiler” (orijinalinde bezelye) oluşturacağız. Aşağıdaki kodu ekleyelim:

/// ateş var b = instance_create (x + sprite_width / 2, y, o_bullet); b.derinlik = derinlik + 1; alarm = oda_hızı * 2;
Bu kodu analiz edelim.

/// ateş sadece olaya giderken görüntülenecek bir yorumdur. Varsayılan olarak, çok bilgilendirici olmayan "Kod parçası yürüt" gösterilir. Bu nedenle, kod düzenleyiciye geçmek için zaman kaybetmemek için bu tür yorumları yazmanız önerilir.
var b = instance_create (x + sprite_width / 2, y, o_bullet);
var b - yalnızca bu etkinlikte kullanılabilecek bir yerel değişken bildiriyoruz. Olay sona erdikten sonra hafıza boş kalacak ve bu değişkene erişemeyeceksiniz.
instance_create (x + sprite_width / 2, y, o_bullet); - bu şekilde yaratıyoruz yeni kopya nesneyi seçin ve x koordinatlarına yerleştirin: x + sprite_width / 2, y - y koordinatları. Bu durumda, x ve y, ana nesnenin koordinatlarıdır - o_unit_shooter. o_bullet, yarattığımız nesnedir.
b.derinlik = derinlik + 1; - bu satır, yeni oluşturulan o_bullet örneğinin o_unit_shooter'dan 1 katman daha düşük olacağı anlamına gelir.
Son satır, alarmı tekrar çalıştırdığımız anlamına gelir - tesis sürekli ateş etmelidir.

Hatırladığınız gibi, orijinalde bitki örtüsünü yalnızca belirli hücrelere yerleştirebilirsiniz. Bitkinin hangi sınırlar içinde yerleştirilebileceğini görsel olarak netleştirmek için bir arka plan oluşturacağız ve odamızı bununla dolduracağız. Arka Planlar - Arka Plan Oluştur - Arka Planı Yükle'ye sağ tıklayın, istediğiniz resmi seçin, örneğin 64x64 piksel, bg_grass'ı arayın. Odamıza (rm_game), Arka Planlar sekmesine gidin, bir saniye önce oluşturulan arka planı seçin. Resimdeki gibi durmuyorlarsa onay kutularını koyuyoruz.

Şimdi ilk başlatmayı yapacak bir tür başlangıç ​​nesnesine ihtiyacımız var. Yeni bir nesne oluşturuyoruz ve onu örneğin o_game olarak adlandırıyoruz. Bu nesnenin alandaki tıklamaya tepki vermesine izin verin. Bunu yapmak için bir etkinlik ekleyin - Fare -> Genel fare -> Genel sol serbest bırakıldı. Normal bir fare olayı, nesneye doğrudan tıklama anlamına gelir, ancak o_game'in kendi hareketli grafiği + maskesi olmadığından ve Oyuncunun oyun alanındaki herhangi bir noktayı tıklayabilmesi için, tüm tıklama olaylarını yakalamamız gerekiyor. Global Mouse'un yaptığı tam olarak budur. Global sol serbest bırakma, oyun penceresinin içinde bir yerde dokunmatik ekranda bir fare tıklaması veya dokunuşunun yapıldığı anlamına gelir (olay, parmak serbest bırakıldığında tetiklenir).

Bu olaya aşağıdaki kodu ekleyelim:

Var tBgWidth = background_get_width (bg_grass); var tBgHeight = background_get_height (bg_grass); var iX = mouse_x - mouse_x% tBgWidth + tBgWidth; var iX = mouse_x - mouse_x% tBgWidth + tBgWidth / 2; var iY = mouse_y - mouse_y% tBgHeight + tBgHeight / 2; if (instance_position (iX, iY, o_unit_parent)! = kimse) (exit;) instance_create (iX, iY, o_unit_shooter);

İşlemden sonra noktalı virgül koymanıza gerek yoktur, kodun mantığı bundan değişmez ve hataya neden olmaz. Ama bahse girebilirsen, neden olmasın. Evet ve daha tanıdık.

İlk dört satırda yerel değişkenleri bildiriyoruz. background_get_width, background_get_height, arka planımızın genişliğini ve yüksekliğini döndüren yerleşik işlevlerdir. Gördüğünüz gibi, iX ve iY'yi hesaplamak için bu verilere ihtiyacımız var. iX ve iY, o_unit_shooter nesnesini somutlaştıracağımız koordinatlar olacaktır. mouse_x, mouse_y, Game Maker'ın fare (parmak) imlecinin geçerli koordinatlarını saklayan yerleşik global değişkenleridir (yani her yerden erişebildiğimiz). Çünkü Global sol serbest bırakma olayında çalışıyoruz, kullanıcının sol fare düğmesini bıraktığı (parmağını bıraktığı) son koordinatları saklarlar. Sonucu iX, iY değişkenlerine atanan matematiksel işlemler, o_unit_shooter nesnesinin bir örneğinin tam olarak bg_grass arka plan hücresinin ortasına yerleştirileceği koordinatları hesaplamak için gereklidir. Onlar. Plants Vs Zombies'de bitkinin herhangi bir yere yerleştirilemeyeceğini, yalnızca belirli bir noktaya yerleştirilebileceğini unutmayın, ancak aynı zamanda herhangi bir yere tıklayabilirsiniz ve bitki tam olarak yerleştirilecektir. Doğru yer... Yukarıdaki tüm kodun yaptığı şey budur.

instance_position (iX, iY, o_unit_parent) kontrol ediliyor! = Hiç kimse, üst nesnesi o_unit_parent olan herhangi bir örnek (nesne örneği) için iX, iY koordinatlarına baktığımız anlamına gelir. Artık yalnızca bir devralınan birimimiz olduğu için - o_unit_shooter, oyun alanında herhangi bir o_unit_shooter örneği olup olmadığını kontrol ederiz, ancak yeni özel birimler eklediğimizde bile kodun çalışması için kontrole o_unit_parent yazarız. noone ("hiç kimse" den) diğer dillerde bir tür null analogudur.

Çıkış, olayın yürütülmesini sonlandıran koddur. Onlar. iX, iY koordinatlarında zaten bir birim varsa, çıkış tetiklenir ve o_unit_shooter örneği oluşturulmaz, çünkü sonraki tüm kodların yürütülmesini keseriz. Buna ihtiyacımız var, böylece 2 kullanıcı birimi bir hücrede duramaz.

Eh, ilk düşmanı eklemenin zamanı geldi. Yeni bir nesne oluşturun ve tekrar bir temel üst nesne oluşturun. Ebeveyni olacak o_enemy_zombie ve o_enemy_parent adlarını verelim. Bir spr_enemy_zombie hareketli grafiği oluşturun, ortalayın ve o_enemy_zombie'ye atayın.

Tüm düşmanların özelliği bitkilere doğru hareket olduğundan, Create olayında o_enemy_parent içinde şu kodu oluşturun:

CHhız = -4; hspeed = cHspeed; HP = 10; canAttack = doğru;
cHspeed, daha önce gördüğümüz, hspeed'e atadığımız özel bir değişkendir. Neden sadece hspeed = -4 yazmıyorsunuz; - sonra göreceksiniz.

Önceden, özel değişkenleri var yapısı aracılığıyla bildirmiştik, ancak bunu burada yapmıyoruz. cHspeed = -4; ve var cHspeed = -4 ;?
Her şey basit - ilk durumda, değişkene bu nesnenin kodundaki herhangi bir noktadan erişilebilir olacak ve ona başka herhangi bir nesneden başvurmak mümkün olacak, ancak hangi nesneye atıfta bulunduğumuzu belirtmeyi unutmadan. Bunu şimdi araştırmak gerekli değildir. Bu değişkenin, bildirildiği andan itibaren nesne örneğinin tüm ömrü boyunca var olduğunu unutmayın. var cHspeed = -4 olması durumunda; yalnızca oluşturulduğu etkinlik süresince kullanılabilir olacaktır.

Aslında, ona başka bir nesneden de başvurabilirsiniz, ancak yaratıldığı olay zaten sona erdiğinde başka bir nesneden başvurursanız, bu bir hataya neden olur - tanıdık boş gösterici, çünkü bellek zaten boş.

Eğer hspeed fonksiyonlarını beğenmiyorsanız, wspeed Step olayında x veya y değerini değiştirerek kendiniz uygulayabilirsiniz. Bu işlevler sadece sizin için yapar.

HP, düşmanların can puanlarının sayısını depolayacağımız başka bir değişkendir. Bu değişken her örneğe "sahip olacaktır", ancak en yüksek miktar isabet noktaları farklı şekiller düşmanlar farklıdır, yani. bir şekilde bu değeri geçersiz kılmanız/geçersiz kılmanız gerekir. Veya tüm düşmanlara aynı sayıda, diyelim ki 100 can verebilir ve düşmanın aldığı hasarın bağlı olacağı savunma konseptini tanıtabilirsiniz, ancak şimdi işleri karmaşıklaştırmanın bir anlamı yok, değil mi? Bu yüzden sadece bir değişkenle idare edeceğiz - HP.

Unutmayın, gml Game Maker'da kullanılan dildir, büyük/küçük harf duyarlıdır, HP, hP, Hp ve hp farklı değişkenler olacaktır.

CanAttack, yalnızca true değerine atadığımız bir değişkendir. Şimdilik, sadece yazalım ve unutalım.

Her düşman için farklı bir HP değerimiz olduğu için bu değeri bir şekilde yeniden tanımlamamız gerekiyor. Çok, çok basit. o_enemy_zombie nesnesine gidin, Create olayına bir tepki oluşturun ve kodu yazın:

Event_inherited(); HP = 20;
Event_inherited() işlevi; ve mirasla meşguldür. Onlar. şimdi o_enemy_zombie kodu yürütecek:

CHhız = -4; hspeed = cHspeed; HP = 10;
Hangisi bu işlevi "içe aktarır" ve ardından değer satır tarafından yürütülür - HP = 20;
Onlar. aslında Create olayının sonunda o_enemy_zombie nesnesi aşağıdaki özelliklere sahip olacaktır:

CHhız = -4; hspeed = cHspeed; HP = 20;
event_inherited()'i unutursak; veya o_enemy_zombie nesnesi için ana nesneyi belirtmeyi unutursak, düşman hareket etmeyecek, bu nesnenin cHspeed değişkenine erişmeye çalışırken bir hata görünecektir.

Harika, başka bir düşman türü yaratmak istiyorsak, Yarat olayında aynı şeyi yazacağız, HP miktarını gerekli miktara değiştireceğiz:

Event_inherited(); HP = 100;

Zombilerin can puanı olduğundan, bitkinin de onlara sahip olması gerekir. HP = 20 kodunu o_unit_parent nesnesinin Create olayına kendiniz ekleyin; ve event_inherited() satırı; o_unit_shooter nesnesinin Create olayına.

Biliyor musunuz?

Create olayına herhangi bir şey eklemeniz ve geçersiz kılmanız gerekmiyorsa, event_inherited(); etkinlikte başka bir mantığa gerek yok - Game Maker bunu sizin için yapacak. Aynısı, yalnızca Oluşturma için değil, başka herhangi bir etkinlik için de geçerlidir.

Harika, zombimiz şimdi yürüyor ama mermiler onu almıyor ve bitkiler onu yavaşlatmıyor. Önce ilk sorunu çözelim. Hadi o_bullet'e gidelim ve olaya yeni bir tepki oluşturalım - Olay Ekle -> Çarpışma -> o_enemy_zombie. Bu etkinlik, o_bullet ve o_enemy_zombie karşı karşıya geldiğinde tetiklenecek. Çarpışma, makalenin başında okuduğunuz maske tarafından kontrol edilir. Kodu ekleyelim:

(Diğer) ile (HP - = 5; if (HP<= 0){ instance_destroy(); } } instance_destroy();
Bu çok ilginç bir nokta. diğeri, olayın bu noktasında çarpışmanın meydana geldiği nesnenin bir örneğidir. Doğal olarak, beri bu kod, o_enemy_zombie nesnesinin bir örneğiyle çarpışma durumunda, diğerinde yalnızca bir o_enemy_zombie örneği olacaktır.

with () () yapısı ile bu diğer öğeye atıfta bulunuyoruz. () içinde olan her şey yalnızca bu nesne örneğiyle ilgilidir. Böylece, HP - = 5; düşmandan 5 can puanının çıkarılmasıdır. Eğer (HP<= 0){} мы сравниваем количество очков жизни тоже именно у этого объекта. Помните я немного выше говорил про разницу между обычным объявлением переменной и с переменной через var. Вот этот пример должен вам окончательно прояснить ситуацию. Т.к. переменная HP у нас объявлена не через var, то она доступна в любой момент времени. Так что с помощью конструкции with мы можем к ней получить доступ. Альтернативный способ обращения к переменной другого объекта выглядел бы так:

Diğer.HP - = 5; if (diğer.HP<= 0){ with(other){ instance_destroy(); } } } instance_destroy();
Ancak değişkenlere bu şekilde erişmek, özellikle daha fazla mantık varsa, daha az uygundur, ancak yine de bazı durumlarda uygulanabilir.

Unutmayın, Create olayında değil de kodda bir değişken bildirdiyseniz, ancak bildirilmeden önce ona atıfta bulunursanız, ondan herhangi bir veri okumaya çalışırsanız bir hata verecektir.

instance_destroy(); işlevini anlamak için çok fazla İngilizce bilgisine sahip olmanıza gerek yok. bu nesne örneğini (örneği) siler.

Böylece tüm bu kodlar bir çarpışmada zombiden 5 can puanı aldığımızı ve eğer 0 veya daha azını alırsa onu yok ettiğimiz anlamına geliyor. Sonuç ne olursa olsun sonunda kurşunumuzu çıkarıyoruz. Daha kolay olamazdı. Genel olarak, zombileri sağlıklarına kendi başlarına bakmaya zorlamak muhtemelen daha iyi olurdu, ancak şu ana kadar bununla ilgilenmiyoruz. Ama bu başka bir hikaye, optimizasyon sorunu.

Zombilerimiz sadece hasar alabilseydi yanlış olurdu. Hasar verme yeteneğini eklememiz gerekiyor. Öncelikle o_enemy_parent nesnesinin Create olayına yeni bir değişken ekleyelim.

Etkin = doğru;
Daha önce bahsettiğim Step olayına bir göz atma vakti geldi. Bu olay her kareyi tetikler. Basit. oda_hızı 60 ise, bu olay saniyede yaklaşık 60 kez tetiklenir. Bu kodu o_enemy_zombie nesnesinin Step -> Step olayına ekleyelim.

Eğer (! Aktif) çıkarsa; var tBgWidth = background_get_width (bg_grass); var leftCellCenterX = x - x% tBgWidth - tBgWidth / 2; var frontEnemy = instance_position (leftCellCenterX, y, o_unit_parent); if (frontEnemy! = noone) (var frontEnemySprtWidth; with (frontEnemy) (frontEnemySprtWidth = sprite_width;) if (x - sprite_width / 2 - frontEnemy.x - frontEnemySprtWidth / 2<= 12){ hspeed = 0; if (!canAttack){ exit; } canAttack = false; alarm = room_speed * 1.2; // cantAttack ->NS; ile (frontEnemy) (HP - = 5; if (HP<= 0){ instance_destroy(); } } } }else{ hspeed = cHspeed; }

Yanlış bir şey yok, neredeyse tüm tasarımlar size zaten tanıdık geliyor.
eğer (! Aktif ise) çıkış; - nesne aktif değilse, örneğin dinlenme / şarj etme / sallanma durumunda, bu olay yürütülmeyecektir. Sonraki iki satırda, örneğimizin merkezinin şimdi bulunduğu hücrenin solunda bulunan hücrenin merkezinin koordinatlarını alıyoruz (unutmayın ki x - Başlangıç ​​noktasının koordinatlarını döndürür ve biz onu ayarladık. sadece hareketli grafiğin ortasında). Ardından, kullanıcı biriminin koordinatlarda (leftCellCenterX, y) olup olmadığına bakarız. Bir şey varsa, sonraki mantık vardır, ancak bununla ilgili bir saniye içinde, orada hiçbir şey yoksa, Create olayında oluşturduğumuz, hatırlayın, cHspeed değişkeninin değerini hspeed'e atarız. İşte burada işe yaradı. Bunun anlamı şudur - eğer zombimiz saldırmayı bırakıp bitkiyi yok ettiyse, yoluna devam etmesi gerekiyor. Elbette cHspeed değişkenini giremezsiniz, ancak daha sonra hareket hızını nerede ayarladığınızı hatırlamanız gerekir ve bu unutulur.

Bu, zombilerin yolunda hiçbir şey yoksa, ancak şimdi savaşmamız gereken ana dönüyoruz. İlk satırların bir yakalama ile çok ilginç olduğu ortaya çıkıyor. Gerçek şu ki, yerel bir frontEnemySprtWidth değişkeni bildirerek, buna frontEnemy örneğinde bir değer atarız. Programlamaya aşina olanlar söyleyecektir, ancak bu durumda biz zombimizin değil, aynı ada sahip, ancak frontEnemy örneğinin değişken frontEnemySprtWidth değişkenine atıfta bulunuyoruz. Yani evet hayır, gerçek şu ki, yerel değişkenler (var aracılığıyla bildirilen) bu olayın içinde her yerde, hatta frontEnemy örneğinin içinden bile görünür hale gelir. Yani kodda herhangi bir hata yok, aslında zombinin içinde local olarak tanımlanan değişkenden bahsediyoruz. Bu noktayı anlamadıysanız, deneyin veya yardımı okuyun, orada her şey mükemmel bir şekilde açıklanıyor ve biz daha ileri gidiyoruz.
FrontEnemySprtWidth'i zombimizin solundaki bir hücre olan kullanıcı birimi (bitki) için hareketli grafiğin genişliğine ayarladık. Var frontEnemySprtWidth = sprite_get_width (spr_unit_shooter) ; olmadan yapabiliyorsak, ilk anlayış için neden böyle karmaşık bir yapı içinde çitlememiz gerektiğini söyleyeceksiniz. Cevap basit - şimdi bir bitkimiz var ve hangi hareketli karaktere atıfta bulunacağımızı biliyoruz, ancak yeni tip birimler (ayçiçekleri, vb.) önümüzde, ama bu kadarı yeter, bu sorun basitçe çözüldü.

Daha sonra kullanıcı biriminin en sağ noktası ile zombimizin en sol noktası arasındaki mesafenin 12 pikselden az olup olmadığını kontrol ediyoruz, ardından zombimizi durduruyoruz, zombimizin saldırabileceğini kontrol ediyoruz (canAttack değişkeninin değerini kontrol ediyoruz) daha önce o_enemy_parent nesnesinin Create olayında oluşturulmuş), yürütme, artık saldırmanın mümkün olmadığını ve bir dahaki sefere room_speed * 1.2 kare üzerinden yapılabileceğini söylediğimiz kodu sürdürür (60 * 1.2'den sonra) - biz bunu alarmda yapın (canAttack = true; kodunun yazıldığı o_enemy_parent nesnesinin ilgili olayına (Alarm 0) kendiniz ekleyin). Saldırmak mümkünse, bitki örneğinden 5 can puanı alıp hala canlı olup olmadığını kontrol ediyoruz, değilse yok ediyoruz.

Pekala, düşman tamamen hazır - bitkiyi yok ederse hareket ediyor, saldırıyor ve hareket etmeye devam ediyor, ancak bir dezavantajı var - yok. Sadece düşmanımızın bir tanımını oluşturduk, şimdi zombileri oyun alanına yerleştirmemiz gerekiyor. o_game nesnesinin Create olayına dönün. kodu ekleyelim
alarm = oda_hızı; // düşman üret

Onlar. 60 kareden sonra Alarm 0 tetiklenecek ve bir zombi yaratılacak, değil mi? Numara. Bu Alarm için mantığı oluşturmadık. Ve buradaki kod da basit:

Var tBgHeight = background_get_height (bg_grass); var eY = irandom (room_height - room_height% tBgHeight); eY = EY - EY% tBgYükseklik + tBgYükseklik / 2; instance_create (room_width + sprite_get_width (spr_enemy_zombie) / 2 + 1, eY, o_enemy_zombie); alarm = oda_hızı * 3;
Her şey basit - karmaşıklaştırmayacağız ve sadece her 3 saniyede bir (60 kare * 3) X koordinatlarında bir o_enemy_zombie örneği oluşturuyoruz: room_width + sprite_get_width (spr_enemy_zombie) / 2 + 1 yani. ekran kenarlığının sağında tam olarak bir piksel, yani. zombiler başlangıçta görünmeyecek ve Y rastgele bir hücredir. room_width ve room_height, zaten anladığınız gibi, odamızın genişliği ve yüksekliğidir. Onlar. Sırasıyla 800 ve 480.

Bunların hepsi harika, ancak birinin o_game nesnesinin bir örneğini yaratması gerekiyor, aksi takdirde tüm bölüm bir anlam ifade etmiyor. Ancak son adımımız çok basit - rm_game -> Objects -> odasına gidin ve menüden o_game öğesini seçin ve odanın herhangi bir yerine yerleştirin. Alternatif bir seçenek şuna benziyor - Ayarlar -> Oluşturma Kodu sekmesi (bu odaya gittiğimizde tetiklenecek kod budur). instance_create (0,0, o_game) satırını ekleyin;

Koordinatlar herhangi biri olabilir. Şimdi bir soru sorabiliriz, ancak Game Maker rm_game odasını başlatmanın gerekli olduğunu nasıl belirleyecek veya "ya çok odamız varsa, Game Maker hangisinden başlayacak?" Her şey her zamanki gibi basit - önce en üstteki oda açılır (sıralarını fareyle sürükleyerek değiştirebilirsiniz). Şimdi bir tane var çünkü hemen başlayacak.

Şimdi şöyle bir şeye sahip olmalıyız:

Bu, ilk bölümü tamamlar. Tebrikler, oyun için bir prototip yaptık. Bundan sonraki bölümlerde yapacağımız tam teşekküllü bir oyun yapmak için çok az şey kaldı.

Bu bölümde tanıştık temel konseptler Game Maker, mümkün olduğunca çok şey kullanarak daha fazla olasılık... Bazı noktalar çok rasyonel bir şekilde yapılmaz, yeniden yapılabilir ve yapılmalıdır, ancak hepsi bir anda değil. Neler olup bittiğini anlamak için amatörce yazmanın daha iyi olduğunu düşünüyorum.

Dersten de görebileceğiniz gibi, bazı planlarda Game Maker'ın şu anki sürümü ideal değil, kafanızda çok şey tutmanız gerekiyor ama Game Maker'da diğer her şeyi yapmak daha kolay. Hafif rahatsızlık buna değer.

Bilgisayar oyunları oynamak çok eğlencelidir. Ancak çok az insan kendi oyununuzu yaratmanın çok daha ilginç olduğunu biliyor. Geçmişte, kalkınma bilgisayar oyunlarıçok uzun, zor ve meşakkatli bir süreçti. Şimdi bile aylardır oyunlar yapılıyor ve geliştirme ekipleri 20-100 kişiden oluşuyor! Ancak Game Maker ile oyununuzu birkaç akşam içinde oluşturabilirsiniz. Elbette Diablo IV yapmayacaksınız ama oynaması eğlenceli ve ilgi çekici basit oyunlar da var. Oyun yapımcısı, özel programlama dilleri bilgisi olmadan iyi oyunlar oluşturabileceğiniz, içgüdüsel olarak anlaşılabilir bir GUI ile donatılmıştır. Oyununuzun yeteneklerini genişleten yerleşik GML'ye sahiptir, ancak daha sonraları.

Şimdi Game maker 8.0 programının arayüzü ile tanışacağız.


1. Dosya adı dizesiüzerinde çalıştığınız, Game Maker sürümü ve mod ekranı (Basit modum var)
2. Ana menü... Dosya grubu ( dosya):
2.1 Yeni ( yeni) - Tamamen boş yeni bir oyun dosyası oluşturur
2.2 Açık ( açık) - önceden kaydedilmiş bir dosyayı açın. Mevcut sürümün, önceki sürümlerin ve yedeklerin (yedek dosyaları) dosyalarını açabilirsiniz. Sizinkinden daha yüksek sürümlerde oluşturulmuş dosyaları açmak mümkün değil 2.3 Son açılan - Bu menüde program son zamanlardakileri hatırlıyor dosyaları aç onlara hızlı erişim kolaylığı için.
2.4 Kaydet ( Kaydetmek) - yapılan değişiklikleri kaydeder.
2.5 Farklı kaydet ... ( Farklı kaydet...) - yapılan değişiklikleri kaydeder ve dosya adını ve konumunu değiştirmenize olanak tanır
2.6 Yürütülebilir Dosya Oluştur ... ( Yürütülebilir Dosya Oluştur...) - oyunu exe formatında derler (ayrı uygulama)
2.7 Birleştirme Oyunu ... ( oyunu bağla) - bir oyunun kaynaklarını diğerine aktarır (bunları tamamen birleştirir).
2.8 Gelişmiş Mod ( Gelişmiş mod) - kolay ve zor mod arasında geçiş yapmanızı sağlar
2.9 Tercih ( Ayarlar) - program ayarlarını değiştirmenizi sağlar
2.10 Çıkış ( Çıktı)
Bu menüye ek olarak, başka hiçbir şeye gerek olmadığına inanıyorum ( en azından 4 yıldır hiç açmadım)
3. Hızlı erişim çubuğu... Kaynak oluştur, aç, dosya kaydet, derle, oyunu çalıştır gibi en sık kullanılan menü öğelerini içerir.
4. Oyun kaynakları... Kaynağa sol fare tuşuyla tıklarsanız, onunla çalışmak için bir menü açılır. Her şeyi daha ayrıntılı olarak ele alalım:
4.1 Spritelar ( sprite) - nesnelerle donatılmış resimler. Sprites klasöründe Game Maker ile birlikte yeterli sayıda sprite gelir.
Bir hareketli grafikle çalışmak için arayüz basittir - kaydedin, düzenleyin ve boyutu:


4.2 Sesler ( sesler) - hiçbir oyunun onsuz yapamayacağı ses dosyaları.
Arayüz burada neredeyse aynı: kaydet, yükle ve oynat:

4.3 Arka Plan "lar ( arka plan) - arka plan oyunda, daha sonra seviyenin eyleminin gerçekleşeceği arka plana karşı. Arayüz, sprite'lardakiyle aynıdır.
4.4 Nesneler ( nesneler) Game Maker'ın ana kaynağıdır. " olaylar. Olayların meydana gelmesi sırasında nesnelere komutlar verilebilir. Örneğin: bir oyuncu ve bir jeton çarpışır. Oyuncuya bir jetonun sesini çalması ve bir jetonu imha etmesi talimatı verilir. Oyunlarınızda hareket ettiğini göreceğiniz her şey nesnelerdir (aslında tam olarak her şey değil, ama daha sonra bu konuda.) Ayrıca bir nesne ile bir örnek arasındaki farkı da anlamanız gerekir.Bir nesne bir örnektir.Ama oyunda , nesneler değil, örnekler katılır. Bir örnek, bir nesnenin tam bir kopyasıdır, ancak bu tür birçok kopya olabilir. Bir örnek hakkında konuştuğumuzda, bir nesnenin belirli bir örneğini kastediyorum Nesne dediğimizde, o nesnenin tüm örneklerini kastediyoruz.
Hızlı erişim çubuğundaki mavi topa tıklayın (3)


Arayüz burada seslerden veya resimlerden çok daha ağır. Sol tarafta bir hareketli grafik seçmek için bir pencere var, öğeler Görünür ( gözle görülür) ve Katı ( sağlam). Ortada belirtilen olayların bir listesi bulunur. Ve sağda, bu olaya atanan eylemlerin bir listesi ve yeni eylemler eklemek için bir pencere bulunur. Bir sonraki derste eylemler ve olaylar.
Ve nihayet Odalar ( Odalar). Bu, arka planların ve nesnelerin bulunduğu yerdir - tek kelimeyle, seviye. İlk menü, nesne ekleme menüsüdür. Burada her şey açık - boş bir alana tıklıyorsunuz, bir nesne seçiyorsunuz ve onu odaya yerleştiriyorsunuz. Bunu kurulum takip eder. Burada odanın uzunluğunu, genişliğini, hızını ve adını ayarlayabilirsiniz. Sonraki arka planlardan sorumlu penceredir. Burada odadaki arka plan rengini seçebilir veya projede zaten mevcut olan bir arka plan ekleyebilirsiniz.

5. Bu Oyun yapımcısı çalışma penceresi "a

Bu kadar. Bir sonraki derste:
1. Olaylar ve yürütme sırası.
2. Temel eylemler
3. Bir tıklama mini oyunu oluşturun

Bugünkü dersimizde Game Maker Studio 2'deki standart efektlere bakacağız. Bunlar nelerdir, nasıl kullanılır ve ne gibi tuzaklar vardır.

Kursa devam etmek - Game Maker Studio 2'de oyun oluşturmanın temelleri

Son dersi burada bulabilirsiniz:

Standart efektlerle böylesini hayal bile etmeyin :)

GMS'de standart efektleri kullanmamak daha iyidir

Burada önemli bir çıkış yapmak gerekiyor. Game Maker Studio 2'deki standart efektler, çeşitli nedenlerle ciddi projeler için önerilmez.

Bunun ana nedeni, efektlerin performans açısından çok iyi optimize edilmemiş olmasıdır. Standart efektler programı (oyunu) çok fazla yükleyebilir, çünkü nasıl performans gösterdiğini bilmiyoruz, ancak görünüşe göre çok iyi performans göstermiyorlar.

Standart efektler ağırdır ve oyunların optimizasyon ve performans anlarına da değineceğim, ancak zaten sonraki videolarda ve makalelerde.

Tüm bu efektleri adım adım atmak ve oyununuzun kare hızı (FPS) 50-100 arasındaysa özellikle tehlikelidir. Oyun onları saniyede 50-100 kez yapacak, ancak bir kerede 100-200 nesne için çizdirirseniz? Tabii ki, her şey burada asılı kalacak.

Genel olarak, oyun yapımcısını kapatmak oldukça kolay, bilgisayarımı kapatan bir sürü oyun yaptım. Örneğin, bir virüsün simülatörünü yaptım ve virüsler çok çoğalınca onu benim için kapattılar.

GM yaklaşık 500 nesne çekti, ardından FPS düşüyor ve fan çalışmaya başlıyor, böylece bilgisayar havaya uçuyor.

Genellikle, yeni başlayan biriyseniz, oyunların optimizasyonu ve hızı konusunda çok fazla uğraşmamalısınız.

Basit oyunlar yaptığınız ve herkesin bilgisayarları güçlü olduğu için genellikle bununla ilgili bir sorun yoktur. Ama genel olarak ve özellikle telefonlar için oyun yaparken bu an göz ardı edilemez.

Şimdi sadece şunu söyleyeceğim:

  • Şeffaflıktan kaçının
  • Büyük Haritalardan Kaçının
  • Standart HMS Etkilerinden Kaçının
  • Adımlarda daha az işlev (adım)

Peki, bunun hakkında söyledim. Şimdi, oyun kurucudaki efektler nelerdir ve nasıl tetiklenir?

GMS'deki standart efekt türleri ve bunların nasıl çağrılacağı

3 fonksiyon mevcuttur:

  • effect_create_above (tür, x, y, boyut, renk); // OVER efekti yarat
  • effect_create_below (tür, x, y, boyut, renk); // ALTINDA bir efekt yarat
  • effect_clear // efektleri temizle ve kaldır

Bazen farklı bir tane gerekli olsa da, neredeyse her zaman effect_create_above kullanırım. Örneğin, nesnenin altına bir kan birikintisi çekmek daha iyidir, ancak onu hiç böyle çizmemek daha iyidir ...

tür- etki türü. Aşağıda bu konuda daha fazlası.

x, y- koordinatların ne olduğu açık. Efekti yarattığımız yer.

Bununla ilgili daha fazla bilgiyi buradan okuyun:

boy- boyut. Sadece 0, 1 ve 2 olabilir.

  • 0 - küçük
  • 1 - orta
  • 2 - büyük


renk- efektin rengi. Örneğin: c_red, c_blue, c_green

Temelde hepsi bu, onları çizmek çok kolay ve burada genellikle sorun yok. Genel olarak efektler görsel bir şey olduğu için buradaki asıl problem görsel şeylerdir. Yani, onları nasıl çizeceğimiz değil, ne zaman, ne ve ne renk.