3D Spieleprogrammierung
Commentaren
Transcriptie
3D Spieleprogrammierung
3D Spieleprogrammierung Beispiel Szenengraph ©2008 by Martin Faust Bewegungen Was ist falsch am folgenden Modell für einen Ball? // Update ball (ball.pos).x += ball.bx; (ball.pos).y += ball.by; Gerechnet wird in Pixel Unabhängig von der Zeit ©2008 by Martin Faust Bewegliche Elemente Ein bewegliches Element wird beschrieben durch die Variablen Vector3 pos Vector3 dir float speed Update geschieht durch pos += dt * dir * speed; Abhängig von der Zeit und der Geschwindigkeit aber dennoch problematisch! ©2008 by Martin Faust Bewegungen im Spiel Folgender Code ist falsch dt = 0.1f; while (not done) { pos += dt * dir * speed; DrawObject(); } denn, Bewegungen sind abhängig von der Verarbeitungsgeschwindigkeit “Noch viel zu viele Fehler, aber keine Zeit und Übersicht und Lust mehr sie zu beheben. Ihr solltet übrigens schon ein Pentium 4 2,4Ghz haben... sonst klappt das mit der Kollision nicht so... hey hört auf zu lachen! Wenigstens springt er jetzt auf langsamen Rechnern nicht mehr übers ganze Level... oh mann bin ich deprimiert ;)” [Bull The Frog, CS 1] ©2008 by Martin Faust Bewegungen im Spiel Folgender Code ist besser t1 = Now(); while (not done) { t0 = t1; t1 = Now(); dt = t1 t0; pos += dt * dir * speed; DrawObject(); } denn Bewegungen skalieren sich mit der Verarbeitungsgeschwindigkeit ©2008 by Martin Faust XNA Macht das Ganze einfach, da bereits in der API vorhanden protected override void Update(GameTime gameTime) { float dt = (float) gameTime.ElapsedGameTime.Seconds; ... } ©2008 by Martin Faust Beispiel Implementierung Hashtable IUpdateable Entity +void Update(float dt) + Name + Bounding + Mesh Terrain Moveable +Matrix +Behaviour AI ©2008 by Martin Faust Scene class Scene : List<Entity> { public void Render(float dt, Camera camera) { camera.Apply(); foreach(Entity e in this) { e.Update(dt); if (camera.IsVisible(e)) e.Draw(); } } public static Scene Load(string level) { XmlReader reader = ... } } ©2008 by Martin Faust DOOM 3 Beispiel entityDef amiga_ball { "spawnclass" "idMoveable" "model" "models/ball/ball.ase" "mass" "10" "density" "0.2" "friction" "0.1" "bouncyness" "0" "snd_bounce" "small_plastic" "editor_color" "1 1 0" "editor_mins" "30 30 30" "editor_maxs" "30 30 30" "editor_rotatable" "1" "size" "60 60 60" } ©2008 by Martin Faust