Giriş
(10)

Oyun İçin Zamanlayıcı

Eork-hai
Merhaba arkadaşlar,okul projesi için browserla oynanan ogame tarzı bir oyun yapıyorum. ogame oynayanlar bilirler bir upgrade'e tıkladığında, o upgrade'in tamamlanması için gereken süre geri saymaya başlıyor. Bu geri sayma olayı kullanıcıdan bağımsız olacağı için, kullanıcı ne zaman online olsa kalan
Merhaba arkadaşlar,
okul projesi için browserla oynanan ogame tarzı bir oyun yapıyorum. ogame oynayanlar bilirler bir upgrade'e tıkladığında, o upgrade'in tamamlanması için gereken süre geri saymaya başlıyor. Bu geri sayma olayı kullanıcıdan bağımsız olacağı için, kullanıcı ne zaman online olsa kalan zamanı geri sayarken görmeli. Bu süre kullanıcı offline'ken bitse veri tabanında değişiklik gerçekleşmeli . Veri tabanında (SQL EXPRESS 2005) bir sp ile her saniye zamanı azaltmayı denedim ama böyle tablo kitleniyor. projede asp.net c# kullanıyorum. yardımcı olabilecek birileri var mıdır acaba?
0
Eork-hai
(29.03.08)
Sanıldığı gibi ogame'in her saniye durup da herkesin upgrade'lerinin sayacıyla uğraştığını sanmıyorum.

Bence şöyle oluyor ve olmalıdır:

1- Kullanıcı upgrade'e bastığında javascript ile bir sayaç başlatılıyor, oradaki saat real-time olarak değişiyor böylece ve tuşat ıklandığı andaki saat database'e geçiriliyor.
2- Kullanıcı kapatıyor browserını, sevgilisiyle buluşuyor, evine dönüyor vs.
3- Upgrade'ler sayfasını açıyor. Sayfa açılırken ilgili upgrade'in yapılmaya başlandığı saat database'den okunuluyor ve javascript'e veriliyor. Javascript de o saatten itibaren tekrar timerı başlatıyor. Böylece o etki yaratılmış oluyor.
0
fredi
(29.03.08)
sadece fredinin dedigi gibi olmaz o is. o mantikla islemi yapan kisi hic acmazsa o islem hic bitmemis gibi olur. ornegin saldiri emri verildiginde geri sayiyor ve bittiginde islem gerceklesiyor.

tclde cok basit bir mantikla oluyordu bu, timer veriliyordu timer bittiginde islem gerceklesiyordu (burada degisken degistirme oluyor) ve baska bir timer varsa o da aynen devam ediyordu vs vs.
0
entrapmen
(29.03.08)
her saniye çalışan sp ok ama data update etmiyor olman lazım her saniye. orda mantık şudur, işin bitmesi gereken tarih/saat bellidir, sistemin tarih/saati ile bu tarih/saati karşılaştırırsın o zamana henüz ulaşılmamış ise bir şey yapmazsın, ulaşılmışsa (şimdiki zaman>=işin bitmesi gereken zaman) artık ne yapacaksan o zaman yaparsın.

sql express'de sql agent olduğunu sanmıyorum dolayısıyla her saniye çalışacak sp'yi verimli bir şekilde sql express içinden yapman pek mümkün gözükmüyor. sql express'e bağlanıp yazdığın sp'yi çağıran bir windows service yazarsan işini görür.

işin client side kısmında da denildiği gibi yapman gereken şu: kullanıcı zamanlayının olduğu ekranı her açtığında database'den kalan zamanı hesaplayan bir sp çağırırsın sonra o zamanı javascript'teki yazdığın saniyede bir kendini çağıran koda verip geriye saymasını sağlarsın.

db'de de bu işi saniyede bir yapmak abartı kaçabilir. 3-5 saniye de yeterli olabilir senin için. kullanıcının ne kadar interaktif olabileceğine bakar burada yapacağın zamanlama.

daha performanslı olsun daha ileri gideyim dersen database'i saniyede bir çağırmak yerine yazdığın windows servisi içinde bu işi ayrı bir thread içinde yapıp oradan ön yüzü besleyebilirsin.
0
iron
(29.03.08)
evet 3-5 saniyede bir sp çağırmak yükümü azaltacaktır, ama windows service dediğin nasıl oluyor hiç yazmadım öyle birşey ve zamanlayıcı olayını nasıl ayarlayacağım onda, hem bunun gibi bir sp en az 6-7 tabloda çalışması gerekecek, ilgili kaynak veya web sitesi varsa gönderebilir misin acaba. Analatabilirsen de iyi olur ben dinlerim..
0
🌸Eork-hai
(29.03.08)
Gerçekten sürekli çalışan bir process olmadan da yapılabileceğini düşünüyorum.

Bir upgrade'in bir kullanıcı tarafından yapılıp yapılmadığını her gerektiğinde hesaplayarak yapabilirsin.

Yani bir kullanıcının bir ugprade i yapıp yapmadığını şöyle bulursun değil mi?
if (su_anki_zaman - upgrade_e_baslanildigindaki_zaman >= upgrade_icin_gecmesi_gereken_zaman)
{
//bu adam bu upgrade i yapmis haci
}

Bunu sadece gerektiği zaman çalıştıracağından normal bir PHP/ASP/PERL/whatever scriptinden farksız olacaktır.
0
fredi
(29.03.08)
yalnız gerektiğinde hesaplarız da her dakika bu elemanın maden miktarı artmalı mesela, demek istediğin veri tabanında en son güncelleme tarihi gibi bişey tutup her şeyi eleman online olduğunda bu tarihe göre hesaplamaksa bu ilerde başıma baya sorun yaratmaz mı? çok fazla şeyi hesaplamak zorunda kalırım..
0
🌸Eork-hai
(29.03.08)
Valla şöyle bir yöntem olabilir, madenler saat başı veriliyordur herkese dersek;

mevcut_maden_miktarı = ((o_anki_saat * maden_katsayisi) + (maden_uretilmis_gun_sayisi * 24)) - (mevcut_binalarin_yapimi_icin_gerekmis_maden + mevcut_upgradelerin_yapimi_icin_gerekmis_maden + vs)

gibi bir formül bulunabilir sanırım.

Kusura bakmayın çok abarttım sanırım. :)

Ayrıca bu ve bir önceki mesaj hakkında: (bkz: sarhoşken girilen entryler)
0
fredi
(30.03.08)
neyse bu konuştuklarımızı bir deneyeyim bakalım ne olur.
0
🌸Eork-hai
(30.03.08)
google'da "windows service timer .net" diye aratırsan örnek kodlar ve nasıl yapılacağı ile ilgili bilgi bulabilirsin.
misal
www.aspfree.com
www.codeguru.com

servisin mantığı şu olacak.
Her x saniyede bir çalışmak üzere bir timer setup edecek başlatıldığında.
Bu timer her tick olduğunda servis içinde tanımlamış olduğun kod şunları yapacak.
1. Bitmiş işlerin listesini çeken sp'yi çağıracak. bitiş zamanı>=şu anki zaman.
2. Bu işlerle ilgili yapılması gereken update'leri yapacak yine yazmış olduğun sp'leri çağırarak.

Maden artışı ile ilgili Fredi'nin dedikleri kısmen doğru,
performansı sağlayabilmek için hiç update yapmadan geçen zamanı kullanarak ve oyun ile ilgili diğer parametrelere de bakarak oyuncunun mevcut maden miktarlarını hesaplaman en doğrusu ama bunun yanında oyuncunun yaptığı harcamaları, ek kazançları (savaş ganimeti vesaire) tutabileceğin detay tablolarını da işin içine katıyor olman gerekir. belki de günde bir defa veya belirlediğin X saatlik periyotlarda bunları da bir toplamda tutup artık o detaylara bakmıyor olman gerekebilir. hesap ekstresi gibi düşün, banka ay boyunca kredi kartı harcamalarını detaylı olarak değerlendirirken ay sonunda sana toplam ödemen gereken tutarı çıkarıyor böylece ilerleyen aylarda yine sadece bir aylık veri ile uğraşmış oluyor.

işi daha karmaşıklaştırırsak mesela şu olabilir,

demir madenin var ve demir madenin normalde 1 sn.'de 100 birim demir üretiyor. kademesi yükseldikçe de belli bir kritere göre üretim artıyor (misal ogame'de bu sanırım logaritmikti, kademe'nin başlarda artması çok etkiliyken ilerleyen kademe artışları daha az etkili oluyordu)

misal oyuncu şöyle bir aksiyon dizisi izledi (dışarıdan bir etki olmadığını varsayıyorum)
Zaman : Olay : Hesaplamada kullanacağın formül
T1 : Demir madeni çalışmaya başladı : Stoktaki demir + geçen zaman * birim zamanda 1. kademede üretilebilen demir miktarı
T2 : Demir madeni 2. kademeye yükseltildi. : Stoktaki demir + geçen zaman * birim zamanda 2. kademede üretilebilen demir miktarı (Stoktaki demir'i ve hesaplama zamanını başta update etmen gerekiyor)
T3 : Gemilerinden biri stoğuna demir getirdi : Stoktaki demir + son upgrade'den beri geçen zaman * birim zamanda 2. kademede üretilebilen demir miktarı (Geminin dönüşünde stoktaki demir'i update etmen gerekiyor)

Şimdi üstte bahsettiğimiz servisin filo dönüşlerini, gönderilişlerini, upgrade'leri hallettiğini düşünelim, senin ön yüzde üstte yaptığımız hesaplamaları yapabiliyor olman lazım. Ki yapabilirsin de, 5-6 tablo da olsa kullanıcı bir aksiyon almadıkça veya zamansal bir süreç dolmadıkça database'de bir update yapmıyorsun. Oyunda çok sık yapılan ve hammaddelerin toplamlarını değiştiren aksiyonları da optimize etmek için üstte söylediğim ekstre mantığını kullanabilirsin. Sonuçta okul projesi olduğuna göre bunu bir optimizasyon olarak düşünüp yapmayabilirsin.

Ben üstte her seferinde formülü değiştirdim ama senin bunu tek bir formül olarak yazman daha mantıklı olacaktır. Oyuncunun demir madeni hangi kademede olursa olsun misal GetCurrentIron(Datetime lastUpgrade, double ironInStock) şeklinde bir metodun bunu hesaplayabiliyor olması gerekir.

Ekstre mantığında hareket edersen metodun tanımı şuna benzer olacak GetCurrentIron(Datetime lastUpgrade, double ironInStock, List ironTransactions)
burda ironTransactions içinde - ve + olarak senin database'de toplama yansıtmadığın yani henüz update etmediğin sadece bir detay tabloya insert ettiğin kayıtlar bulunacak.

Okul projesinin ötesinde bunu ileri götürürüm ben falan diyorsan unutma sistemin çok kullanıcıyı handle edebilmesi için database'de mümkün olduğu kadar az update yapman ve mümkün olduğunca yaptırabildiğin kadar kısmını (oyunun güvenliğini de düşünerek) önyüze devretmen gerekir.
0
iron
(02.04.08)
anladım, teşekkürler cevaplarınız için..
0
🌸Eork-hai
(08.04.08)
(3)

eski bir dedektif film

Eork-hai
şimdi efendim bir eve topluyolar 5-10 tane dedektifi, evde garip olaylar oluyor bunlar da neler olduğunu bulmaya çalışıyolar, en sonunda herkes sırayla bu işlerin arkasındaki kişiyi tahmin ediyor, adam her seferinde bildin diyor maskesini çıkarıyor tahmin edilen kişi çıkıyor.. cnbc-e'de de göstermiş
şimdi efendim bir eve topluyolar 5-10 tane dedektifi, evde garip olaylar oluyor bunlar da neler olduğunu bulmaya çalışıyolar, en sonunda herkes sırayla bu işlerin arkasındaki kişiyi tahmin ediyor, adam her seferinde bildin diyor maskesini çıkarıyor tahmin edilen kişi çıkıyor.. cnbc-e'de de göstermişti.. nedir acaba bu filmin adı?
0
Eork-hai
(29.12.07)
o filmi yarım yamalak hatırlıyorum:
peter sellers de clouseau rolündeydi sanki. ama hım imdb ye filan baktım bulamadım, yanılıyor da olabilirim.
0
nicin ben
(29.12.07)
Murder by Death (1976)

www.imdb.com
0
const ant
(29.12.07)
doğru film, teşekkürler..
0
🌸Eork-hai
(30.12.07)
(1)

eski bir zeka oyunu

Eork-hai
şöyle birşeydi hatırladığım kadarıyla;oyun tek bir pencerede oynanıyor, sihirbazlarla oynuyorsunuz, bu sihirbazların tek sihirleri var o da yürüdüğü platformda tek karelik boşluk açabilmek, sizi takip eden iskeletleri bu sihirle alt kata düşürebiliyorsunuz, yuvarlak kayalar var, bitişe ulaşmak için
şöyle birşeydi hatırladığım kadarıyla;
oyun tek bir pencerede oynanıyor, sihirbazlarla oynuyorsunuz, bu sihirbazların tek sihirleri var o da yürüdüğü platformda tek karelik boşluk açabilmek, sizi takip eden iskeletleri bu sihirle alt kata düşürebiliyorsunuz, yuvarlak kayalar var, bitişe ulaşmak için yuvarlanan kayaları kullanmanız gerek, bu kayalarla bir yerleri doldurarak onlardan yol yapıyorsunuz, bazı bölümlerde buz büyüsü gibi birşey de vardı, buzu havada kendine yol yapmak için kullanabiliyordun..
var mı oyunu hatırlayabilen acaba, benim aklımda "lury land" gibi bişey kalmış fakat aradım öyle birşeye rastlayamadım..
0
Eork-hai
(16.12.07)
dediğin oyun değil ama benzer bi oyun var benim hatırladığım lemmings.
0
raven pixie
(17.12.07)
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler basond, compumaster, fraise, kibritsuyu, rakicandir
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır.