Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
13
Cevap
985
Tıklama
0
Öne Çıkarma
Oyun Kodlama
N
20 yıl
Teğmen
Konu Sahibi

Arkadaşlar ben 3ds max biliyorum ve tsarımlarım var acaba hangi programlama dili ile oyun yapılıyor erden başlanıyor bilen varmı lüfen yardımcı olurmuusnuz...

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



D
20 yıl
Yarbay

oyun dersen c derim hızlı olması açısından

delphi ilede yapabilirsin ama c ye göre yavaş olur.
bu ileri kolaylaştırmak için delphide bir sürü component var.
delphix gibi yada opengl scene

delphix ile directx tabanlı diğeri ilede opengl tabanlı oyunlar yazabilrisin

birde 3dwebmaker gibi yada morfit motorunu kullanan delphi ve c++ uyumlu motorlar var

yada bir oyun motoru oluşturmaktansa
quake3 motorunu nette hem c++ hem delphi versiyonu açık olarak var.


ayrıca 3dsmax maya gibi 3d uygulamaların 3d projerlini açmak için loader unitler var. ama daha çok yol kat etmen gerek.





< Bu mesaj bu kişi tarafından değiştirildi drony -- 16 Haziran 2005, 16:12:46 >
Bu mesaja 1 cevap geldi.
İ
20 yıl
Binbaşı

Oyun yazmak bilinen bir çok programlama dalından zordur...


Bu mesaja 1 cevap geldi.
D
20 yıl
Yüzbaşı

Oyun yazmak zor değildir; Hatta 3D MAX bilen biri için çok daha kolay olmalı.. Çünkü oyun programlama özellikle lineer cebir/matris mantığına dayanır. Örneğin bir küp'ü programlarken X,Y,Z uzayında 8 noktayı belirtersiniz ve kullandığınız kütüphane(OpenGL/DirectX) onu çizer. Mesala Transformasyon/Filtreleme falan uygulamak için bu 8 noktanın oluşturduğu matrisi çeşitli fonksiyonlara tabi tutarsınız..

Oyunlar C dili ile yazılır. Diğer dilleri (tabi makine dili hariç) kullanmak performans düşüklüğü yaratır. Grafik kütüphanesi olarak openGL'i tavsiye ederim, aşağıda verdiğim linkte en basit'ten zor'a doğru tutorial ve ayrıca source kodlar bulabilirsiniz ama bu iş için biraz sabır da gerekecek kolay gelsin..

http://nehe.gamedev.net/


Bu mesaja 1 cevap geldi.
İ
20 yıl
Binbaşı

ZOR dan kastım Windows ortamından Direct X mesela programlamak için yoğun API bilgisi ve Kütüphane yi tanımak gerektiği idi. Bunu öğrenmek bile zaten kayda değer bir zaman alacaktır. Birde işin matematiksel yönüne değinmişsiniz Oyun yazımına zor dememin bir diğer yönüde Yoğun hesaplama gereksinimi ekrandaki rotasyonlar nesneler arası katmanlar vs...

Sıfırdan bir dil öğrenmekten farkı yok. Elbette yeni başlamış bir insan için. 3D max bilmek sadece grafik objeleri ve mekan tasarımları için uygun ve avantaj olabilir bence.

Bu yazdıklarımla amacım kişiyi oyun programladan soğutmak deil yoğun çalışma ve azim gerektiren (Programlama :)) bir konu olduğunun altını çizmektir.


Bu mesaja 1 cevap geldi.
N
20 yıl
Teğmen
Konu Sahibi

Arkadaşlar iyice kafam karıştı :
Şimdi ben bir kutu çizdim diyelim örnek onun klavyeden yukarı ok tuşuna bastığım zaman ileri gitmesini istiyorum örnek olarak nasıl yaparım ne kullanır nerden başlarım :)


Bu mesaja 2 cevap geldi.
İ
20 yıl
Binbaşı

quote:

Orjinalden alıntı: Night_Lord

Arkadaşlar iyice kafam karıştı :
Şimdi ben bir kutu çizdim diyelim örnek onun klavyeden yukarı ok tuşuna bastığım zaman ileri gitmesini istiyorum örnek olarak nasıl yaparım ne kullanır nerden başlarım :)


@theDarkTemplar arkadaşımızın verdiği sitede daha detaylı bilgi bulabilirsin ama ben yinede TÜRKÇE açıklanması bakımından bir örnek atayım sana bu çok basit bir konsol ekranında çalışan bir oyun! Ayrıca bu işle gerçekten uğraşacaksan Win32 Api+opengl ile ilgili bulabildiğin dökümanları topla...Bu kod içerisinde klavye yönlendirmeleri mevcut... Ama senin istediğin şey OPenGL programlama bilgisi istediği için yanıt veremiyorum...

ALINTIDIR ----------------------------------------------------------------------------------------------------------------

quote:

/*
Text ortaminda calisan ornek bir oyunun kaynak kodudur
oyundaki durumlarin benzerleri gunumuzdeki diger oyunlarda da
kullanilmakta.

Mesela Age of Empires oyunundaki SPEARMAN karakterinin
hareketlerini düsünelim. Bu karakterin belli
hareketleri olacaktir. Yurume, ates etme, olme
gibi. Bu tur hareket olaylarini bizim kodda mermi icin
kullandigimiz teknige benzer bir teknikle
hareket ettirip, yapay zekası kontrol edilebilir

typedef enum {MOVE, DIE, THINK, TURN vs...}STATE_SPEARMAN;

kod icinde ise bu durumlari switchler yardimi ile
cozup istenilen hareketler uygulanabilir

switch( g_Spearman[0].GetState() )
{
case MOVE:
g_Spearman[0].Move( );
case DIE:
g_Spearman[0].Die();
....
}

Tabi bu durumlar oyun akisi icerisinde de gecerli
sadece karakterler bazinda degil. Oyun durdu mu,
baslangic ekraninda mi, yoksa oyun herhangi bir
bolumu mu hesapliyor, bu tip durumlarda bu ornekte
yaptigimiz sekilde kontrol edilebilir

Yazdigim kod biraz aceleye geldi, fazla eklemeler yapamadim.
Ama asil amacim bu durumlarin ve genel oyun akisinin nasil
olmasi gerektigini gosteren bir ornek kod yazmakti. Bu tip
olaylari ileride yazacagimiz kodlarda kullanacagiz. Yalniz platform
text ortami degil de windows ta grafik ortaminda olacak.
Sadece cagiracagimiz fonksiyonlar farklı olacak.

Kod iyice test edilmedi bu yuzden bug lar bulmaniz olasidir :))))...
*/
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

// oyun akis durumlari
#define OYUN_CALISIYOR 0x00 // 0000 0000 binary
#define OYUN_DURDU 0x01 // 0000 0001 binary
#define OYUN_BITTI 0x02 // 0000 0010 binary
#define OYUN_YARDIM 0x04 // 0000 0100 binary
#define OYUN_YENILDI 0x08 // 0000 1000 binary

// kullanacagimiz alanlarin sinirlari
#define DUNYA_GENISLIGI 79
#define DUNYA_YUKSEKLIGI 23

// mermi durumu
#define MERMI_ATESEDILMEDI 0x00
#define MERMI_ATESEDILDI 0x01

/*----------------------------------------------------------
Tanimlar ve global degiskenler
----------------------------------------------------------*/
// geminin yonu
typedef enum tagYON{SOL=0, SAG, YUKARI, ASAGI}YON;

// oyunla ilgili bilgilerin tutuldugu yapi
typedef struct tagOYUN
{
int oyundurumu;
int skor;
int hak;
}OYUN, *POYUN;

// gemi ile ilgili bilgilerin tutuldugu yapi
typedef struct tagGEMI
{
int x;
int y;
}GEMI, *PGEMI;

// mermi ile ilgili bilgilerin tutuldugu yapi
typedef struct tagMERMI
{
int x;
int y;
int mermidurumu;
}MERMI, *PMERMI;

// Bu yapi uzerinde biraz durmak istiyorum. Kullandigimiz
// text ortamini 79x23 lük bir array olarak dusundum. Ve
// arrayin herbir elemaninin hucredurumu degiskeni ekrana
// basilacak olan karakterin integer degerini tutuyor. Yani
// ekranin x = 10, y = 2 koordinatlarina 'A' karakteri basmak
// istersek dunya[2][10].hucredurumu = 'A' dememiz yeterli
// olacaktır. Bu bilgiler Dunya_Ciz(...) fonksiyonu tarafindan
// ekrana output edilmektedir.
typedef struct tagDUNYA
{
int hucredurumu; // ekrana cizilecek olan karakter degerini
// tutar
}DUNYA, *PDUNYA;

/*----------------------------------------------------------
Yeni bir oyun hazirla
----------------------------------------------------------*/
void Yeni_Oyun( DUNYA dunya[][DUNYA_GENISLIGI], POYUN oyun )
{
for( int y=0; y<DUNYA_YUKSEKLIGI; y++ )
for( int x=0; x<DUNYA_GENISLIGI; x++ )
dunya[y][x].hucredurumu = ' ';

oyun->oyundurumu = OYUN_CALISIYOR;
oyun->skor = 0;
oyun->hak = 3;
}

/*----------------------------------------------------------
Geminin seklini anaplatforma ciz
----------------------------------------------------------*/
void Gemi_Ciz( PGEMI gemi, DUNYA dunya[][DUNYA_GENISLIGI] )
{
int x = gemi->x-1 , y = gemi->y-1;

dunya[y][x].hucredurumu = 219;
dunya[y][x+1].hucredurumu = 223;
dunya[y][x+2].hucredurumu = 223;
dunya[y][x+3].hucredurumu = 223;
dunya[y][x+4].hucredurumu = 219;
}

/*----------------------------------------------------------
Gemiyi belirtilen yone gore hareket ettir. Eger geminin
hareket ettigi noktada dusman :) varsa fonksiyon true
dondurur
----------------------------------------------------------*/
bool Gemi_Oynat( PGEMI gemi, DUNYA dunya[][DUNYA_GENISLIGI], YON yon )
{
int x = gemi->x-1 , y = gemi->y-1;

dunya[y][x].hucredurumu = ' ';
dunya[y][x+1].hucredurumu = ' ';
dunya[y][x+2].hucredurumu = ' ';
dunya[y][x+3].hucredurumu = ' ';
dunya[y][x+4].hucredurumu = ' ';

// gonderilen yone gore geminin yeni x ve y koordinatini belirle
switch( yon )
{
case YUKARI:
gemi->y--;
if( gemi->y < 2 )
gemi->y = 2;
break;
case ASAGI:
gemi->y++;
if( gemi->y > DUNYA_YUKSEKLIGI-1 )
gemi->y = DUNYA_YUKSEKLIGI-1;
break;
case SOL:
gemi->x--;
if( gemi->x < 2 )
gemi->x = 2;
break;
case SAG:
gemi->x++;
if( gemi->x + 5 > DUNYA_GENISLIGI )
gemi->x = DUNYA_GENISLIGI -5;
break;
}

x=gemi->x-1; y=gemi->y-1;

if( dunya[y][x].hucredurumu != ' ' || dunya[y][x+1].hucredurumu != ' ' ||
dunya[y][x+2].hucredurumu != ' ' || dunya[y][x+3].hucredurumu != ' ' ||
dunya[y][x+4].hucredurumu != ' ' )
return true;

// gemiyi ciz
dunya[y][x].hucredurumu = 219;
dunya[y][x+1].hucredurumu = 223;
dunya[y][x+2].hucredurumu = 223;
dunya[y][x+3].hucredurumu = 223;
dunya[y][x+4].hucredurumu = 219;

return false;
}

/*----------------------------------------------------------
Merminin hareketlerini hesapla
----------------------------------------------------------*/
void Mermi_Ciz( PMERMI mermi, DUNYA dunya[][DUNYA_GENISLIGI], POYUN oyun )
{
int x = mermi->x, y=mermi->y;
dunya[y][x].hucredurumu = ' ';

if( mermi->mermidurumu == MERMI_ATESEDILDI )
{
dunya[y+1][x].hucredurumu = ' ';
mermi->y--;
dunya[y][x].hucredurumu = 223;

// mermi menzil disinda mermimiyi bitir
if( y < 3 )
{
mermi->mermidurumu = MERMI_ATESEDILMEDI;
dunya[y][x].hucredurumu =' ';
}

// mermi dusmana carpti dusmani oldur, skoru artir
if( dunya[y-1][x].hucredurumu != ' ' )
{
dunya[y][x].hucredurumu = ' ';
oyun->skor += 100;
mermi->mermidurumu = MERMI_ATESEDILMEDI;
}
}
}

/*----------------------------------------------------------
79x24 boyutundaki dunya degiskeni ekranin hangi
koordinatina hangi karakteri cizmek istiyorsak onun
degerini tutar.
----------------------------------------------------------*/
void Dunya_Ciz( DUNYA dunya[][DUNYA_GENISLIGI] )
{
gotoxy(0,0);
for( int y=0; y<DUNYA_YUKSEKLIGI; y++ )
{
for( int x=0; x<DUNYA_GENISLIGI; x++ )
{
gotoxy(x,y);
printf("%c", dunya[y][x].hucredurumu);
}
printf("\n");
}
}

/*----------------------------------------------------------
Oyun durdu yazisini kullaniciya goster
----------------------------------------------------------*/
void Oyun_Durdu_Yazisi_Ciz()
{
char yazi[21] = "***OYUN DURDU [P]***";

// yaziyi ekrana ortala
int y = DUNYA_YUKSEKLIGI/2;
int x = (DUNYA_GENISLIGI-21)/2;
gotoxy(x,y);
printf(yazi);
}

void Yenildi_Yazisi_Ciz()
{
char yazi[34] = "***Oyun Bitti Kaybettiniz :(((***";

// yaziyi ekrana ortala
int y = DUNYA_YUKSEKLIGI/2;
int x = (DUNYA_GENISLIGI-33)/2;
gotoxy(x,y);
printf(yazi);
}

/*----------------------------------------------------------
Rastgele bir koordinat secip oraya dusman bir kare koy
eger dusman geminin uzerinde cikarsa true dondur
----------------------------------------------------------*/
bool Dusman_Uret( DUNYA dunya[][DUNYA_GENISLIGI], PGEMI gemi )
{
int x, y;

randomize();

x = (rand() % DUNYA_GENISLIGI - 2);
y = (rand() % DUNYA_YUKSEKLIGI - 5) + 3;

if( x > gemi->x && x < gemi->x + 4 && y == gemi->y )
return true;

dunya[y][x].hucredurumu = 219;
return false;
}

/*----------------------------------------------------------
Kullaniciya yardimi goster
----------------------------------------------------------*/
void Yardim_Ciz()
{
gotoxy(1,1);
printf("Yon tuslari gemiyi hareket ettirir\n");
printf("CTRL+alt ok ates eder\n");
printf("ALT+Q Cikis\n");
printf("P Oyunu Durdurur\n\n");
printf("Amac: \tekranda beliren noktalara carpmadan\n");
printf("\tpuani artirmaya calismaktir....\n");
printf("\tOrnek bir text ortaminda calisan\n \tdos oyunu olarak ");
printf("programlanmistir, kod\n\tuzerinde degisiklikler yapip\n");
printf("\tfarkli seyler uretebilirsiniz :)))))");
}
/*----------------------------------------------------------
Oyun bilgilerini skoru ciz...
----------------------------------------------------------*/
void Bilgi_Ciz( POYUN oyun)
{
gotoxy(0,24);
printf("Skor : %d, Hak : %d", oyun->skor, oyun->hak );
}

/*----------------------------------------------------------
Ana fonksiyon
----------------------------------------------------------*/
int main(void)
{
_setcursortype( _NOCURSOR );
DUNYA anaplatform[DUNYA_YUKSEKLIGI][DUNYA_GENISLIGI];
GEMI gemi;
OYUN oyun;
MERMI mermi;
unsigned char tus;

// geminin baslangic koordinatlari
gemi.x = (DUNYA_GENISLIGI-5)/2;
gemi.y = DUNYA_YUKSEKLIGI-1;

// yeni oyun baslat
Yeni_Oyun( anaplatform, &oyun );

// ana dongu
// goruldugu gibi oyumuzun icinde hareketliligi saglayabilmek
// icin sonsuz bir loop kullandik ve eger oyunun akisi icerisinde
// herhangi bir anda oyundurumu OYUN_BITTI sekline cevrilirse
// bir if satiri yardimi ile bu looptan cikabiliriz.
while( 1 )
{
// oyun bitti durumundaysa programdan cik
if( oyun.oyundurumu == OYUN_BITTI )
break;

// input al
if( kbhit() )
{
tus = getch();
if( !tus )
tus = getch();
else
{
// p tusuna basildiysa oyunu durdur veya coz
if( tus == 'P' || tus == 'p' )
{
// oyun zaten durmuş, oyunu çalıştır
if( oyun.oyundurumu == OYUN_DURDU )
oyun.oyundurumu = OYUN_CALISIYOR;
else
oyun.oyundurumu = OYUN_DURDU;
}

// eger yardim alinmissa oyunu calisma durumuna dondur
if( tus == 27 ) // escape basildi
if( oyun.oyundurumu == OYUN_YARDIM )
oyun.oyundurumu = OYUN_CALISIYOR;

tus = 0;
}
}

/*
INPUT u degerlendir
*/
switch( tus )
{
case 16: // alt-q
oyun.oyundurumu = OYUN_BITTI;
break;

case 59: // f1
oyun.oyundurumu = OYUN_YARDIM;
break;

// ok tuslarina basilmissa gemiyi hareket ettir
case 77: // sag
if( Gemi_Oynat( &gemi, anaplatform, SAG ) )
{
// gemi hareket etti ve düsmana carpti, oyuncunun hakkını eksilt
oyun.hak--;
if( oyun.hak == 0 )
oyun.oyundurumu = OYUN_YENILDI;
}
break;

case 75: // sol
if( Gemi_Oynat( &gemi, anaplatform, SOL ) )
{
// gemi hareket etti ve düsmana carpti, oyuncunun hakkını eksilt
oyun.hak--;
if( oyun.hak == 0 )
oyun.oyundurumu = OYUN_YENILDI;
}
break;

case 72: // yukari
if( Gemi_Oynat( &gemi, anaplatform, YUKARI ) )
{
// gemi hareket etti ve düsmana carpti, oyuncunun hakkını eksilt
oyun.hak--;
if( oyun.hak == 0 )
oyun.oyundurumu = OYUN_YENILDI;
}
break;

case 80: // asagi
if( Gemi_Oynat( &gemi, anaplatform, ASAGI ) )
{
// gemi hareket etti ve düsmana carpti, oyuncunun hakkını eksilt
oyun.hak--;
if( oyun.hak == 0 )
oyun.oyundurumu = OYUN_YENILDI;
}
break;

case 141: // ctrl+yukari ok
// her seferinde sadece 1 mermi at. Mermi zaten
// hareket halindeyse birşey yapma
if( mermi.mermidurumu == MERMI_ATESEDILMEDI )
{
mermi.x = gemi.x+1;
mermi.y = gemi.y-1;
mermi.mermidurumu = MERMI_ATESEDILDI;
}
break;
}

tus = 0;

/*
Ana durumlar
oyun calisirken bu durumlarin sadece birine girecektir.
*/
switch( oyun.oyundurumu )
{
// oyun calisiyor, yapay zeka karakter hareketleri
// animasyon vb. olaylar bu kısımda calistirilir
case OYUN_CALISIYOR:
{
Bilgi_Ciz( &oyun );
Mermi_Ciz( &mermi, anaplatform, &oyun );
Gemi_Ciz( &gemi, anaplatform);
if( Dusman_Uret( anaplatform, &gemi ) )
{
// gemi hareket etti ve düsmana carpti, oyuncunun hakkını eksilt
oyun.hak--;
if( oyun.hak == 0 )
oyun.oyundurumu = OYUN_YENILDI;
}
Dunya_Ciz( anaplatform );
break;
}

case OYUN_DURDU:
Oyun_Durdu_Yazisi_Ciz();
break;

case OYUN_YARDIM:
Yardim_Ciz();
break;

case OYUN_YENILDI:
Yenildi_Yazisi_Ciz();
break;
}
} // ana döngü sonu

return 0;
}


Kolay Gelsin...





< Bu mesaj bu kişi tarafından değiştirildi irfanmatak -- 17 Haziran 2005, 0:52:09 >
Bu mesaja 1 cevap geldi.
N
20 yıl
Teğmen
Konu Sahibi

Arkadaşlar bunu türkçe açıklaması yokmudur ? Nerden başlamalıyım daha hiçbirşey bilmiyorum grafikerlik hariç :(


Bu mesaja 1 cevap geldi.
İ
20 yıl
Binbaşı

quote:

Orjinalden alıntı: Night_Lord

Arkadaşlar bunu türkçe açıklaması yokmudur ? Nerden başlamalıyım daha hiçbirşey bilmiyorum grafikerlik hariç :(



Verdiğim Kodu incelemeden yazmışsın !



D
20 yıl
Yarbay

quote:

Orjinalden alıntı: Night_Lord

Arkadaşlar iyice kafam karıştı :
Şimdi ben bir kutu çizdim diyelim örnek onun klavyeden yukarı ok tuşuna bastığım zaman ileri gitmesini istiyorum örnek olarak nasıl yaparım ne kullanır nerden başlarım :)

www.oldeye.com

sanırım türkçe destek bulabilceğin tek oyun progamlama forumu. ağırlık delphix isimli directx tabanlı delphi componenti üzerine gerekli tüm bilgileri buradan bulabilirsin


Bu mesaja 1 cevap geldi.
N
20 yıl
Teğmen
Konu Sahibi

M
20 yıl
Yüzbaşı


3ds max ile bir oyunda değişiklik yapabiliyormuyus?

mesela futbol oyunundaki oyuncuların ismini değiştirmek gibi.


Bu mesaja 1 cevap geldi.
İ
20 yıl
Binbaşı

quote:

Orjinalden alıntı: METMETALLICA


3ds max ile bir oyunda değişiklik yapabiliyormuyus?

mesela futbol oyunundaki oyuncuların ismini değiştirmek gibi.



Oyunların sadece görsel arayüzü çizim programları ile hazırlanıyor.(3dmax vs..) çizim programı ile çizdiğin objeyi kod kullanarak hareketlendiriyorsun yada diğer işlemler ile deişkenlerde bilgi saklıyorsun vs. SKOR mesela :)

Kodlama bilmeden oyun yazılamaz. Ama bu işi basitleştiren tool programlar var Game Maker VS. Kurcalayabilirsin.


Bu mesaja 1 cevap geldi.
D
20 yıl
Yarbay

yada
blender



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.