Visual C++ ile Görsel Programlama 6 (Win32)
Visual C++ ile Görsel Programlama 6 ( Balonları Vurmaca oyunu )
Visual C++ ile Görsel Programlama 6 ( Balonları Vur )
ilk oyunumuzu yazıyoruz. Fare ile ekrandaki hedefi kullanarak balonları vuracağız, amaç kısa sürede hepsini vurmak. Her ne kadar bu tek bölümlük basit bir oyun olsa da birçok olayı anlamanızda kaynak olacaktır. directX ve OpenGL oyunlarına geçmeden önce bu oyunu iyice anlamaya çalışalım.
Oyuna geçmeden önce standart C özelliklerini daha öğrenmek zorundayız. Programlamaya yeni başladıysanız bu konuya başlamadan önce ilk ders olan C temelleri kısmına mutlaka göz atın, bu kısımdaki konuları anlamanız için; Değişken, Sorgu ( if ), Dizi ( Array ), Yapı ( Struct ) , gibi terimleri öğrenmeniz gerekiyor.
Aşağıda kaynak kodu verilen oyunu indir:
http://hotfile.com/dl/126863266/9fe47e1/oyun.zip.html
Visual C++ 6.0 için kaynak kodunu indir:
http://hotfile.com/dl/126863267/455a0b5/balon.zip.html
#include "windows.h" #include "time.h" //bitirme süresini hesaplamak için #include "resource.h" //sadeceresimleri eklemek için #define ID_ZAMAN 100 const char Classismi[] = "pencere"; HBITMAP resim=NULL; //balon resmi HBITMAP hedefRsm=NULL; //hedef resmi int hedefX; //hedefin konumu int hedefY; int ates=0; int i; int fark; //oyunu bitirme zamanı int bitti; //tüm balonlar vurulunca bitti=1 olacak time_t giris,bitis; //oyuna girme ve çıkma zamanları typedef struct _BALON //balon cismi tanımlıyoruz { // sadece işimizi kolaylaştırıyor int X; //yoksa her balon için bu değişkenleri ayrı ayrı tanımlayacaktık. int Y; int saglam; //bu değer balon vurulmamış ise 0 olacak int yon; //haraket yönü int hiz; } BALON; BALON balon[7]; //yedi tane balon yapıyoruz LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; HDC resimhdc; PAINTSTRUCT ps; RECT anakare; HDC hedefhdc; char sure[8]; char metin[]="Bitirme süreniz : "; switch(msg) { case WM_KEYDOWN: if(wParam=VK_ESCAPE) //ESC tuşuna basıldı { DestroyWindow(hwnd); } break; case WM_MOUSEMOVE: //fare haraket ettirildi hedefX = LOWORD(lParam); hedefY = HIWORD(lParam); break; case WM_LBUTTONDOWN: //fare sol tuşu basıldı if(ates==0) { hdc=GetDC(hwnd); //hedefin altındaki renk sarı ise işlem yapılır sarı=RGB(255,255,0) if(GetPixel(hdc,hedefX+11,hedefY+11)==RGB(255,255,0)) { //sol tuş basılınca tüm balonlar döngü ile kontrol edilip hedefin altındakiler belirleniyor for(i=0; i<7; i++) { if((balon[i].X < hedefX+11) && (hedefX+11 < balon[i].X+17)) { if((balon[i].Y < hedefY+11) && (hedefY+11 < balon[i].Y+39)) { //hedefin altındaki balonun sağlam isimli değişkeni 1(bir) yapılıyor balon[i].saglam=1; bitti=1; } } } } ReleaseDC(hwnd,hdc); ates=1; //ateş edildi, tekrar ateş için tuşu bırakmalı } break; case WM_LBUTTONUP: //fare sol tuşu bırakıldı ates=0; //tuşu bırakmadan tekrar ateş edemez break; case WM_PAINT: //pencere boyama işlemi hdc = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); break; case WM_TIMER: //zamanlayıcı, saniyede 20 kere tekrarlanan çizim ve haraket işlemleri hdc = GetDC(hwnd); GetClientRect(hwnd, &anakare); FillRect(hdc, &anakare, (HBRUSH)(WHITE_PEN)); resimhdc = CreateCompatibleDC(hdc); //iki tane resim tutucu hdc tanımlanıyor hedefhdc = CreateCompatibleDC(hdc); SelectObject(resimhdc,resim); for(i=0; i<7; i++) { //çizim yapılırken sağlam değişkeni 0(sıfır) olanlar çiziliyor if(balon[i].saglam==0) { //balonları çiz BitBlt(hdc,balon[i].X,balon[i].Y,17,39,resimhdc,0,0,SRCAND); //balonlar sol tarafa kaçmasın if(balon[i].X <= 0) { balon[i].yon=1; } //balonlar sağ tarafa kaçmasın if(balon[i].X >= 500) { balon[i].yon=0; } //balonların yeri -hiz- kadar değiştiriliyor if(balon[i].yon==0) { balon[i].X-=balon[i].hiz; }else{ balon[i].X+=balon[i].hiz; } } } //balonların hepsi vuruldu mu? for(i=0; i<7 ;i++) { if(balon[i].saglam==0) { bitti=0; } } //balonlar bittiyse pencereyi kapat if(bitti==1) { DestroyWindow(hwnd); } //hedefi çiz SelectObject(hedefhdc,hedefRsm); BitBlt(hdc, hedefX, hedefY, hedefX+22, hedefY+24, hedefhdc, 0, 0, SRCAND); DeleteDC(resimhdc); DeleteDC(hedefhdc); ReleaseDC(hwnd, hdc); break; case WM_CREATE: // pencere oluşurken sadece bir kez yapılacak işlemler //resimleri yükle resim = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1)); hedefRsm= LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP2)); //zamanlayıcıyı ayarla SetTimer( hwnd, ID_ZAMAN, 50, NULL ); GetClientRect(hwnd, &anakare); hedefX=anakare.right/2; //hedefi pencerede ortaladık hedefY=anakare.bottom/2; for(i=0; i<7 ;i++) //balonların konumunu belirle { balon[i].X=i*15; //tektek yazmak yerine balon[i].Y=i*50; //döngü ile iki satırda belirledik balon[i].hiz=2; } balon[3].hiz=1; //dört balonun hızını değiştiriyoruz balon[1].hiz=4; balon[5].hiz=1; balon[6].hiz=3; balon[1].yon=1; //üç balonun yönünü değiştiriyoruz balon[4].yon=1; balon[0].yon=1; ShowCursor(FALSE); //fare okunu gizle time(&giris); break; case WM_CLOSE: //pencere kapatıldı DestroyWindow(hwnd); break; case WM_DESTROY: //pencere yok ediliyor DeleteObject(resim); DeleteObject(hedefRsm); KillTimer(hwnd, ID_ZAMAN); //balonlar bittiyse bitirme süresini göster if(bitti==1) { ShowCursor(TRUE); time(&bitis); fark=difftime(bitis,giris); itoa(fark,sure,10); strcat(metin,sure); strcat(metin," saniye"); MessageBox(NULL,metin,"Oynadığınız için teşekkür ederiz",MB_OK); } PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hwnd; MSG Msg; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = Classismi; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Pencere tanımlama hatası!", "Hata!", MB_ICONEXCLAMATION | MB_OK); return 0; } hwnd = CreateWindow(Classismi,"www.tr3d.com -> basit oyun denemesi",WS_DLGFRAME, 200, 200, 500, 400,NULL, NULL, hInstance, NULL); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; } |
Konuyu anladık mı ?
Uygulama sorusu: Bu oyunu geliştirin. Bazı balonların yukarı ve aşağı gitmesini sağlayan bir kod ekleyin.
Ekleyen: drekon
Bu konu benim için çok önemli fakat dosyayı indiremiyorum sanırım hotfile le ilgili bir sıkıntı var oyun dosyasını benimle paylaşabilirmisiniz acaba.
- Offline
- Erkek
Kapalı
Eklediğim Dersler
Ders Kategorileri
Yeni Dersler (Tutorials)
- Armor Modelleme
Ekleyen: Dereli - Ücretsiz Zbrush Dersi.
Ekleyen: BurakB - Corona Render ile Salon Görselleştirme
Ekleyen: barcelona1988 - Tek Bir Resimle Nasıl Sinematik Görüntü Ala Biliriz?
Ekleyen: PixlandPictures - After Effects - Script kullanmadan karakter rigleme
Ekleyen: PixlandPictures - 3dsmax landscape_ Making of Part1
Ekleyen: altıneldiven - Oyun yapımı dersleri 5 - Unity3D Sahne Duzeni
Ekleyen: drekon