Tarih: Tue Sep 06, 2005 12:12 am Mesaj konusu: Grafiği döndürünce oluşan sorunum
iki boyutlu bir araba yarışı oyunu yapmak istiyorum. bir arabnın 5 er dereceden 360 derecelik pozisyonalrını çizmek sitiyorum. Fakat sorun şu. DElphix ile sadece tek renk trasnparent belirleye biliyorum.ve eğer çizili arabayı biraz döndürünce grafik programı resmin kenarlarını kırıyor ve burada yarı saydam tonlar oluşturuyor işte bu kısımlar programa yerleştirilince tam transparan belirlenen rengin tonunda olmadığı için beyaz bir çizgi gibi kalıyor. Görüntünün aynısını çevirebilen yada buna alternetif bir çözüm yolu var mıdır? Yardımlarınızı belkiyorum. Şimdiden teşekkürler.
Kayıt: Mar 13, 2003 Mesajlar: 188 Nereden: İstanbul
Tarih: Tue Sep 06, 2005 7:58 am Mesaj konusu:
delphix'te bir surface'i döndürerek basman için DrawWave fonksiyonunu kullanmalısın. Grafik programı ile editlemeye gerek yok.
ayrıca birden fazla rengi transparan olarak belirleyebilmek için bir COLOR_KEY tanımlaman gerekir. ancak COLOR_KEY Delphix paketinin içinde var olan bir type değil. Tanımladığın Surface'lere doğrudan erişim gerekiyor.
Cevap için teşekkürler ama bundan sonra aklıma takılan bir şey daha var. Ben sprite kullanıyorum. yani kendim surface ler oluşturmadım. bu durumda bu spriteleri nasıl dçönmdüreceğim. bunlar surface oalrak mı tanımlanıyor. konuya tam hakim olmadığım için saçma sorualrda soruyor olabilirim ama açıklarsanız memlun olurum.
Kayıt: Mar 13, 2003 Mesajlar: 188 Nereden: İstanbul
Tarih: Tue Sep 06, 2005 12:48 pm Mesaj konusu:
kullandığım makinede şu an delphix yüklü değil o yüzden bakamıyorum ama şöyle söyleyeyim, DrawWave fonksiyonu Surface yapısına ait olduğu için, eğer TSprite Class'ının Surface property'si varsa (ki eminim olması lazım) fonksiyonu oradan çağırabilirsin.
yani;
Kod:
Sprite[1].Surface.DrawWave(....);
gibi, ancak şu an test edemediğim için doğru mu yanlış mı bilmiyorum.
sprite.Engine.Surface.DrawWave() olarak yazabiliyorum. Burada incelerken DrawRotate diye başka bir fonksiyona rastladım. Faka t sorunum bunlara gerekli parametreleri nasıl vereceğim.
Bu yukarıdaki ??? oaln kısma Source: TDirectDrawSurface e bağlı olarak tanımlama yapmamı istiyor fakat ben burada benden tam olarak ne istediğini bilmiyorum
buraya spritenin surface sini tanıtıncada çalışmadı. ne yapacağım bilmiyorum?
Kayıt: Mar 13, 2003 Mesajlar: 188 Nereden: İstanbul
Tarih: Tue Sep 06, 2005 1:11 pm Mesaj konusu:
hmm tabi şimdi bende jeton düştü, dediğim gibi önünde ortam olmayınca çok zor oluyor. ancak senin örnek kodunu görünce olayı anladım. bi kere dediğin gibi Wave'i değil Rotate'i kullanman lazım, benim hatam üzgünüm.
Ayrıca Sprite.Engine.Surface biçiminde yaparsan Sprite'a çizmeye çalışıyorsun gibi olur(bu da ikinci hatam).
Ne kadar denesemde başarılı olamadım bu nedenle programın tüm kodlarını göndermeye karar verdim. Uygulamaya çallıştığım alan timer alanı.
Kod:
type
TCarSprite = class(TImageSprite)
protected
Select:Boolean;
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
end;
procedure TCarSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
// buraya istediğiniz komutları yerleştirin
//burası objelerin birbiriyle temasıyla gerçekleştirir
end;
procedure TCarSprite.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
//buraya hareket için gereli komutları yerleştirin
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with TBackgroundSprite.Create(DXSpriteEngine1.Engine) do
begin
SetMapSize(1,1);
X:=0;
Y:=0;
Image := DxImageList1.Items.Find('yol');
Z := 0;
Tile:=True;
end;
with TCarSprite.Create(DXSpriteEngine1.Engine) do
begin
X:=0;
Y:=0;
Image := DxImageList1.Items.Find('araba');
Z := 1;
Width := Image.Width;
Height := Image.Height;
end;
art:=0;
end;
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var a:TCarSprite;
begin
DxSpriteEngine1.Dead;
DxSpriteEngine1.Draw;
form1.Caption:='Hız: '+inttostr(art*10);
DxSpriteEngine1.Engine.Items[0].Y:=DxSpriteEngine1.Engine.Items[0].Y+art;
DxSpriteEngine1.Engine.Items[1].X:=DxSpriteEngine1.Engine.Items[1].X+yon;
a:=TCarSprite(DxSpriteEngine1.Engine.Items[1]);
dxdraw1.Surface.DrawRotate(0,0,100,100,rect(0,0,100,100),a.Engine.Surface,2,2,true,20);
Dxinput1.Update;
DxDraw1.Flip;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
a:TCarSprite;
begin
with Form1.Dxinput1 do
begin
if IsUp in states then
Begin
if art<20 then art:=art+1;
End;
if IsDown in states then
Begin
art:=art-3;
if art<0 then art:=0;
End;
if IsLeft in states then
Begin
a:=TCarSprite(Form1.DXSpriteEngine1.Engine.Items[1]);
a.Image:=DxImageList1.Items.Find('arabasol');
yon:=-1;
End;
if IsRight in states then
Begin
a:=TCarSprite(Form1.DXSpriteEngine1.Engine.Items[1]);
a.Image:=DxImageList1.Items.Find('arabasag');
yon:=+1;
End;
end;
end;
Son olarak kodu aşağıdaki hale ggetirdim yine işe yaramadı. Dediğin gibi dökümanlardan dediğin dosyayı indireceğim. Ayrıca yardımların için saol. Başka bir çözüm varsa aklında forumu takip ediyor olacağım teşekkürler.
Kod:
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var a:TCarSprite;
begin
ile ekrana döndürerek çizdire biliyorum. fakat bunu dxspriteengine ile ansıl yapabilirim bilmiyorum. aslında dxspriteengine kullanmamın tek nedeni hepsini aynı anda kontrol eebiliyor olmama falan. yoksa bunu başka çareleri var mıdır ve varsa nelerdir? paylaşırsanız sevinrim.
Eğer yukarıdaki kod gibi döndüremme gerekn bir sürü araba olduğunu düşünürsek bu durumda her araba için bu kodu kullanmam gerekiyor ve çok ararışık belkide içinden çıkılmaz bir yöndetem olur. detaylı bir bilgi verirseniz sevinirim.
Teşekkrüler.[/list]
Bu forumda yeni konular açamazsınız Bu forumdaki mesajlara cevap veremezsiniz Bu forumdaki mesajlarınızı değiştiremezsiniz Bu forumdaki mesajlarınızı silemezsiniz Bu forumdaki anketlerde oy kullanamazsınız