mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-23 17:41:41 +00:00
371 lines
11 KiB
Markdown
371 lines
11 KiB
Markdown
---
|
||
contributors:
|
||
- ["Wichamir", "https://github.com/Wichamir/"]
|
||
- ["zacryol", "https://github.com/zacryol"]
|
||
filename: learngdscript.gd
|
||
translators:
|
||
- ["R1cHero", "https://github.com/R1cHero"]
|
||
---
|
||
|
||
GDScript, özgür ve açık kaynaklı oyun motoru olan Godot için dinamik ve statik olarak
|
||
yazılmış bir kodlama dilidir. Yazılış şekli Python'a biraz benzerdir.
|
||
Başlıca avantajları kullanım kolaylığı ve motorla olan uyumudur.
|
||
Oyun geliştirme için mükemmel bir uyum sağlar.
|
||
|
||
## Temeller
|
||
|
||
```gdscript
|
||
# Tek satırlık yorumlar, '#' simgesi kullanılarak yazılır.
|
||
"""
|
||
Çok
|
||
satırlı
|
||
yorumlar
|
||
üç
|
||
tırnak
|
||
kullanılarak
|
||
yazılır
|
||
"""
|
||
|
||
# Belge yorumları (Doc Comments) sınıflara ve alanlara açıklama ekleyebilir.
|
||
# bunlar, motor içi dokümanlarda görüntülenebilir.
|
||
|
||
## Bu sınıf, GDScript'in bir gösterimidir
|
||
|
||
# Komut dosyası kendi başına bir sınıftır ve isteğe bağlı olarak bunun için bir ad tanımlayabilirsiniz.
|
||
class_name MyClass
|
||
|
||
# Kalıtım (Inheritance) komut dosyasının bağlı olduğu Node'a göre 'Node2D' kısmı değişkenlik gösterir.
|
||
extends Node2D
|
||
|
||
# Değişken türleri
|
||
var x = 8 # int
|
||
var y = 1.2 # float
|
||
var b = true # bool
|
||
var s = "Merhaba Dünya!" # String
|
||
var a = [1, false, "turuncu kedi"] # Array - Python'daki listeye benzer,
|
||
# aynı anda farklı tipte
|
||
# değişkenleri tutabilir.
|
||
var d = {
|
||
"key" : "value",
|
||
42 : true
|
||
} # Sözlük anahtar-değer (key-value) çiftlerini tutar.
|
||
var p_arr = PackedStringArray(["Hey", "selamlar", "!"]) # Paketlenmiş diziler yalnızca
|
||
# belirli bir türü tutabilir.
|
||
|
||
# Doküman yorumları, özelliklere uygulanabilir.
|
||
|
||
## Bu değişken nesnenin kaç kez zıpladığını tutar.
|
||
var jump_count = 0
|
||
|
||
# Motorda bulunan yerleşik vektör türleri:
|
||
var v2 = Vector2(1, 2)
|
||
var v3 = Vector3(1, 2, 3)
|
||
|
||
# Sabitler (Constants)
|
||
const ANSWER_TO_EVERYTHING = 42
|
||
const BREAKFAST = "Sucuklu yumurta!"
|
||
|
||
# Enumlar
|
||
enum { ZERO, ONE , TWO, THREE }
|
||
enum NamedEnum { ONE = 1, TWO, THREE }
|
||
|
||
# Dışa aktarılan değişkenler 'inspector' de görünür.
|
||
#
|
||
# Editörün hangi seçenekleri vereceğini bilmesi için bir tür ipucu (daha sonra açıklanacaktır)
|
||
# veya varsayılan bir değere ihtiyaç vardır.
|
||
@export var age: int
|
||
@export var height: float
|
||
@export var person_name = "Ahmet"
|
||
# Ama ikisi de kabul edilebilir.
|
||
@export var favorite_color: String = "Kırmızı"
|
||
@export var favorite_food := "Lahmacun"
|
||
|
||
# Fonksiyonlar
|
||
func foo():
|
||
pass # pass anahtar sözcüğü gelecekteki yazılacak olan kod için bir yer tutucudur.
|
||
# Editörde hata olarak göstermesini engellemek için de kullanılır.
|
||
|
||
func add(first, second):
|
||
return first + second
|
||
|
||
# Fonksiyonlar üzerinde doküman yorumları yazma
|
||
|
||
## Zıplama Sayısını Artırma
|
||
func jump():
|
||
jump_count += 1
|
||
|
||
# Değerleri yazdırma
|
||
func printing():
|
||
print("GDScript ", "mükemmel.")
|
||
prints("Bu", "kelimeler", "boşluklarla", "ayrıldı.")
|
||
printt("Bu", "kelimeler", "tablarla", "ayrıldı.")
|
||
printraw("Bu sistem konsoluna yazdırılır.")
|
||
printerr("Bu konsolda hata olarak gösterilir.")
|
||
|
||
# İsimsiz fonksiyonlar (Lambdas)
|
||
var my_lambda = func(): print("lambda'dan merhaba!")
|
||
|
||
my_lambda.call()
|
||
|
||
# Matematik
|
||
func doing_math():
|
||
var first = 8
|
||
var second = 4
|
||
print(first + second) # 12
|
||
print(first - second) # 4
|
||
print(first * second) # 32
|
||
print(first / second) # 2
|
||
print(first % second) # 0
|
||
# Ayrıca bunlar var +=, -=, *=, /=, %= vb.,
|
||
# ++ veya -- operatörleri yok.
|
||
print(pow(first, 2)) # 64
|
||
print(sqrt(second)) # 2
|
||
printt(PI, TAU, INF, NAN) # Yerleşik (built-in) sabitler (constants)
|
||
|
||
# Kontrol akışı
|
||
func control_flow():
|
||
x = 8
|
||
y = 2 # y orjinalde float'dı,
|
||
# ancak "dynamic typing" gücünü kullanarak
|
||
# tipini int'e değiştirebiliriz!
|
||
|
||
if x < y:
|
||
print("x, y'den küçüktür.")
|
||
elif x > y:
|
||
print("x, y'den büyüktür.")
|
||
else:
|
||
print("x ve y eşittir.")
|
||
|
||
var a = true
|
||
var b = false
|
||
var c = false
|
||
if a and b or not c: # alternatif olarak bunları kullanabilirsiniz: &&, || ve !
|
||
print("Değer: true")
|
||
|
||
for i in range(20): # GDScript'de "range" Python'dakine benzerdir.
|
||
print(i) # bu 0'dan 19'a kadar sayıları yazdıracaktır.
|
||
|
||
for i in 20: # Python'dan farklı olarak, doğrudan bir int üzerinde "range" kullanmadan döngüye girebilirsiniz.
|
||
print(i) # bu da 0'dan 19'a kadar olan sayıları da yazdıracaktır.
|
||
|
||
for i in ["two", 3, 1.0]: # Bir dizi üzerinde yineleme (iterasyon) yapma.
|
||
print(i)
|
||
|
||
while x > y:
|
||
printt(x, y)
|
||
y += 1
|
||
|
||
x = 2
|
||
y = 10
|
||
while x < y:
|
||
x += 1
|
||
if x == 6:
|
||
continue # 6, "continue" ifadesi nedeniyle yazdırılmayacak.
|
||
prints("x eşittir:", x)
|
||
if x == 7:
|
||
break # döngü 7'de duracak, bu yüzden 8, 9 ve 10 yazdırılmayacak.
|
||
|
||
match x:
|
||
1:
|
||
print("Match, switch'e benzerdir.")
|
||
2:
|
||
print("Ancak her değerden önce "case" koymanıza gerek yok.")
|
||
3:
|
||
print("Ayrıca her "case" varsayılan olarak durdurulur.")
|
||
break # HATA! "Break" ifadesi gereksiz!
|
||
4:
|
||
print("Eğer "fallthrough" kullanmaya ihtiyacınız varsa "continue" kullanın.")
|
||
continue
|
||
_:
|
||
print("Alt çizgi varsayılan bir "case"dir.")
|
||
|
||
# Üç terimli operatör (tek satırda yazılabilen if-else)
|
||
prints("x", "pozitif" if x >= 0 else "negatif")
|
||
|
||
# Bir veri tipini başka bir veri tipine dönüştürme (Casting)
|
||
func casting_examples():
|
||
var i = 42
|
||
var f = float(42) # Değişkenlerin kurucusunu (constructor) kullanarak
|
||
var b = i as bool # veya "as" anahtar kelimesini kullanarak tür dönüştürme (casting)
|
||
|
||
# Override fonksiyonlar
|
||
# Built-in kurallı "overridable functions" bir alt çizgi ile başlar
|
||
# ama pratikte hemen hemen her fonksiyonu geçersiz kılabilirsiniz.
|
||
|
||
# _init nesne başlatıldığında çağrılır.
|
||
# Bu, nesnenin kurucusudur (constructor).
|
||
func _init():
|
||
# Burada nesnenin iç öğelerini başlatın.
|
||
pass
|
||
|
||
# _ready, komut dosyasında
|
||
# node ve children node sahneye girdiğinde çağrılır.
|
||
func _ready():
|
||
pass
|
||
|
||
# _process her karede çağrılır.
|
||
func _process(delta):
|
||
# Bu fonksiyona iletilen delta argümanı,
|
||
# son kare ile anlık kare arasında geçen saniye sayısıdır.
|
||
print("Delta zamanı: ", delta)
|
||
|
||
# _physics_process her fizik karesinde çağrılır.
|
||
# Deltanın sabit olması gerektiği anlamına gelir.
|
||
func _physics_process(delta):
|
||
# Vektör toplama ve çarpma kullanarak hareket ettirme.
|
||
var direction = Vector2(1, 0) # ya da Vector2.RIGHT
|
||
var speed = 100.0
|
||
self.global_position += direction * speed * delta
|
||
# self geçerli sınıf örneğini belirtir.
|
||
|
||
# Geçersiz kılma sırasında, buradaki gibi nokta operatörünü kullanarak
|
||
# parent işlevini çağırabilirsiniz:
|
||
func get_children():
|
||
# Bazı ek şeyler ekleyebilirsiniz.
|
||
var r = super() # Parent implementasyonunu çağırma
|
||
return r
|
||
|
||
# Dahili sınıflar (Inner class)
|
||
class InnerClass:
|
||
extends Object
|
||
|
||
func hello():
|
||
print("Dahili sınıftan merhabalar!")
|
||
|
||
func use_inner_class():
|
||
var ic = InnerClass.new()
|
||
ic.hello()
|
||
ic.free() # Ramde yer açmak için "free" kullanın.
|
||
```
|
||
|
||
## Sahne ağacındaki (Scene Tree) diğer node'lara erişim
|
||
|
||
```gdscript
|
||
extends Node2D
|
||
|
||
var sprite # Bu değişken referansı tutacak.
|
||
|
||
# _ready'de diğer node'lara referanslar alabilirsiniz.
|
||
func _ready() -> void:
|
||
# "NodePath" node'lara erişmek için kullanışlıdır.
|
||
var path1 = NodePath("path/to/something")
|
||
# Ya da böyle kullanabilirsiniz:
|
||
var path2 = ^"path/to/something"
|
||
# NodePath örnekleri:
|
||
var path3 = ^"Sprite" # geçerli node'un child node'u
|
||
var path4 = ^"Timers/Firerate" # child node'un child node'u
|
||
var path5 = ^".." # geçerli node'un parent node'u
|
||
var path6 = ^"../Enemy" # geçerli node'un kardeşi
|
||
var path7 = ^"/root" # ana yol, get_tree().get_root() ile eşdeğerdir.
|
||
var path8 = ^"/root/Main/Player/Sprite" # Player'ın Sprite'ına giden ana yol
|
||
var path9 = ^"Timers/Firerate:wait_time" # özelliklere erişme
|
||
var path10 = ^"Player:position:x" # alt özelliklere erişim
|
||
|
||
# Son olarak, referans almak için bunlardan birini kullanabilirsiniz:
|
||
sprite = get_node(^"Sprite") as Sprite # her zaman belirttiğiniz türü yazın
|
||
sprite = get_node("Sprite") as Sprite # burada String
|
||
# NodePath'e dönüştürülür
|
||
sprite = get_node(path3) as Sprite
|
||
sprite = get_node_or_null("Sprite") as Sprite
|
||
sprite = $Sprite as Sprite
|
||
|
||
func _process(delta):
|
||
# Artık referansı başka yerlerde tekrar kullanabiliriz.
|
||
prints("Sprite has global_position of", sprite.global_position)
|
||
|
||
# _ready çalıştırılmadan hemen önce
|
||
# bir değişkene değer atamak için @onready kullanın.
|
||
@onready var other_sprite = $Sprite as Sprite
|
||
|
||
# NodePath'i dışa aktarabilir, böylece onu "inspector" içinde atama yapabilirsiniz.
|
||
@export var nodepath = ^""
|
||
@onready var reference = get_node(nodepath) as Node
|
||
|
||
# Veya Node'u doğrudan dışa aktarın
|
||
@export var other_reference: Node
|
||
```
|
||
|
||
## Sinyaller (Signals)
|
||
|
||
Sinyal sistemi Godot'nun gözlemci programlama modelinin uygulamasıdır.
|
||
İşte bir örnek:
|
||
|
||
```gdscript
|
||
class_name Player extends Node2D
|
||
|
||
var hp = 10
|
||
|
||
# Belge yorumları sinyallere de yansıyabilir
|
||
|
||
## Oyuncu öldüğünde sinyal gönderir (emit).
|
||
signal died() # sinyali tanımlama
|
||
signal hurt(hp_old, hp_new) # sinyallere değişken tanımlanabilir.
|
||
|
||
func apply_damage(dmg):
|
||
var hp_old = hp
|
||
hp -= dmg
|
||
hurt.emit(hp_old, hp) # sinyal gönderme ve değişkenleri iletme
|
||
if hp <= 0:
|
||
died.emit()
|
||
|
||
func _ready():
|
||
# "died" sinyali kendi içinde tanımlanan "_on_death" fonksiyonuna bağlama
|
||
died.connect(_on_death)
|
||
# Hedef nesne kendisi değilse
|
||
# alternatif bir yol gerekir.
|
||
# died.connect(Callable(self, &"_on_death"))
|
||
|
||
func _on_death():
|
||
queue_free() # oyuncu öldüğünde sahneden siler
|
||
```
|
||
|
||
## Faydalı İpuçları
|
||
|
||
GDScript'te hem kod netliği hem de performans avantajları için
|
||
opsiyonel olarak "static typing" kullanılabilir.
|
||
|
||
```gdscript
|
||
extends Node
|
||
|
||
var x: int # değişkenin türünü belirtme
|
||
var y: float = 4.2
|
||
var z := 1.0 # ":=" operatörünü kullanmak üstteki tanımlama ile aynıdır.
|
||
|
||
var a: Array[int] = [1, 2, 3] # Dizinin tür içeriğini belirtme
|
||
|
||
enum NamedEnum { ONE = 1, TWO, THREE }
|
||
var n: NamedEnum = NamedEnum.ONE # Enum da bir tür olarak kullanılabilir.
|
||
|
||
@onready var node_ref_typed := $Child as Node
|
||
|
||
@export var speed := 50.0
|
||
|
||
const CONSTANT := "Bu bir sabit atamadır (constant)."
|
||
|
||
signal example(arg: int)
|
||
|
||
func _ready() -> void:
|
||
# fonksiyon hiçbir şey döndürmez
|
||
x = "string" # HATA! Tür değiştirilemez!
|
||
a.append("q") # HATA! Array[int] string tutamaz!
|
||
return
|
||
|
||
func join(arg1: String, arg2: String) -> String:
|
||
# Fonksiyon iki tane string alır ve bir tane string döndürür.
|
||
return arg1 + arg2
|
||
|
||
func get_child_at(index: int) -> Node:
|
||
# Fonksiyon int alır ve node döndürür.
|
||
return get_children()[index]
|
||
```
|
||
|
||
## Daha fazla bilgi almak için
|
||
|
||
* [Godot's Website](https://godotengine.org/)
|
||
* [Godot Docs](https://docs.godotengine.org/en/stable/)
|
||
* [Getting started with GDScript](https://docs.godotengine.org/en/stable/getting_started/scripting/gdscript/index.html)
|
||
* [NodePath](https://docs.godotengine.org/en/stable/classes/class_nodepath.html)
|
||
* [Signals](https://docs.godotengine.org/en/stable/getting_started/step_by_step/signals.html)
|
||
* [GDQuest](https://www.gdquest.com/)
|
||
* [GDScript.com](https://gdscript.com/)
|