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

Link sorunu
gbbbgokhan bezirci

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.


2014-04-19 01:28:49
  • Offline
  • Erkek

Kapalı

Topic closed automatically because it`s been more than a year!