THOMAS Lively: Pekala. Herkese selam. Ben Thomas Lively değilim. Bu seminer olacak SDL kullanarak C 2D oyunlar yazmaya. Yani hepiniz biliyorum evet, ben gerçekten soruyorum oyun oynamak ve oyun yapmak istiyorum, ancak bu SDL iş nedir? Yani SDL bir C kütüphanesidir. Bu basit açılımı DirectMedia Layer. Ve bu, bir çapraz platform var oyun geliştirme kütüphanesi. Bu, Windows, Mac üzerinde çalışır Linux, hatta iOS ve Android. Bu gibi şeyler kolları ses sistemlerine erişim bilgisayar, klavye ve için fare, joystick, bağlandıkları eğer. Cep, hatta yapabilir girdi ve bütün dokunun. Ve tabii ki, bu grafik işleme, Ekranın şeyler çizim. Bu yüzden çok yaygın olsa da, kullanılan Eğer daha önce duymuş olabilirsiniz. Bu, örneğin, içine inşa edilmiştir, Valve'nin kaynak motoru, gibi hangi güçler oyunları Portal ve Team Fortress 2. Bu çok sayıda da var: çıkıp indie oyunların, bu yüzden seni ne olduğunu görmek için heyecanlıyım Tüm onunla yapacak. Seminer hedefleri sen almak için vardır SDL ile gelişmekte olduğu için yola çıktı. Biz öğrenmek için gidiyoruz Bir oyun penceresi oluşturmak için. Biz, sprite oluşturmak için gidiyoruz hangi oyunda görüntülerdir etrafında hareket edebilirsiniz. Biz öğrenmek için gidiyoruz ve sprite animasyon, böylece onları hareket yapmak Onları zaman içinde değişebilir. Ve biz öğrenmek için gidiyoruz Klavye ve fareyi yakalamak için Bilgisayardan girişi. Ne konuşuyor olmayacak yaklaşık Bugün 3D grafikler, Bu çok karmaşık çünkü biz vaktimiz yok tabi. Biz öğrenmek değil nasıl Bizim oyunları ses çalmak. Ve biz inşa olmayacak Linux ama her şey için. Şimdi uyarılar bu var, umarım sonunda seminer ile, Eğer rahat olacaksınız SDL dokümantasyon, böylece anlamaya gitmek mümkün olacak nasıl kendiniz ses çalmak için. Ayrıca çalışmalıdır Mac veya PC için bina Tam Linux için bina aynı, ancak kurulum gidiyor biraz farklı. Yani anlamaya muktedir olmalıdır Bunları yapmak için dışarı nasıl Bugünün Seminerin sonunda. Kurmak için Yani, biz gidiyoruz Bir sanal makine kullanmak için. Biz, çünkü CS50 IDE kullanmak istiyorsunuz biz sadece C. yazılı gidiyoruz Ama IDE biz bir tarayıcı değil çünkü Yeni pencere veya ekran oluşturamıyor İçinde grafikler. Yani biz bir sanal makine gerekir. Yani talimatları izleyebilirsiniz Burada manual.CS50.net/appliance/15~~pobj at Resmi CS50 Cihazı yüklemek için, hangi sadece bir Linux sanal olduğunu makinesi. Ve sonra bir kez tüm bu up-- ayarlanmış Çünkü, biraz zaman alabilir Eğer gidiyoruz çok büyük bir download-- VM sudo apt-get güncelleştirmesi çalıştırmak için. Ve bu gerçekten gidiyor tüm yazılımını güncellemek sanal makine üzerinde paketler. Bundan sonra, çalıştırmak için gidiyoruz sudo, install libsdl2-2.0-0 apt-get libsdl2-dbg, libsdl2-dev, ve ilave olarak libsdl2 görüntü-2,0-0, libsdl2-image-dbg, ve libsdl2-image-dev. Yani bu ne işe yarıyor? Bu sadece hata ayıklama yükler bilgi, belge, başlıklar, ve iki kütüphaneleri için ikili. SDL 2.0, eski Düzenli, ve başka bir kütüphane denilen SDL Görüntü, hangi Biz kullanarak gidiyoruz Bizim oyuna görüntü dosyalarını yüklemek için. Bunu da var bu yüzden bir kez bu sorar sadece zaman ki Sadece, evet yazın Enter tuşuna bu paketleri yüklemek için, ve daha sonra gitmek iyi olmalıdır. Yani, dağıtım kodunu almak için Ah sevgili can--, bu güncellenmiş değil. Sürece bir GitHub account-- var Eğer bir GitHub hesabınız varsa, Bu Git yapabilirsiniz repoya klon komut ve Git indirir içindeki tüm kodu ile repo, böylece kod olacak. Bir GitHub yoksa Hesap, ne yapmalıyım türüdür wgithttps: //github.com/tlively/sdl seminar-- ve burada different-- var /archive/master.zip. Yani yine, bu aynı değil URL, bu olacak hariç tlively / SDL_seminar / master.zip ve Bunu indirmek için wgit kullanıyorlar. Ve sonra sadece can Bu arşivi açın ve daha sonra gerekecek tüm kaynak kodu. Bu konuda çok üzgünüm. Ve sonra kodu da ev sahipliği yapacak Birkaç CS50 seminer web sayfası günler. Pekala. Peki nasıl başlarım Kendi oyun yazmaya? Peki, ilk şey bizim yapmak istediğimiz için gidiyoruz SDL belgelere bakmak. Yani burada VM var. Ve işte web sayfası. Ben libsdl.org yaşamak için gidilen ettik. Ne ben burada yapacağım üzerine gidin kenar çubuğuna, dokümantasyon altında, ve wiki tıklayın. Bu wiki beni getirecek SDL belgelerine çoğu vardır. Burada kenar çubuğundaki içinde, konum Kategoriye göre API tıklayın gidiyor Çünkü verecek Bize güzel bir kategorik görünüm SDL için tüm API. Yani, örneğin, biz var Temel başlatma ve aşağı her tür kapattı SDL kullanarak idari şeyler, ve sonra biz bölümü için var Ekranın şeyler görüntüleniyor. Bu video. Girdi olaylar, bu getting klavyeden girdi, Fare girdi almak ve joystick, hatta bunu varsa. Şeyler için force feedback var oyun denetleyicileri gibi hangi Biz konuşmak için gitmiyoruz. Ve işte ses var. Ve sonra diğer bir grup var SDL Senin için yapabileceğim şeyler. Ama bugün odaklanmak için gidiyoruz Burada başlatma üzerinde, video görüntüme bölüm ve giriş olaylarını ele. Peki bu ana vardır dokümantasyon bölümleri Eğer endişe gerektiğini söyledi. Sadece eğlence için, biz üzerinden gidersek Burada ve adıyla API tıklayın Her bir listesini görebilirsiniz SDL kütüphanesi tek şey. Böylece tüm bu fonksiyonlar, numaralandırma, yapıları, malzeme çılgın miktarda alfabetik sıra. Ve açıkça kadar Ne yaptığınızı biliyorum, Bu, çok yararlı olacak değil hangi biz kategoriye göre API yapmak nedeni budur. Öyleyse başlayalım. Umarım zaten var Dağıtım kodunu indirildi. Ve böylece ne yapabilirim, değil mi Burada CS50 Cihazda, sadece bir terminal açın. İşte başlıyoruz. Yani zaten indirdiğiniz .zip kullanarak dağıtım kodu yöntemi. Ve ben bunu fermuarını açıp ettik. Yani burada SDL seminer yöneticisi bulunmaktadır. Yani bu dizine gitmek için gidiyorum. Ve biz burada ne olduğunu görmek için biz yedi C dosyaları var. Ve bu kodu gidiyor bugün bakıyor olacağız. Biz bir makefile var. Ve biz bir kaynak dizin var, hangi basit bir imaja sahiptir Bu yakında yeterince görüyor olacağım. Yani bu dosyaları açmak izin G-Edit editörü kullanarak. Yani tüm dosyaları açmak istediğiniz Merhaba ile başlar ve .c ile sona erer. İşte başlıyoruz. Yani küçücük bir pencere var, o yüzden sen Büyük emin olmak için çalışacağım. Hayır, bu gitti. Pekala. Yani burada ilk var Dosya biz bakmak için gidiyoruz. Bu hello1_sdl.c denir. Ve tüm bu yapar SDL başlatmak olduğunu Kütüphane biz bunu kullanmaya başlayabilirsiniz böylece. Gelmek bileyim Bu kod kendiniz ile? Peki, biz üzerinden bakmak belgelere ve biz başlatma gitmek ve bölüm kapatıldı hepimizi söyleyecek SDL başlatmak konusunda. Yani kesinlikle bu başka bir zaman okuyun. Size tüm söyleyecek Burada neler olup bittiği hakkında. Ama işin asıl püf noktası olduğunu Biz In It bu işlev SDL çağırmanız gerekir ve onu geçmek nasıl şeyler tür Biz kütüphane başlatmak istiyoruz. Bizim durumumuzda Yani, biz sadece gidiyoruz şimdi videoyu başlatmak için, Bu yüzden görüntüleri görüntülemeye başlayabilirsiniz. Buraya, eğer görebilirsiniz Biz In It bir SDL tıklayın biz Hatta daha fazla bilgi alabilirsiniz, Dönüş değeri de dahil olmak üzere. Yani biz burada bunu görüyoruz returnes başarısına sıfır. Bizim kodunda Yani, biz gidiyoruz sıfıra dönmez görmek, ve iade etmezse sıfır, bu yüzden, başarılı olmadı Sonra biz sadece baskı gidiyoruz Bu diğer işlevini kullanarak bir hata, Bir dize döndürür SDL olsun hatası, meydana hatayı açıklayan. Biz yazdırmak için gidiyoruz Hata ve o zaman biz sadece konum Programdan çıkmak için gidiyoruz Bir hata kodu ile. İhtiyacımız Sonra başka bir şey yapmak için, program çıkmadan önce, başarılı SDL başlatıldı halinde, biz sadece SDL çıkın diyoruz gerekiyor. Ve bu temizlik işlemek için gidiyor Bizim için SDL iç kaynakların hepsi. Yani dokümantasyon, yine orada-- burada başlatma vardır ve bölüm kapatıldı Belgelerin. Sadece tıklayabilirsiniz Burada fonksiyon, SDL çıkın, ve sen de bu konuda tüm okuyabilirsiniz. Ve bu işlevin bir sürü dokümantasyon sayfaları Örnek kodu var, bu yüzden bu Çok iyi bir kaynaktır. Kesinlikle biraz zaman harcamak Bu wiki bölümlerini okuyarak Yapmanız gidiyoruz eğer Bir proje için bu. Pekala. Yani bizim tüm program. Şimdi ben o-- ne yapabilirim Burada makefile açacak, bu yüzden bir alacağım nasıl çalıştığını bak. Ve, çok basit bir makefile var: Eğer daha önce gördüm ne benzer. Ana farklardan biri Bu, burada, bu çalışan sonucunu eklemek için gidiyor Zaten ettik bu komut, SDL yükledim kurdum. Ve bu bir komut Bu üretmek için gidiyor derleyici için bazı ekstra bayraklar. Buna ek olarak, biz bunu veriyoruz her zamanki gibi komutlar, aynı zamanda Bu iki komutları. Yani -lsdl2 görüntü kolları SDL görüntü kütüphanesinde bağlama. Ve -lm aslında bağlama kolları Standart C matematik kütüphanesinde. Yani biz ihtiyacımız olacak değil Bizim C tüm dosyaları için olanlar, biz böylece ama biz sadece onları koymak her şey için aynı makefile kullanın değişiklik olmadan. Buraya kaynaklarda, Bu nereye ediyorum olduğunu Eğer gittiğini dosyaları koymak Projeniz için derlemek için. Ama benim C her biri beri Burada dosyaları ana işlevi vardır o karışık olacak Biz hepsini koyarsanız. Yani, sadece söylemek için gidiyorum Şimdilik, hello1_sdl.c, hangi biz sadece baktı biridir. Ben geri gidip Yani eğer Burada, ben yaparım olabilir. Ve ne yaptım sadece bir ilk dosyayı derlenmiş. Ve sonra biz, çünkü ./game yazabilirsiniz o üretilen yürütülebilir var. Ve yaptım tüm yazdırma oldu başlatma başarılı. Bu yüzden doğru bir şey yaptım. Ama bu, bir tür sıkıcı bir pencere görmedim çünkü, hiçbir şey etrafında hareket ediyordu. Öylesine büyük, biz SDL başlatıldı var. Şimdi, bir şey geçelim Biraz daha ilginç. Yani burada biz hello2_window.c var, ve Bu biraz daha olacak Karmaşık C programı o SDL hemen önce gibi başlatır, Şimdi dışında biz de gidiyoruz SDL sayacını başlatmak için. Ve bu bize gidiyor İç zamanlayıcı erişmek ve kullanım fonksiyonları zaman ilgili. Ve sonra burada aşağı bakalım. Yapmamız bu işaretçi olduğunu Bir SDL pencere yapı, hangi Bu çağrı tarafından oluşturulan olacak işlevine, SDL pencere oluşturmak. Şimdi, bu argümanların bir sürü alır, böylece belgelerine bakmak gidelim. Yani yine, ben gidiyorum Kategoriye göre API, ben Burada ilk video aşağı gidiyor ve bölüm, pencere yönetimi görüntüleniyor. Yani bu bölüm vardır İçinde bir ton malzeme, ama içinden bakarsanız Bu işlevler, sen olacak muhtemelen tek biz bakın SDL penceresi oluşturmak denir istiyorum hangi üstünde doğru olur. Ve böylece bu Bu fonksiyon için belgeler. Pencere bir başlık var olacak, Ekrandaki bir x ve y konumunda, Bir genişliğe sahip olacak, yükseklik, ve daha sonra bazı bayraklar almaya gidiyor. Şimdi, biz aslında umurumda değil Şu anda bu bayrakların herhangi ama bir şey yapmak istiyorsa gibi tam ekran pencere yapmak, Bunun bakmak olabilir. Şimdilik, sadece gidiyoruz Bu özel değerler kullanmak için, SDL pencere artı merkezli için x ve y Sadece pencere oluşturmak için Bizim ekranın ortasında. Yani o ne yaptığını. Ve pencere olmak olur null, bir hata var, yani sonra tekrar biz sadece gidiyoruz SDL olsun hatası kullanılarak hata yazdırın. Ve sonra biz başlatıldı çünkü SDL, biz şimdi kapatmanız gerekir. Bu yüzden SDL önce çıkın çağrı Ana için bir dönen. Yani biz bu pencere umarım açmak var. Ve ne gidiyoruz Gideceğimiz yapmanız 5000 milisaniye SDL aramak için, bu beş saniye ile aynıdır. Ve biz bu işin bitince, pencereyi yok oluyor, SDL kütüphanesi temizlemek ve programdan çıkın. O yüzden go ahead ve bir atış olduğunu vereyim. Şimdi yerine değişen makefile her zaman, Ben sadece yapmak ve yapabilirsiniz Daha sonra komut satırına, kaynaklar eşittir ve sonra söylemek biz derleme ediyoruz dosyası. Yani hello2_window.c var. Harika. Hiçbir erros. Şimdi, bizim yürütülebilir çalıştırırsanız, Bu pencere görürsünüz. Şimdi birkaç vardır Pencerenin ile ilgili sorunlar. Biz bunu taşıyabilirsiniz, ancak bu var bunun içinde bu arka plan önemsiz. Bu yüzden çizilmiş değil şey, ve bu yüzden bu çöp, sadece tam olan hoş çok biz bekliyoruz budur. Ayrıca, pencereyi kapatmak olamaz. Ben bu X tuşuna basarak ediyorum Köşe ve hiçbir şey oluyor. Yani biz düzeltmek için nasıl göreceksiniz Biraz o. Yani kısmını düzeltmek edelim nereye Pencere ilk çöp dolu. Yani biz hello3_image.c üzerinden giderseniz ne Biz birkaç ekledik olduğunu görebilirsiniz burada daha fazla şeyler. Biz bu yeni başlık ekledik zamanlayıcı fonksiyonları almak için dosya. Ben son olarak yaptım sanırım biri de, ve ben bunu bahsetmiyorlar. Ama şimdi çünkü görüntülerle çalışırken, Biz SDL eklemeniz gerekir Görüntü başlık dosyası da. Yani aynı şey olarak var daha önce burada SDL başlatılırken, pencereleri oluşturma ile aynı anlaşma. Biz şimdi daha önce görmüştüm. Şimdi biz denilen bir şey yaratmak için ihtiyacınız olan çeşit birlikte gider bir renderer, pencere ile. Ama bu bir çeşit var soyut nesne Bütün bunları yaparken sorumlu pencereye işlemleri çizim. Ve aslında tekabül yüklü bir programa grafik donanım içine senin bilgisayar veya telefon ya da her neyse. Yani biz istiyoruz bayrakları Durdur-- geçmek ve belgelere bakabilirsiniz burada-- gidiyoruz daha fazla ayrıntı almak için SDL, hızlandırılmış işleme özellikleri de edilecek olan o olacak demektir Grafik donanım kullanarak ve sadece yazılımda benzetilmiş değil. Ve biz kullanmak için gidiyoruz SDL Renderer PRESENTVSYNC. VSYNC basitçe kılan bir şeydir Grafik iyi ve önler bakmak Bu şey denir ekran terör, nerede yarım Bir sonraki bir çerçeve ve yarım Çerçeve aynı zamanda çizilmiş olsun ve korkunç görünüyor. Fakat yine de, okumak gidebilirsiniz Kendi başınıza bu konuda. Yani biz burada bazı bayrakları var. Ve böylece biz sadece diyeceğiz Bu fonksiyon SDL renderer oluşturun. Biz bunu pencereyi vermek için gidiyoruz Bu renderer ile ilişkilendirmek için. Negatif biri ne umurumda değil demektir grafik sürücüsü kullandığımız için gidiyoruz. Yani hemen hemen gerektiği Her zaman negatif olmak, Eğer grafik sürücüleri hakkında bilmek sürece. Ve sonra biz sadece gidiyoruz o bizim bayrakları geçmek. O null döndürür Yani eğer, o zaman sen her zamanki gibi hata yazdırmak için gidiyor ama sonra biz de gidiyoruz Pencereyi yok önce bu kaynakları temizlemek için SDL çıkın çağırıyor ve geri dönen. Şimdi ilginç bölümü burada Bizim resim yüklemek nerede bu fonksiyon IMG_load kullanılmıştır. Bu Gittiğimiz tek işlevi SDL görüntü kitaplığından kullanmak için. Biz gereken tek kişi o. Bu dizeyi alır bir işlev var herhangi bir görüntü kaynağın yoludur. Ve bir .png olabilir, GIF, bitmap, bunlardan herhangi biri. Bu işlev çok güzel Ve bu yüzden. Bu hemen hemen herhangi bir biçimde işleyebilir. Bellek ve mağazalar onu içine yükler onu Bir şey, bir SDL yüzey denilen. Şimdi bir SDL yüzey sadece bir yapı olduğunu bellek görüntü verileri temsil eder. Yani hakkında daha fazla bilgi okuyabilirsiniz belgelerinde iki söyledi. Ve bu hatalar varsa, o zaman sen Her şeyi nereye yapacağız biz hata yazdırmak kapatmak bizim kaynaklar, ve sonra programdan çıkın. Şimdi ilginç bir şey daha önce olduğu Biz pencereye bu resim çizebilirsiniz biz aslında bir doku yapmak gerekir. Şimdi doku karşılık gelir yüklenen resim verilerine grafiğin donanım belleğine. Bu nedenle, ana yüzey içinde Hafıza, düzenli hafıza Hepimizin dönem kullanılarak oldum, ve bir doku bu ayrı VRAM ise Bellek ekran kartı denetimleri söyledi. Yani biz bu işlev çağrısı SDL_CreateTextureFromSurface. Biz bunu bizim oluşturucu ve yüzey verir. Ve sonra biz aslında konum yüzeyi ile yapılan Böylece biz sadece özgür için gidiyoruz. Biz artık gerek yok. Ve sonra bu çağrı eğer öyleyse errored ve boş döndü o zaman bütün yapacağız Yine bir şey raporlama hatası. Pekala. Burada, bazı içine almak Gerçek render işlevleri. Yani SDL_RenderClear çağırıyor ve geçen Bizim pencere ile ilişkili render sadece pencere siyah gitmek yapar. Yani önemsiz biz gördüğümüz o kaldırır bizim pencere önce ve siyah yapar. Ve sonra biz gidiyoruz SDL_RenderCopy ulaşmak için, o bizim render, bizim doku verir. Ve biz hakkında konuşmak ne yapacaksınız Bu alanlar biraz vardır. Ama bu gidiyor doku veri almak ve üzerine kopyalamak bizim Pencere resim çizmek için. Bu kopya yaptıktan sonra Yani Bizim pencere üzerine veri, biz bu ekstra fonksiyonu yapmak zorunda SDL_RenderPresent denir. Ve bu ilginç Bu olur çünkü çift ​​ara belleğe alma denilen bir konu haline. Yani çift tamponlama bir teknik olduğunu Grafik çok daha iyi görünmesini sağlar. Yine, bu ekran yırtılmasını engelleyici Ben, nerede daha önce bahsediyordu İki tamponlar var. Bir arka tampon içinde var hafıza ve bir ön tampon. Ön tampon tam anlamıyla Ne şu anda ekranda değil. Yani biz bu varyasyonları beraberlik her şeyi, SDL gibi kopya veya SDL_RenderClear hale arka tampon. Yani bir şeyler değiştirmek arka tamponda. İşte biz bu çizim olabilir arka tampon yeşil kare. Öyleyse biz yapıyoruz bitince Bizim hale işlemleri, burada Gerçekten uzun sürebilir Zaman, ne yapacağız tamponlar geçiş olduğunu. Yani kelimenin tam anlamıyla sadece alır Ön tampon ve arka tampon ve bu nedenle, onları anahtarları bu, ani, tek bir işlemde yerine Belki yüzlerce veya binlerce, bizim yeni render tüm nesneler ekranda bulunmaktadır. Ve bu şeyleri engeller Ekran ferahlatıcı gibi biz sadece boğuldum yarısı çerçeveye yönelik nesneleri. Dediğimiz gereken İşte bu yüzden SDL_RenderPresent yanı sıra SDL_RenderCopy olarak. Yine, biz sadece gidiyoruz beş saniye bekleyin. Sonra biz gidiyoruz Bizim kaynakları temizlemek. Biz daha epeyce bu zaman var. Ve sonra biz sadece gidiyoruz Programdan çıkmak için. O yüzden böyle yapalım. Ben kaynaklar make yazın gidiyor, sonra ben hello-- bu şimdi 3image.c olduğunu eşittir. Pekala, hiç hata derlenmiş. Ve burada görebilirsiniz şimdi var Resmimi süzgün, Merhaba, CS50! bizim pencere, hangi Beş saniye sonra kaybolur. Şimdi, bu hala doğru, sorunları var? Bu, iyi bir uygulama değildir, Ben pencereyi kapatmak için çalıştığınızda, çünkü hiçbir şey olmuyor. O x hala duyarlı değildir. Yani bir göz atalım Bir sonraki resime, hello4animation. Yani bu dosya Bu tanıtmak için gidiyor Bizim görüntüye hareketli ve hareket. Yani biz yapacağız Aynı şey eskisi gibi, SDL başlatmak oluşturmak Pencere, renderer oluşturmak içine resim yüklemek Bellek, doku oluşturmak. Biz önce bütün gördüm. Şimdi, bu yeni. Biz bir yapı denilen gidiyoruz Sadece bir dikdörtgen bir SDL rect. Burada üzerinde gidersek, biz SDL rect için bir arama yapmak, ve bunun bir olduğunu görebiliyorum çok basit bir yapı. Bir x, y için vardır konumu ve bir genişlik ve yükseklik için vardır Dikdörtgenin boyutları. Yani biz konum ne yapacağız olduğunu Bu SDL rect dest tanımlamak için gidiyor, Hedef için. Ve bu yer nerede ekranda Biz çizim için gidiyoruz Bizim görüntü, sağ Yani biz olmak için gidiyoruz etrafında hareketli görüntü, ardından hedef nerede Biz resim çizmek için gidiyoruz dolaşırım gerekir. Yani biz bu diyeceğiz Fonksiyon SDL_QueryTexture. Ve ben adresi geçirerek fark dest.w bölgesinin genişliği olan ve dest.h, yükseklik olan. Ve böylece SDL_QueryTexture gidiyor genişliği bu alanlarda saklamak için ve bizim doku yüksekliği. Ve sonra ben gidiyorum ne Ben gidiyorum yapmanız dest.x olmak için pencereyi ayarlamak için bir genişlik eksi dest.w, 2 bölü sprite genişliği. Ve bu yüzden kurmak için gidiyor Görüntü mükemmel merkezli olduğunu bizim penceresinde, tamam mı? Yani şimdi ben bir y konuma sahip. Ve bu gidiyor olan bir değişken olabilir biz olmak için gidiyoruz, çünkü değişen y yönünde hareketli görüntü. Ve şimdi biz bir şey var bir animasyon döngü denir. Peki nasıl animasyon çalışır? Peki, insan gözü 12 farklı algılayabilir Her saniyede görüntüleri, tamam mı? Bana 12 resim kartları flaş Yani eğer Bir saniye, ben bu görüntülerin her gördüm kendine özgü bireysel görüntü olarak. Şimdi, daha fazla flaş varsa İkinci olarak bana resim, Sonra gözüm başlamak istiyorum Onları birbirine karışmaya ve ben hareket olarak algılarlar olacaktır, yerine tek farklı görüntü. Yani, örneğin, filmler ve televizyon için, onlar 24 kez görüntüleri flaş bir saniye. Yani saniyede 24 kare var. Bilgisayar ekranları, diğer taraftan, genellikle saniyede 60 kare vardır. Bu onların yenileme hızı var. Yani yenilemek ne sıklıkta var Ekrandaki resim. Yani bizim hedef 60 olacak Bizim oyunlar için saniyede kare. Yani kodda olduğunu görelim. Her kare için Yani, biz öncelikle konum Pencereyi temizlemek için gidiyor. Bu genel bir kalıptır. Her zaman açık Pencere her kare, ve sonra senin çizim her şeyi işlemler ve sonunda RenderPresent göstermek do çerçeve içinde her şeyi. Ve sonra gidiyoruz sonunda bir bekleme var Bir sonraki beklemek Çerçeve başlamalıdır. Ben bir sürü yapıyor olsaydı Yani Burada karmaşık hesaplama Bu fazla 16 milisaniye sürdü, Benim için imkansız olurdu 60 O çerçeve hızı elde etmek için bu Her çerçeve çünkü, istediğim hesaplamak için çok uzun sürüyor. Ayrıca, gerçekten yapıyoruz iş ihmal edilebilecek kadar az sıralama Burada, sadece var, çünkü Biz çizim konum bir şey. Yani sadece a 1/60 oranında bekleyin ikinci olarak, uzunluğu olan kare arasında bir karenin. Yani bir çeşit yapıyorum gibi davranarak ediyorum Bütün çalışmalarım sıfır zaman alır. Ama gerçek bir oyun, Eğer çıkarmak zorunda kalacak süre bunu yapmak için aldı senin dinlenme zaman bütün bu çalışmalar. Neyse, ben neyim aslında bu döngü yapıyor? Pencereyi temizleyin. Ben bir int dest.y, set benim gerçek y konumu int dökülür. Şimdi, ben çözünürlüğü şamandıra istiyorum benim oyun benim y pozisyon için, ama sonra aslında için Ekranın üzerine çizmek, Bu birimler halinde olduğu için bu, ints ihtiyacı piksel, böylece döküm için var. Ben resim çizmek için gidiyorum. Yani bu kaynak dikdörtgen olduğunu. Ve bu hedef dikdörtgen. Yani null geçti kaynak dikdörtgen Benim bütün doku çizmek istiyorum demek. Ama eğer bir sürü vardı oyununda dokular ve onlar büyük bir doku haritası her şeysin bu sadece bir olarak SDL içine yüklendi doku, yapabilirsin Bir kaynak dikdörtgen kullanın Daha küçük dokular birini seçmek için, Daha küçük sprite biri, o büyük doku haritası dışarı. Yani yine, benim hale geçirerek, benim doku ve şimdi hedef. Bu nerede olacak penceresi çizilecek gidiyor. Ve sonra, ben animasyon olduğum için bir şey, ben hareket ihtiyacım var, Ben güncelleme için gidiyorum Her karede sprite konumu. Yani bu sabit denilen kaydırma var Saniyede piksel birimleri de hızlandırır. Şimdi, bir hareketi yapmak her zaman, Çerçeve sadece 1/60 saniyenin olduğunu. Yani 60 ile o bölmek için gidiyorum. Ve sonra, ben, görelim y konumu o çıkarılması. Neden çıkarılarak ki? Biz bir saniyede o alırsınız. Öyleyse benim kaynakları temizlemek ve program bitti. Yani o yapalım. Öyleyse yapmak SRCs = hello4 içine gidelim animation.c, tamam mı? Oyunu. Orada sen gitmek. Yani o kadar kaydırma var Oldukça düzgün penceresi. Ama çıkarılarak oldu, bekle y konumu her zaman gelen. Orada neler oluyor? Eh, o SDL çıkıyor ve Aslında, çoğu bilgisayar grafikleri, koordinat sistemi için kökenli Pencerenin sol üst olduğunu. Yani pozitif x yönü gider sağ pencerenizin karşısında. Ve pozitif y yönünde Aslında iner. Yani yine, Origin adlı bölgesindeki pencerenizin sol üst, Pozitif y yönünde, aşağı ve pozitif x sağa etmektir. Yani çıkarma yaparken y konumu, işte bu negatif gitmek yapacak up penceresi y yönü. Yani orada neler oluyor bu. Güzel. Dosyasının yanında bakalım. İşte parçasıdır nerede nihayet göstermek Pencerenin köşesinde o X olsun Bu pencereyi kapatmak gerekiyordu çalışmak. Yani ne oluyor? Biz, bir pencere oluşturmak, SDL başlatılamıyor , render oluşturmak resim yüklemek, doku oluşturmak gibi daha önce görmüştüm. Aynı hedef dikdörtgeni var daha önce olduğu gibi, aynı çağrı dokusunu sorgulamak için. Ama bu sefer, biz sonra konum genişlik bölmek için gidiyor ve 4 ile hedefimize yüksekliği. Bu yalnızca etkisine sahiptir imajımızı aşağı zaman ölçekleme biz dört tarafından penceresinde görüntüler. Yani oldukça düzgün değil. Biz sadece sadece böyle ölçeklendirilebilir. Biz sprite başlatmak için gidiyoruz Ekranın ortasında. Ve şimdi biz x ve y hız ve var ikisi de sıfırdan başlamak için gidiyoruz. Bu yanlış bir dosyadır. Özür dilerim. Yani hepsi doğrudur. İşte bu dosyadaki tüm hala. Biz 4 ve her şeyi ile uçurumu var. Yani burada bizim x ve y konumu var Pencerenin merkezi için. Ve biz bunu bir başlangıç ​​hızı vermek Bu sabit bir hızla, hangi Ben saniyede 300 piksel olduğuna inanıyorum. Şimdi, biz bu int gibi iyi olabilir var yakın talep adında bir boolean olabilir. Ve yerine bir yapıyor Burada bir zamanlayıcı üzerinde sonsuz döngü, biz animasyon için gidiyoruz yakın sürece talep edilmez. Peki nasıl olayları işlemek mı? Peki, SDL bir de olayları sıraya dizer perde arkasında literal kuyruk. Ve sonra her kare, Biz olayları sıradan çıkarma yapabilirsiniz kullanarak bu kuyruktan Bu çağrı SDL_PullEvent. Ve yine, kesinlikle okumak gitmek belgelerinde bu konuda. Çok daha fazla ayrıntı ve bir sürü var daha fazla işlevleri bununla kullanabilirsiniz. Biz adresi geçmesi Bu şey, SDL_Event biz burada yığını var. Şimdi, bir SDL_event nedir? SDL Çünkü biz bakarsanız documentation-- diyelim kategori, girişi, API bakın olaylar, olay yönetimi, Biz numara bakabilirsiniz Buradan farklı etkinlikler ve biz orada görebilirsiniz Bunların bir bütün ton. Yani bu SDL_Event şey nedir? SDL_Event bir birliktir. Vay, sendika nedir? Muhtemelen hiç ettik önce duydum. Ve bunda bir sorun yok. Bir sendika tür gibi Bir yapı dışında bir yapı, tümü için bir alana sahip kendi alanları ve bellek, Sendika sadece oysa yeterli alan en büyük sığdırmak için Bunu demek onun alanlardan biri, sadece alanlardan birini saklayabilirsiniz Bir zamanda, hangi tür Doğru, etkinlikler için mantıklı? Biz bir klavye olabilir olay veya pencere olay, ancak tek bir olay hem olamaz Klavye olayı ve bir pencere olay, bu yüzden için boşluk olması saçma olurdu Bizim olay birliğin içinde olanların hem de. Yani eğer istedim Kendi birliği oluşturmak tam olarak aynı görünüyor Bir yapı oluşturma gibi, dışında biz sendika anahtar sözcüğünü kullanın yerine struct anahtar kelime. Ve hepsi için hatırlıyorum senin sendika içindeki şeyler, Sendika fiili değişken sadece bu değerlerden birine sahip olabilir zamanında. Peki olayın ne tür söyleyebilirim biz sadece bu sıranın kapalı attı? Peki, biz Event.type için test edebilirsiniz. Ve bu eşitse SDL_Quit, biz biliyoruz olay olduğunu ne zaman biz oluşturulan Pencerenin köşesinde o X çarptı. Ve yakın talep set edebilirsiniz biz 1 eşittir. Gerisi sadece bazı animasyon Daha önce gördüğüm. O yüzden go ahead ve yapalım Bu ve nasıl çalıştığını iyi bakın. Yani markasını yazın gidiyorum ve Daha sonra SRCs = hello5_events.c. Oraya gidiyoruz. Oyunlar. Şimdi, biz ne görebilirsiniz Gerçekten dört ile küçültülmüş. Ve şimdi etrafta zıplayan var. Bazı çarpışma algılama var Pencerenin tarafı ile oluyor Biz bir göz alabilir. Bunu kapatmak için gittiğinizde ne olur? Bu kapatır. Harika. Biz bu olay aldı. Ve biz bunu ele. Yani kodunun geri bakalım. Peki onu nasıl aldın Böyle etrafta zıplayan? Unutmayın ben de x set ve ilk hızlara y. Ve hız pozitif olduğu sabit böylece var: gidiyor başlıyor almak aşağı ve sağa gidiyor. Şimdi, elleçleme ek olarak her kare, meydana gelmiş olabilecek olaylar, Ben sprite olmadığını algılamak için gidiyorum pencereden dışarı çıkmak için çalışıyor. Yani biz sadece kontrol ederek bunu yapabilirsiniz 0 ile x_pos sonra y_pos 0 ve Ayrıca x_pos ve y_pos ile pencere genişliği ve pencere yüksekliği. Ben çıkarılır ettik dikkat sprite genişliği. Ben yapmadım çünkü eğer Ve bu sprite genişliğini çıkarma, yalnızca olmadığını kontrol ediyorum sprite kökeni pencere dışında gitmedi. Ama biz bütününü istiyoruz sprite genişliği Her zaman penceresinin içinde olması ve sprite tüm yüksekliği Her zaman pencereye içinde olmak. Yani çıkarma için var. Burada geometri bir sürü can dışarı çekmek için yararlı olabilir koordinat ile kağıt üzerinde Sistem ne olup bittiğini görmek için. Ben çarpışır yoksa Yani, ben sadece sadece konumunu sıfırlamak o gitmiyor ki ekrandan dışarı. O sekerek Ve eğer ben, gidiyorum Yan duvarların birinde, Ben inkâr gidiyorum x hız böylece diğer yönde sıçrayan başlar. Ve benzer şekilde, bu isabet ederse üst veya alt, I y hızı ayarlamak için gidiyorum Negatif y hızına eşit, böylece geri sıçrama olacaktır. Yani biz burada var ki sadece nasıl. Ve güncelleme pozisyonları Sadece, daha önce gördüğümüz gibi Biz çünkü, 60 bölmek Sadece bir saniyenin 1/60 oranında taşıma. Ve sonra render daha önce tam olarak aynı. Ve böylece her şey bu dosya üzerinde gidiyordu. Biz olayları nasıl Yani bu. Önemli olan burada götürmek için Bu SDL_PullEvent fonksiyonudur. Ve kesinlikle okumalısınız SDL_Event hakkında belgeler daha Sendika, bu veri türü olduğundan çok çok önemli, bunu kullanmak için Olayların her türlü. Örneğin, biz klavyenin için kullanabilirsiniz olaylar, hangi bu dosyanın için budur. Peki ne var? Biz, daha önce olduğu gibi aynı şeyi , SDL başlatmak bir pencere oluşturmak, resim yüklemek, bir renderer oluşturmak belleğe, doku oluşturmak. Yine, biz gidiyoruz Bu hedef dikdörtgen var, Biz Görüntüyü ölçeklemek için gidiyoruz dört ile, biraz daha küçük yapmak. Şimdi, biz başlatmak için gidiyoruz ekranın ortasında sprite. Ama bu sefer, biz ayarlamak için gidiyoruz İlk x ve y sıfıra hızları, Klavye, çünkü Bu kontrol edecek. Ve dahası, biz gidiyoruz Bu değişkenlerin takip yukarı, aşağı, sola ve sağa. Ve bu devam edecek biz ettik olsun iz Klavye tuşlarını basılı olduğu yukarı, aşağı, sola karşılık, ve sağ. Şimdi, bu fantezi tür Biz W, A, S kullanabilirsiniz, çünkü, Burada D, ya da gerçek ok tuşlarını kullanın. Biz sadece bir saniye içinde olduğunu görürsünüz. Yani biz işlemek için gidiyoruz Sadece eskisi gibi olay. Biz olayı çekin. Ama şimdi biz gidiyoruz Olay türü açın. O SDL_Quit ise, biz konum yakın ayarlamak için gidiyor daha önce olduğu gibi, birine istedi. Yani içinde x kolları Pencerenin köşesi, Bizim pencere aslında bir şekilde kapanacaktır. Aksi takdirde, bir SDL anahtar alırsanız aşağı Biz tuşuna bastığında anlamına olay, Sonra ne yapacağız biz olman Burada bu şey üzerinde geçiş yapmak için gidiyor hangi böylece event.key means-- Bizim olay birlik tedavi anlamına gelir, gidin ve anahtarı almak bu olay yapısı. Peki bu çıkıyor Sendika önemli bir olay yapıdır. Ve sonra anahtarına gidin Etkinliğin yapısı saha adı keysym ve scancode. Ve yine, kesinlikle okumak Bu konuda belgeler. Kelime girişler oldukça ilginç. Tarama kodları veya anahtar kodları alabilirsiniz. Ve bu, biraz ince ama dokümantasyon oldukça iyidir. Biz tarama kodu için bkz Yani olmak W veya yukarı bizim tuşa basın, Biz 1'e eşit kurmak için gidiyoruz. Ve sonra biz bu anahtarın patlak. O A veya sola ise, biz ve diğerleri, 1 sol seti vesaire, vesaire, aşağı ve sağa için. Şimdi, bu dış anahtarı üzerinden, Biz olayı bir anahtarı görürseniz, biz bir anahtar sunduk demektir ve biz artık basıyoruz. Yani 0 eşittir kadar söylemek için gidiyorum, Sol, aşağı, sağa 0 eşittir 0 eşittir 0 eşittir, vesaire. Ve biz bunların her biri var fark İki olgu birbirine hemen yanındaki koymak ayrı bir kod ile İlk durumda, bu için o olsun demektir S ya da tam burada aşağı, Bu kod yürütmesine gidiyor. Yani oldukça kullanışlı. Bize daha fazlasını yapmak zorunda önler koşulları ve IFS ve işler bunun gibi. Yani biz gidiyoruz hız belirler. Biz 0 hız ayarlayın. Sonra yukarı basılırsa ve aşağı değil, o zaman Negatif hız y hızı ayarlayın. Negatif hatırlıyorum çünkü Negatif y yönünde kadardır. Ve pozitif y yönünde aşağı. Basıldığında ise ve yukarı, sonra sen Pozitif hıza ayarlamak için gidiyor, Hangi ekran aşağı gidiyor demektir. Sağ ve sol ile aynı şey. Ve sonra biz güncelleştirmek için gidiyoruz Sadece eskisi gibi pozisyonlar. Biz çarpışma yapacağız sınırları ile tespiti, ama biz sıfırlamak için gitmiyoruz hız, hız sadece çünkü klavye ile kontrol. Ama biz sıfırlamak için gidiyoruz Pozisyonlar penceresinde tutmak için. Ve biz ayarlamak için gidiyoruz yapı içinde pozisyonları ve daha sonra her şeyi daha önce gelen şeyler render. Yani o ne yaptığını görelim. Yani SRCS-- bakalım yapmak, Bu hello6_keyboard.c olduğunu. Oh hayır. Yani biz burada bazı uyarılar var. Ve bu sadece biz değil mi söylüyor her türlü olası kontrol Olayın. Çünkü, Tamam Bunlardan 236 ya da öylesine var. Yani bu uyarıları görmezden gidiyorum. Hala ince derlenmiş. Yani oyunu oynamak için gidiyorum. Bu hareket etmiyor. Ama şimdi, benim klavyede püre zaman, Ben, burada bazı WASD hareket yapabilirsiniz Ben de benim ok tuşlarını kullanın. Ve ben bile fark Sağ hemen presleme, o pencereden dışarı gitmiyor Her karede sıfırlamak için. Yani oldukça düzgün değil. Sen ile Mario dolaşırım hayal edebilirsiniz Bazı ok tuşları veya böyle bir şey. Ve evet, X çalışır. Biz gidiyoruz Yani son dosya hellow7_mouse, bakmak için. Bu fare girişini alma hakkında olduğunu. Biz bu bir Yani matematik başlığı ithalat, biz gidiyoruz çünkü Burada matematik biraz. Aynı eski, aynı eski şeyler, hedef, daha önce olduğu görülmektedir, aynı eski. Peki, bu ilginç. Yani biz sadece kontrol için geri döndük SDL için olayı çıkın. Neden? Yani olaylardan fare giriş alabilirsiniz. Fare taşındı gibi, Bunun için bir olay olsun. Bir fare düğmesine basıldığında, Bunun için bir olay alabilirsiniz. Ama, biraz daha basit bir var Belki, fare girişini almak için API. Ve bu sadece SDL olsun fare devleti var. Yani x için bir int var ve imleç konumu için y. Ben, SDL_GetMouseState onu geçmek Hangi bunlar belirler. Ve bu pozisyon Pencerenin koordinat sistemi. Yani kitle sol üst ise Pencerenin, o 0, 0 olur. Şimdi ne yapacağım ben gidiyorum olduğunu Vektör matematik biraz yapmak. Seni değil düşündüm bahis CS50 içinde olduğunu görmek, ama burada öyle. Bazı vektör yapacağım matematik vektör olsun imleç görüntüden. Ve böylece neden var Burada bu çıkarma? Eh, ben sadece dest kullanılırsa .-- yani Fare x çevirmek gerekiyor ve genişliğinin yarısı ile y ve Resim yüksekliği, Ben merkezini istiyorum çünkü Görüntü, fare doğru gidiyor Görüntünün değildir kökeni. Yani ben konuşuyorum emin olmak için sadece var Burada görüntünün merkezinde yaklaşık. Sonra delta x ve y olsun hangi hedeften fark görüntünün gerçek konumuna getirin. Ve sonra biz alabilirsiniz Burada mesafe hangi Pisagor olacak teoremi, x in karekökü kez x artı y kez y. Şimdi titreme önlemek için, ve ben gösterebilirim Eğer bunu yapmazsanız, bu ne, eğer imleç ve arasındaki mesafe Görüntü merkezi, beşten az olması Ben sadece görüntüyü taşımak için gitmiyorum. Aksi takdirde, biz hız ayarlayın. Ve biz, böylece ayarlayın hız daima sabit olacaktır. Ve tüm net sonucu bu matematik görüntü olmasıdır imleç doğru hareket edecek. Şimdi, o çıkıyor SDL_GetMouseState, ayarı ek olarak x ve y burada argümanlar, o da gelen bir int döndüren Fare düğmeleri durumuna. Yani biz o okuyamaz doğrudan, ama biz tek bu makroları kullanmak Bitwise operatörü, bu korkutucu değil, Sadece bir bitsel ve. Bu yüzden sonucu olan düğmeler söylüyor Bizim SDL_GetMouseState arasında, eğer bitsel ve bu makro ve Burada, SDL_BUTTON_LEFT. Yani bu sadece gidermek için gidiyor karşılık gelen bitmap sol fare düğmesine basılmasını. Ve böylece bitwise eğer ve oluşur ve var anlamına değil sıfır, sol düğmeye basıldı, Sonra biz aslında inkâr gidiyoruz X ve Y hızları, hangi sadece görüntü kaçak yapacaktır. Güncelleme pozisyonları. Çarpışmalar tespitleri, gördüm hepsi daha önce, render, tamam. Şunu yapalım. Yani SRCs = hello7_mouse.c yapmak var. Büyük. Hiçbir hata. Ve oyun. Yani burada benim fare var. Ve Görüntü gerçekten de benim fare peşinde. Şimdi bir oyun belki, yapmak Bu düşman kovalayan gibi küçük karakter ya da her neyse. Ama burada biz Görüntü fareyi kovalayan. Ve ben tıklayın, fare Görüntüyü kovalamaya başlar ve görüntü uzakta fare koşuyor. Yani oldukça serin. Ve haber yine var Burada hala çarpışma algılama. Böylece nihai biraz Demo burada kurdunuz. Ve en bir şey daha bir göz atalım. Yani buraya, ben bu jitter bahsettiniz. Pekala. Mesafe az beş piksel Yani eğer, Ben sıfır x ve y hızını batıyordu. Biz kurtulmak ne olur? Ben sadece bunu yapmak için gidiyorum. Bu korkunç tarzı Lütfen özür, ama biz doğru kodunu yorumladı. Yani bu kaydetmek ve yapacağım Bunu yapmak için önce aynı komut. Pekala. Ve şimdi ne olacak? İyi. Biz hala izliyoruz Sadece eskisi gibi fare, ama biz fare gidince, Bu brüt titremeleri var. Orada neler oluyor? Eh, bizim vektör içinde matematik, biz hatırlıyorum arasındaki mesafeyi alarak imleci ve görüntünün merkez? Eh, o yaklaştıkça 0, biz başlıyorsun çılgın davranış bu tür gibi nerede görüntü çeşit olduğunu imlecin çevresinde salınan gibi. Ve bu titremeleri yaratıyor. Ve bu gerçekten çirkin. Ve muhtemelen yok senin oyun bunu yaparken istiyorum Bunun sürece özel efekt çeşit. Elimizdeki İşte bu yüzden sadece bu keyfi nereye demek, beş piksel kesti beş piksel içinde ise, biz iyiyiz. Artık görüntüyü taşımak gerekmez. Yani orada neler oluyor bu. Yani hemen hemen öyle. Şimdi nasıl oluşturulacağını bilmek Bir pencere, bir resim yüklemek, penceresine bir görüntü çizmek, olsun klavye girişi, fare girişi olsun, Diğer bir grup var girdi o Istemezdiniz Eğer sadece bir harcama varsa nasıl biliyor belgelerine bakarak birkaç dakika. Yani aslında var oldukça Şimdi emrinde birkaç araçları tam teşekküllü bir oyun yazmak için. Şimdi, her oyun bazı ses ihtiyacı ama ses dokümantasyon de oldukça iyidir. Ve ben eğer bahse hazırım Eğer şeylerin hepsini anlıyorum biz bugün hakkında konuştuk görüntüleri ve yüzeyler, Sonra pencere ve her şey, bulmaktan ses API değil gidiş o kötü olması. Yani görmek için sabırsızlanıyoruz Eğer SDL ne oluşturun.