• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.

Search the Community

Showing results for tags 'Algorithm'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Categories

  • Audio
    • Music and Sound FX
  • Business
    • Business and Law
    • Career Development
    • Production and Management
  • Game Design
    • Game Design and Theory
    • Writing for Games
    • UX for Games
  • Industry
    • Interviews
    • Event Coverage
  • Programming
    • Artificial Intelligence
    • General and Gameplay Programming
    • Graphics and GPU Programming
    • Engines and Middleware
    • Math and Physics
    • Networking and Multiplayer
  • Visual Arts
  • Archive

Categories

  • News

Categories

  • Audio
  • Visual Arts
  • Programming
  • Writing

Categories

  • Audio Jobs
  • Business Jobs
  • Game Design Jobs
  • Programming Jobs
  • Visual Arts Jobs

Forums

  • Audio
    • Music and Sound FX
  • Business
    • Games Career Development
    • Production and Management
    • Games Business and Law
  • Game Design
    • Game Design and Theory
    • Writing for Games
  • Programming
    • Artificial Intelligence
    • Engines and Middleware
    • General and Gameplay Programming
    • Graphics and GPU Programming
    • Math and Physics
    • Networking and Multiplayer
  • Visual Arts
    • 2D and 3D Art
    • Critique and Feedback
  • Topical
    • Virtual and Augmented Reality
    • News
  • Community
    • GDNet+ Member Forum
    • GDNet Lounge
    • GDNet Comments, Suggestions, and Ideas
    • Coding Horrors
    • Your Announcements
    • Hobby Project Classifieds
    • Indie Showcase
    • Article Writing
    • For Beginners
  • Affiliates
    • NeHe Productions
    • AngelCode
  • Workshops
    • C# Workshop
    • CPP Workshop
    • Freehand Drawing Workshop
    • Hands-On Interactive Game Development
    • SICP Workshop
    • XNA 4.0 Workshop
  • Archive
    • Topical
    • Affiliates
    • Contests
    • Technical

Calendars

  • Community Calendar
  • Games Industry Events
  • Game Jams

Blogs

  • Michael Tanczos.. Gamedev.net code monkey
  • So much for Creativity
  • The nearsighted one cometh
  • Kylotan's Developer Journal
  • Rabbit Droppings
  • The Code Zone Bargain Basement Blog
  • Author, Programmer, Bag of Wind(TM)
  • Journal of Sneftel
  • Strife's Most Excellent Journal
  • Readme.txt
  • Journal of Null and Void
  • Dirty Hacks and Stupid Tricks
  • This is not a blog
  • Continuous Refinement
  • 23yrold3yrold's excessively awesome journal
  • Journal of Tiffany_Smith
  • Journal of The God
  • Journal of void*
  • Journal of UknowsI
  • The Mothership Connection
  • Journal of Sandman
  • Gaiiden's Scroll
  • Journal of LessBread
  • mittentacular
  • Journal of adventuredesign
  • Journal of WitchLord
  • Journal of cone3d
  • Ian's Blog Rants
  • Is this thing on?
  • There is no escape from the Washu
  • /* Why you crying? */
  • Journal #259850
  • Journal of Yann L
  • Fortress of Solitude
  • Insignificant Corner on the Wild Wild Web
  • T. Wade Murphy - Sketchbook
  • Journal of Woodsman
  • Journal of kevmo
  • Not dead...
  • Working late past midnight...
  • Journal of pi_equals_3
  • Adventures in Game Production
  • Journal of Drewish
  • Development, OSS, and pie at work
  • Rarely Spoken
  • evolutional.co.uk
  • Welcome to the bowels of hell
  • Journal of danbrown
  • Journal of __Daedalus__
  • Journal of a Magical Badger
  • The Mad World Of Me
  • Perpetual Alpha
  • Journal of Buzzy
  • The Storytelling Ape
  • Untitled
  • Reminiscence
  • Big Sassy's Ramblings
  • Journal of dthorp
  • Journal of benstr
  • Journal of Prairie
  • The Simplest Thing That Could Possibly Work
  • Journal of eklypse
  • Journal of falkone
  • Let
  • Journal of DarkZoulz
  • 0_o
  • Adagio for GameDev
  • MEY - Archive
  • Journal of Ysaneya
  • A constant battle with time
  • Journal of CoffeeMug
  • Journal of Clash
  • My personal space of thoughts...
  • Journal of Void
  • Journal of xEricx
  • Jorgander's journal
  • Journal of mohaps
  • Journal of SEHenley
  • Journal of EricMeyer
  • A view from the trenches
  • Journal of LorenTapia
  • Incoherent Ramblings of a Madman
  • Journal of _zombie
  • FRIZZLEFRY!
  • Journal of IronWolf
  • Designing: The Game and Its Content
  • Fuzzlr
  • Journal of Deltah
  • Game Development of the Graphics Type
  • Journal of IndyHood
  • Raptor's Den
  • Journal of Scott
  • Journal of NafdahliX
  • Journal of Stoffel
  • Journal of the Digital Hobos
  • J3's Joint
  • The NoMonkey Experience
  • Codex of the Modemancer
  • Journal of Blivvy
  • My Thoughts and Progress
  • Journal of Mulligan
  • Boring banter of a programmer.
  • The mighty journal of Raymondo
  • Journal of Nurgle
  • Journal of Bossk
  • Journal of DJHoy
  • One bastard's rants
  • Reprogramming my brain
  • Building the Sphere, one vertex at a time.
  • Journal of Kraiklyn
  • Journal of MonkeyChuff
  • Journal of jakem3s90
  • Journal of Shred
  • Journal of Erluk
  • Ramblings of a Red Dwarf addict
  • Beginnings of the Wayward Programmer
  • Journal of mattnewport
  • Journal of iNsAn1tY
  • MMO Indie? Can't Be Done
  • Journal of CGameProgrammer
  • Journal of scarmiglion
  • Mmm...soylent green...
  • _luridcortex
  • Journal of SeanHowe
  • Journal of Zophar
  • Journal of glincoln
  • Daedalus Development
  • World of Sshado
  • My GameDev Journal
  • Shell extensions, code design and fluff
  • Deux
  • Eh
  • A Keyboard and the Truth
  • The Unofficial 'Empyrean Gate' Journal
  • Journal of whaleyboy
  • Journal of RobertC
  • Journal of James Trotter
  • The Barracks
  • Untitled
  • Don't Click Here
  • Stupid .NET Tricks
  • Journal of JimboC
  • iosys Research and Development Journal
  • ... And on the 8th day, God created Pouya ...
  • Angry Cuttlefish's Fishtank
  • SteelGolem
  • Journal of onehundred
  • Drakkcon's journal
  • Alexmoura's Journal
  • Journal of thesadjester
  • zdlr's game development journal
  • Destructive Design
  • You are all weirdos.
  • Train of Thought
  • Andy Pandy's Magical Journal of DOOM
  • Any Colour You Like
  • Inane Ravings of a Mad Engineer
  • Adventures In Managed World
  • Compiling...executing...recompiling
  • Journal of codemonster
  • Journalgasm
  • Journal of digisoap
  • So long, Gamedev.
  • Journal of hothead
  • For The Storm! a Tribute to Netstorm :)
  • Journal of Magmai Kai Holmlor
  • Journal of JoeDorson
  • Amazing Journal
  • Journal of John Swidorski
  • Journal of benutne
  • Journal of caffeineaddict
  • Journal of Antonie_Bouman
  • Journal of Thygrrr
  • In Which Christopher Robin Buys Some Cheese
  • The Monkey Digest
  • Jinxed
  • Rixter by Rixter by Rixter by Rixter
  • Journal of Cold_Steel
  • NanoTera
  • Journal of MagicScript
  • Journal of a struggling Student
  • MyJournal.lnk
  • Journal of doomhunk
  • Sir Code Alot's Codex
  • Unbreakable
  • Journal of lethalhamster
  • Brain Drain
  • Journal of uto314
  • Not your journal.
  • Computer food
  • Journal of The Frugal Gourmet
  • Digital Scrawl
  • Journal of ToohrVyk
  • Journal of graveyard filla
  • A look into the mind of TheNobleOne
  • Journal of BioMors
  • "That wasn't dirty dancing, it was Salsa"
  • Brandon N's Journal
  • Journal of HughG
  • DogCity Adventures
  • Programmology
  • Journal of Bluehair_fr
  • Graham's Incessant Ramblings (gwihlidal)
  • noaktree leaves
  • ElJournalo
  • Booleans spiffy development journal
  • Journal of Pants
  • coldacid.dev.journal
  • Simple Foolishness :: Just What I Like
  • Journal of Raduprv
  • Journal of Prozak
  • Dave, The Mystical Workings Of...
  • Journal of kentcb
  • Rhaal's Journal
  • Journal of evillive2
  • mobile chronicles
  • Proverbial Max
  • Codename: Karma Online
  • krez's Amazingly Entertaining and Informative Journal
  • The Re-education of Maik Vidales
  • Ols (Away)
  • Yar
  • Writing Web Games
  • What's going on at TDLGames or TDLSoftware
  • DruinkJournal
  • The Meaning of Nahrix
  • Journal of Obscure
  • Drawing Lightning
  • Metaphorical Journeys of Happenstance
  • Journal of Eddie Hicks
  • Ubertainment
  • DavidRM's GDC Coverage
  • Sande's GDC Blog
  • Journal of KellyM
  • joanusdmentia::journal
  • Stompy's Gamedev Journal
  • How to finish a game in less than ten years
  • The Long Road to Making Games
  • Journal
  • Unhandled Exception
  • Journal of cm2
  • Journal of SanityAssassin
  • The sleeper must awaken... and code some.
  • Devnull's Log o' Geekery
  • markr's complete waste of time
  • Ahhh! I think I'm melting!
  • Journal of MrP
  • rhummer's Journal
  • Journal of CyberSlag5k
  • Journal of scubabbl
  • Journal of BlueDev
  • Journal of chadmeyers
  • Journal of Raisor
  • Journal of Undergamer
  • Journal of Hedos
  • Journal of robpers2003
  • Journal of NeHe
  • Nothing much of interest...
  • The Realm of Trial
  • Starving Programmer - Will code for food!
  • Journal of iduchesne
  • Journal of Kippesoep
  • On the path with a ramblin' man
  • You Gotta Squeeze Every Pixel
  • Lame? Where?!
  • Journey into a 3D World
  • Child of GDNet
  • Journal of finch
  • Journal of Hakiko
  • Journal of Lenox
  • Journal of LastUnicron
  • MrEvil's Journal
  • Journal of evelyn
  • Journal de S'Greth
  • donjonsons thoughts
  • Journal of dotnetted
  • The Tub of Awesome
  • Journal of EnemyBoss
  • Triangular Pixels
  • Radioactive-Software
  • Ubik
  • Journal of wasted_druid
  • Level-Grind Online
  • Journal of adam17
  • Sir Sapo... The Man ... The Legend
  • An Artist's Ramblings
  • Journal of LiyonDR
  • Thoughts from a Wanna Be Producer
  • Independent thoughts of PaulECoyote
  • Journal of Lab-Rat
  • Journal of Revelations
  • Gauntlets of Recursion (+3)
  • Journey to the Ancient Galaxy
  • Random things uavfun thinks are cool
  • NickGeorgia's GameDev Journal
  • Journal of jonpolly99
  • Brutally honest game dev stories
  • Journal of Lacutis
  • Clever Title
  • Beals Software
  • Journal of TheArtifex
  • Journal of Ranger Meldon
  • Journal of Pestilence64
  • Journal of jyk
  • Kudu's GameDev Blog
  • Tech: Arena
  • Journal of skittleo
  • Shiny Journal of Programmingness
  • Journal of LamerGamer
  • Programming. Academics. Life
  • Journal of unazona
  • Journal of CalvinCoder
  • Adventures in 3D
  • Journal of tstrimp
  • Journal of Xiachunyi
  • Journal of QuadMV
  • Neutrally Buoyant in a Sea of Productivity
  • Cypher's Journal
  • Journal of Nomad010
  • Journal of a freak
  • Journal of dcosborn
  • Journal of Nagashi
  • The XNA Struggle
  • Journal of Mrs Kensington
  • Journal of heavygearz
  • J of K
  • Journal of MikeWW
  • Distilled Brilliance
  • Journal of EvDaedalus
  • Journal of WillC
  • Necron00bicon
  • Jemgine
  • Big Trouble In Little Chairtown
  • Satisfaction Guaranteed*
  • Journal of munKiecs
  • NetSim: A Hacking Simulator
  • Almost Lackadasical Gamedev
  • Journal of cppgirl
  • Journal of PennstateLion
  • Journal of sathenzar
  • Journal of Trading Route
  • Journal of RingTek
  • Journal of Aiursrage2k
  • Journal of Kalidor
  • The Bag of Holding
  • Journal of Sages
  • Journal of fur (p2pmud project)
  • Journal of Landsknecht
  • Joshua Pilkington's Journal
  • Journal of JoriathLionfort
  • Maddox's Best Friend
  • Primal Damage
  • The Rambloring of Beldamir
  • #ifdef TRAPPER_ZOID
  • Journal of IronGryphon
  • 1000 Monkeys
  • Horror Stories of RanBlade
  • UberFantasticoSuperJournalRahr!
  • Ascending the Lift Hill of Life
  • shilblog
  • "Another genius foiled by an incapable assistant."
  • Exploring infinity
  • Journal of meix
  • Journal of Impeller Head Games
  • The scriblings of Samsonite 2007 AD.
  • Kazade's GDNet Life
  • SteevR's Deadly Development Mistakes
  • IBTL
  • The Moonpod Insider
  • Journal
  • I update. You read. Ok?
  • Journal of pink_daisy
  • In The Beginning
  • We stumble at noonday as in the dark.
  • Journal of Zipster
  • Journal of fearghaill
  • Evolve Games
  • No ninjas here, no really they are over there.
  • Journal of Caitlin
  • Journal of _winterdyne_
  • Journal of PreditorX0789
  • Journal of TyroWorks
  • Journal of AfroFire
  • The Whine Cellar
  • Journal of bargasteh
  • Journal of LilBudyWizer
  • Journal of CTar
  • Journal of furin121
  • Journal of Khaos Dragon
  • Untitled
  • Sheridan's adventures in random nonsense.
  • Nitrous Butterfly Developer Journal
  • Journal of Mephs
  • Journal of Nuget5555
  • Journal of xaver
  • Journal of Fahrenheit451
  • Captaiz Z
  • Journal of nts
  • Journal of rodgaskins
  • Chronicles of the Hieroglyph
  • Journal of Kuro
  • The Life of Corman
  • Journal of Kria Krabbit
  • Abwood's Coding Notes
  • extralongjournal
  • A love story: Me and my 2D engine.
  • Journal of sBibi
  • Journal of necreia
  • Dzz's Journal
  • Journal of Jervin
  • The journal of rpg_code_master
  • 2D Game Development with a splash of Mumbo Jumbo
  • Journal of Mordt
  • Journal of paradoxnj
  • The Wayward Druid
  • Journal of Tera_Dragon
  • darkpanda's awakening
  • Journal of Downer
  • Journal of RageHard
  • Journal of TommyA
  • Journal of kylecrass
  • Destination: Failure
  • Ye Olde Ramblings
  • Journal of Johnny Casil
  • Journal of C J W
  • Krizo
  • Journal of Zao
  • Journal of socrates200X
  • Journal of chapmast
  • Journal of rjhcomputers
  • The Broken Mind
  • Journal of ebner-wilson
  • Journal of SKREAMZ
  • Journal of astralvoid
  • Graphics is gooder and stuff
  • Journal of Talonius
  • Explicity undeclared yet implicitly defined ramble
  • UofU Team Journal
  • Journal of thedott
  • I am a duck
  • Delusions of Grandeur
  • Journal of kirkd
  • Exploration of pie and caek
  • Journal of slowpid
  • It's a hobby.
  • Subverting C++
  • Journal of Dreddnafious Maelstrom
  • Journal of marmin
  • Monkey Land
  • Dev. Blog of Empire Productions
  • Wiiiiiiiiiiiiiiiiiiiiiiiii!!
  • Slow progress
  • Journal of trailervoice
  • Illusive Studios
  • Journal of MindWipe
  • Journal of kmccusker
  • Ramblings of a partialy sane programmer
  • My Game programming journey
  • Adventures in Text-mode
  • Better Together
  • Journal of Kyle N
  • Journal of Genesis : Origins
  • NO
  • Project Kingstone
  • Brainfold
  • Journal of darkzim
  • Journal of jkielpinski
  • Dovyman's Journal
  • Journal of Goober King
  • Adventure Owns You
  • Journal of Sentientv2
  • Journal of mistermecha
  • Journal of sipickles
  • Prodigious
  • Bradley Sward - Small Game Projects
  • El Nino Games
  • Journal of Trefall
  • Tesseract's Game Development Journal
  • Mark the Artist Fights the Future
  • PumpkinPieman's Journal.
  • Get back to work!
  • Journal of Kevinator
  • Journal of Charles Thomas
  • Journal of erwincoumans
  • Journal of Michael Nischt
  • Journal of ukdm
  • Journal of Andrew Fults
  • Level editor in the works
  • Good Enough?.... Never!
  • Wijnand's Game Journal
  • Odorless Entertainment
  • Journal of blimey
  • Milkshake's Dev Diary
  • Journal of dist0rted
  • Journal of -JetSirus-
  • Bandit Revolvers: Championship Edition!
  • Journal of the enemy
  • Journal of soconne
  • Journal of valles
  • Journal of Aardvajk
  • Frog Blog
  • Journal of GreenGiant
  • Journal of ArNy
  • Developing Firebox
  • Journal of John_23
  • Journal of Luminous
  • Journal of CloudNine
  • The Enigma Code
  • bricklayer developers: Fountaindale
  • Journal of The_Neverending_Loop
  • Abort Button Software
  • Journal of Xrystal
  • Journal of Stuart Y
  • Journal of Jesse_P
  • H3O + U-235
  • Journal of a Shaven Ape
  • metaverses
  • Journal of C0D3Name
  • Journal of binaryguy
  • Journal of a wannabe game programmer
  • Journal of Fortia
  • Journal of dracan
  • Journal of boto
  • iLiNX
  • Journal of a undecided
  • Journal of cwestbrook20
  • Yet Another Game Maker
  • Journal of smc
  • The Journal of Thraed, Shadow of Fahrenguard
  • Journal of webjeff
  • Journal of phantom-soft
  • The Wild West of Programming
  • Journal of tribalKris
  • shadowcomplex's stuffs
  • Journal of IceSynth
  • Journal of Tesl
  • Surreal Sensations
  • Journal of AlexLoren
  • Journal of Ronnie Howell
  • Indisputable Tales of Interest
  • Journal of KGodwin - Newbie Game Dev
  • Wills' Wishes
  • Journal of miminawewe
  • Journal of DavidNeal
  • soggyfries
  • Journal of Tallitus
  • Promit's Ventspace
  • Journal of FunLogic
  • Journal of cheops2007
  • Journal of Sensei Maku
  • A Developer's Dream
  • Journal of VanillaSnake21
  • The ballad of a n00b
  • Journal of mattdev
  • Your company name here
  • The Richest Beggar in the World
  • Synbios128's Journal
  • Journal of AnthonyN1974
  • Journal of acappella
  • Journal of deerslyr1
  • Journal of Dragoro
  • Journal of Damon501
  • This Is My Story
  • Evil Stick Man in Evil Stick Land
  • Journal of noNchaoTic
  • Journal of Journaling
  • Phyletic gradualism
  • Fallen, oh dear :
  • The Byproduct of Facts and Fiction
  • Journal of Adam Hamilton
  • WISP
  • The Lion amongst the code
  • Abliss Gamedev
  • Once a Bird
  • Yeah
  • Journal of ShaneHeres
  • Orbital Fan's game development journal
  • Journal of VikingDK
  • Journal of zedz
  • Kiryn's Development
  • Defeating procrastination one post at a time!
  • Journal of HeftiSchlumpf
  • Journal of Scint
  • Journal of MattWhite06
  • Journal of Funkymunky
  • Under a ShadowyTree
  • Frogames adventures
  • Journal of Treesong
  • Brandogon's Journal
  • Alaklin's workshop
  • The never-ending story...
  • Journal of GreenToad
  • Journal of TiredofSleep
  • CAN Games Development Journal
  • What is Interactive Art?
  • Verg-o-nomics
  • Excursions into the Unknown
  • My Epiphany
  • Brain spasm
  • Brian Hoffer's Journal
  • BrokenThorn Entertainment
  • Journal of terry_burns85
  • Old code never dies, it just fades away
  • Journal of ChrisE
  • Journal of ShadowRancher
  • Journal of Dark Matter
  • Journal of mikalar
  • Journal of Moss
  • The Mystic work of Chad
  • Jason's journal
  • UserJP's Journal of Doom +4 ( Imbued with Fire )
  • Quanta's Journal
  • Journal of InnocuousFox
  • JasonP Works It
  • Every Semicolon
  • Data Spire
  • Blue stain
  • Journal of hashin
  • Journal of s3r1n
  • IndieZen Developers Journal
  • OddGames development journal
  • Journal of rvdwerf
  • Memoirs of a Graphics Engine
  • Journal of DraconisRavenix
  • Journal of dbaumgart
  • Journal of Nytegard
  • Archipelago
  • The truth between the lies
  • Journal of kornman00
  • Journal of EvanWeeks
  • Journal of _ArmuT_
  • Journal of stenol26
  • Journal of Besome Games
  • Journal of Palish
  • Journal of binchawpz
  • Magpie
  • MJP's Last Stand
  • Journal of theOneAwaited
  • Journal of EliteCoder
  • Journal of Pluvious
  • Journal of Veslefrikk
  • Journal of Vyper_uk
  • Journal of ExcessNeo
  • Mammal Games
  • Journal of Rascal
  • Laura's Game Journal
  • Robot, Ninja, Pirate, Monkey
  • Journal of Synthros
  • Journal of PsychoPumpkin
  • Rex of the Arx
  • Leandro's endeavours on managed code land
  • Journal of Moore452
  • Chronic Procrastination
  • Journal of Lode
  • Z Axis Games
  • Frisson
  • Journal of +1Games
  • Journal of kapilkapre
  • Journal of Taharez
  • Journal of xtBones
  • Journal of tinac2008
  • Life in the cereal box....
  • Journal of SilentSiren
  • Omegaice's Dev Journal
  • MMORPG Development
  • Journal of NowSayPillow
  • Pixelante
  • nerd_boy's journal
  • Journal of Remus Turcuman
  • The Log: Cloud Ocean
  • Journal of Jaap1978
  • Journal of Mak
  • Journal of lucius
  • Don't forget, it's supposed to be fun!
  • Journal of DarkPsychosis
  • Journal of rolkA
  • Journal of Sastrugi
  • Journal of 4fingers
  • Journal of nsmadsen
  • Just Glad to Be Here
  • Journal of MS Larsen
  • Ep's tool-dev diary
  • lightassassin.log
  • Journal of 2disbetter
  • Crawling with ideas
  • Journal of nightwreath
  • IfThen Software
  • Academia
  • Journal of ID Merlin
  • Journal of digitalerr0r
  • Journal of Hi Speed
  • Journal of Anexa85
  • Journal of ZootSuitGames
  • Journal of jrmcv
  • Journal of Earthania
  • Journal of Lethargic Programmers
  • The Adventures of a Universal Traveller
  • Merry Prankster Games
  • Journal of caldiar
  • Journal of Darkrider0318
  • Journal of davepermen
  • Journal of Encicra
  • Software Renderer in 28 days
  • Journal of DrSizzla
  • Journal of brainstyler
  • Journal of linternet
  • Journal of matt_j
  • Untitled
  • Journal of m3sh
  • My Newbie GD Journal
  • Journal of smr
  • Drew_Benton
  • Journal of FeverGames
  • Windows [Phone | 8] musings
  • Journal of popcorn
  • Journal of gytha
  • Isolate Development
  • Journal of MrCpaw
  • The Pixel Ocean
  • Journal of Zubski
  • Journal of inferno82
  • Journal of mikeman
  • Starting Thoughts
  • Journal of stimarco
  • dwn
  • Tachyon Wars
  • Journal of AndrewA
  • Journal of rip-off
  • Treehouse Gaming
  • Journal of Tom
  • Journal of rohde
  • Journal of wicked357
  • Journal of Roo Avery
  • Journal of Tower City
  • Journal of geekster
  • Graphics Engine Development
  • Journal of hGonzalez
  • Journal of Caste
  • Skipping a D
  • Journal of Matt328
  • Elucidation
  • Battlefield simulation engine
  • Journal of AEdmonds
  • DudeMiester Speaks!
  • Technical Artistry
  • Journal of Exide
  • Mason's Journal
  • istar's Game Life
  • The Greatest Development Journal Ever Written
  • A Traveller's Tale
  • Journal of foursticksj
  • Robot University -- a 2D DirectX Puzzle
  • Journal of KnivesAldren
  • Journal of jerrywilkins
  • Tales from the Veggie Patch
  • Journal of jnbutler
  • Lonely Hearts Club
  • Journal of Rakshasa
  • Journal of OmegaDog
  • Journal of Machaira
  • Journal of damix911
  • Journal of Richard Geslot
  • Dark Horse Software
  • Digital adventures through the third dimension
  • Gnoblins - Development journal of an indie game
  • Journal of ThomasBelgium
  • Wavesonics Pseudo-Random Journal Generator
  • Yckx's GameDev Journal
  • Tales of Ozak
  • Journal of nes8bit
  • Journal of bgund001
  • tinyrocket
  • Think Small
  • The YAR Project
  • Journal of Christopher Loyd
  • Journal of Vanderry
  • Journal of Ariste
  • Journal of namar777
  • Feathers and Code
  • Journal of Mussi
  • Dans Journal
  • Journal of Drakonite
  • Wilhelm's Journal
  • Journal of Laval B
  • Journal of Sybalos
  • Journal of dx elliot
  • True, False, Maybe
  • Journal of dragongame
  • Journal of ManuelMarino
  • Journal of wpalmer
  • Journal of KezraPlanes
  • ProgrammerMattC's Journal
  • Journal of reversinguy
  • Rants Etc.
  • Journal of daveodonoghue
  • Journal of Lunarjax
  • Journal of ShabbaStoney
  • Journal of Dwarf King
  • Journal of Lee Stripp
  • Rendering Systems
  • My C++ Journey
  • Journal of LarryWP
  • Journal of Daivuk
  • Journal of spacemoses
  • Journal of Sam Hagelund
  • #!/Bin/Bash-ObsidianBlk
  • etodd makes games
  • liger13's Blog
  • zer0wolf's Blog
  • davepermen's Blog
  • SageKri's Blog
  • Neutrix's Blog
  • speciesUnknown's Blog
  • FAR Colony's Blog
  • megamoscha's Blog
  • In the year 4016...
  • Lightning Engine
  • kiwibonga's Blog
  • Revenge of a Buzz Saw
  • InvalidPointer's Internets Rambling
  • KulSeran's Blog
  • Drilian's House of Game Development
  • alfith's
  • Ravyne's Blog of Blogs
  • cowsarenotevil's Blog
  • AndrewBC's Blog
  • JoeDev
  • Uncertanities, pitfalls and lesssons
  • martin_bfg10k's Blog
  • ScottsCreations' Blog
  • The Journal Of Luckless
  • Pixel ? Tile ? World
  • Fastcall's Development Blog
  • Blog 3.0
  • owl's Blog
  • dwarfsoft [GPA]
  • Seaßourne's Blog
  • mytre's Blog
  • Kevin's Blog
  • Gaetano Lenoci GameDev Blog
  • chench's Blog
  • fcoelho's Blog
  • Shozan's Quest
  • A Zombie Wedding
  • TheHinch
  • Dev Notes
  • kseh's blog
  • MichaelT's Blog
  • Mastrgamr's Blog
  • Life in Code
  • Mental(FrameRate)
  • The Animal Farm GameDev Blog
  • brslocum's Blog
  • Lost in the Catacombs of Game Development
  • LambdaRogue Development Blog
  • In the Shade
  • Moe's Blog
  • (O_o)
  • Blog
  • Scourage's Blog
  • Tocs' Blog
  • Ezbez's Blog
  • Liheike's Blog
  • Blendium's Blog
  • Madhed's Blog
  • Out Of The Ashes
  • stonemetal's Blog
  • Lords of Midnight Development
  • MarcotteR's Adventures in Research and Development
  • Coding in the Fast Lane
  • Lavinski's Blog
  • Leadwerks Developer Blog
  • MaskedAvenger's Blog
  • XXChester's Blog
  • Just Let It Trickle
  • assainator's Blog
  • Okiedoke!
  • HzerDown's Blog
  • Random Rantings
  • diablos_blade's Blog
  • Airy's Blog
  • HydroxicAcid
  • Igroman's Blog
  • Imgelling's Blog
  • px's cleverly named blog
  • JamesPenny's Blog
  • LogicalError's Blog
  • Splinter of Chaos' Blog
  • The Game Prodigy - GameDev.net Edition
  • Retronator
  • Rulers of the Known Universe
  • Exiled Dimension
  • Katerina's Blog
  • kasonerap's Blog
  • Crage Games' Blog
  • Mastering MMORPG3
  • Emotion Rays DevBlog
  • Adam Omega
  • The duckpond
  • Cross Mobile Gaming
  • Henry Prescott's Portfolio
  • 15 minutes of fame and an eternity of shame
  • Kristof's Game Dev Blog
  • wakahana's Blog
  • sdaq overflow
  • Kimmi's developer blog
  • Lightning Bolt Games
  • Tutorials By Andy Esser
  • BulletOtaku Games Journal
  • Eclision Programming Team
  • New Old Things
  • They don't teach this stuff in school
  • Glow engine Journal
  • Drennen's Journal
  • Jake's Journal
  • A non-programmer's programs
  • Hexagon's Journal
  • Mobeen's Journal
  • EndersGames' Journal
  • Minastas Games
  • Ali Akbar's Journal
  • Butabee's Journal
  • Dragon's Nest
  • Stop playing, start coding!
  • G-Truc Creation
  • Ninja GD
  • Slav2's Journal
  • NickyB's Journal
  • Jastiv's Journal
  • PARPG development blog
  • Romnia007's Journal
  • rachoac's Journal
  • Product Review Blog
  • developing gordebak
  • AciDGraphit3's Journal
  • SFAgent24 Developer Journal
  • Milcho's Journal
  • MikeTacular's Journal
  • The Start and Journey of Sound Creation
  • GDC 2011
  • Hypnotron's Saga
  • glaeken's Journal
  • Robot Ramblings
  • vicviper's Journal
  • jMonkey Business
  • Project Simplicity
  • alphablackzer0's Journal
  • gasto's Journal
  • InfectiousGames Brand NEW journal!!
  • GuardStar's Journal
  • MysteryMeat's Journal
  • deks' Journal
  • T-JAM Studios Journal
  • sk84z's Journal
  • Dace's Journal
  • Adrenaline's First Huge Project
  • Digivance Game Studios
  • Tomasz Dabrowski's Journal
  • Jacobean's Journal
  • Quiet Ponderation
  • Peter Vaughn's Journal
  • J-Snake's Journal
  • nomura's Journal
  • Opt7ons' Journal
  • gharen2's Journal
  • SymphonyOfDream's Journal
  • standingguy's Journal
  • ArtyjayStudios: A fistful of fail.
  • 3D BYTE Technology Blog
  • Aeroflot's Journal
  • Michael J Pierce
  • Datahammer dev blog
  • Bullet Points
  • Sappharos' Journal
  • Pendragon274's Journal
  • Daniel E's Journal
  • From Nothing to Everything
  • ballerplaya's Game Dev Blog
  • Twisted Shield Interactive
  • Menopia's Journal
  • The Legends of racoiaws
  • Andrew Kabakwu's Journal
  • BlueGlutton's Journal
  • StudioZx Journal
  • Lucas Daltro's Journal
  • zerothrillz's Journal
  • GameDev.net Staff Journal Old
  • Matthew Wood's Journal
  • RedPin's Game Jorunal
  • DeeMOONger's Journal
  • Locke's Game Dev
  • Lloyent's Journal
  • Wildlander's development blog
  • AmzBee's Journal
  • Kaushik's Journal
  • Shawn Hargreaves' Blog
  • Xerron's Journal
  • Mario Cavett's Journal
  • BauAir Studios
  • Jacob Gardner's Journal
  • TiagoCosta's Journal
  • Cypharr's Journal
  • loveworld99's Journal
  • Songbird's Journal
  • Oddbird Games
  • IsNe's Programming Journal
  • Firework Factory Development Journal
  • TheLogster's Journal
  • Little Coding Fox's Journal Of Exotic Adventures
  • Hexagon2D
  • TKE Super Dave's Journal
  • andi's Journal
  • Tim Sarbin's Open Wars Journal
  • Jaye's Journal
  • Vermaelen's Journal
  • The 'Massive' Project
  • Marek A. Krzeminski, MASc
  • The Road Less Traveled
  • Inclemency Studios Log
  • Short-Story about Meteora(My dev team)
  • Fox89's Journal
  • Trivigy's Journal
  • FetDaniel's Journal
  • Browser based RTS in the making
  • MortenB's Journal
  • LastContract
  • Developer Quest: Journey of Hope
  • Mayatrone's Journal
  • Vaguely In Focus
  • Starting up as a new company
  • __Homer__'s Journal
  • Sketching the Surface
  • Fubar the game - Developers Journal
  • StephanieRct's Journal
  • daver64's Journal
  • Mozly's Journal
  • Venfer's Riddle RPG/Puzzle game devjour
  • The AdaptivElite Developer's Journal
  • resell4's Journal
  • 2pacfarrar's Journal
  • Karim Kenawy's Journal
  • bandicootzcrib's Journal
  • grandiz3r's final gaming assault
  • ElementCy's Journal
  • Shadows, instruments and ohh my
  • Rattrap's Journal
  • XDaWNeDX's Journal
  • Eliad Moshe's Journal
  • ChugginWindex's Journal
  • Slyxsith's Journal
  • MutedVision
  • r1ckparker's Journal
  • ashkan_203's Journal
  • Project: CharWars
  • luckeytree's Journal
  • Journal of Suspense
  • PREDATOR_UK's Journal
  • Walking Towards The Sun
  • Trucking on
  • Zeypher Rise to Power
  • Keeping up with yesterday
  • vibrunazo's Journal
  • tangentstar's Journal
  • Accountability Journal
  • carlosx's Journal
  • EtherFields' Journal
  • mobilus' Journal
  • AnotherGS' Blog
  • Web by Day, Games by Night.
  • void* journal
  • N.O.W.
  • sosa's Journal
  • Cam's DevLog
  • Disciple of Jonato
  • StarDust DevLog
  • Paradigma11's Journal
  • GSoC '11 - Mono Runtime
  • D Bits
  • The Design Conundrum
  • DrTorte's Journal
  • Mobile RPG
  • 5MinuteGaming's Journal
  • KingofSwing94's Journal
  • Arc Fusion Games' Journal
  • ebontide's Journal
  • Yang G's Journal
  • Arcade Zombies
  • Xaviarrob's Journal
  • Stepping into demons lair
  • Rodimus and Unity
  • Linkfan88's block world journal
  • MeowMeow's Journal
  • A shooter game for all ages
  • The Failure Epiphany
  • Bregma's Persistent World
  • Nik02's Journal
  • lask1's Journal
  • Vic's Journal
  • sketckasketch's Journal
  • Last Engine
  • nife
  • Booniverse
  • Muzz5's Insane Witterings
  • Joe Storm's Journal
  • Switchblade_77's Journal
  • Eiffel's Journal
  • Graphics & Games... or the other way around
  • phara0h's Journal
  • IggyT's Journal
  • ElusiveCoder's Journal
  • Thoughts and Opinions
  • scout113's Journal
  • notyourbuddy's Journal
  • MERKB's Journal
  • Mr Moose's Journal
  • AAKN's Journal
  • TheEvilMuffinator's Epic Adventure
  • Cat Scratchings
  • FreeStejler's Journal
  • Gerónimo Garcia, a game developer
  • zacaj.devlog
  • TC's Journal
  • Luc the Whiny Wind Boy's Journal
  • Tactical Recon Dev Journal
  • OmensDev's Journal
  • OMG NUB!
  • Irvin's Journal
  • ZSG Development Journal
  • MrCodeSushi - Raw and Tasty Code!
  • bls61793's Journal
  • 3D Models for Games
  • T e c h l o r d's Journal
  • Santisan's Journal
  • ZenithSal's Journal
  • Reflections of a Mindless Individual
  • Polar's Journal
  • RetLee's Journal
  • Journey To Hammerdale Devlogs
  • BigDaveDev's Journal
  • bugbuster77's Journal
  • Survivor Game Journal
  • GoofProg.F's Journal
  • gash's Journal
  • Ghavami
  • blltdgr's Journal
  • marcelomp's Journal
  • ZARS Dev Journal
  • Joe P's Journal
  • Discouraged Programmer
  • Real Time RayTracing and implicit modeling
  • Space Exploration/Action RPG hybrid reliant on UGC
  • Random Developments
  • The Newbie Chronicles
  • Mark's Journal
  • DeXmas' Journal
  • Betable's Journal
  • parowoz's Journal
  • Topblast_'s Journal
  • CopperpotQ's Journal
  • japro's journal
  • Merlin3D Development Journal
  • SuperMaximo93's game development
  • Hect
  • Alberta online
  • DIEVOLUTION DevBlog
  • vodku's Journal
  • Codinguy's Journal
  • One man show
  • frang75's Journal
  • Calculemus's Journal
  • ConorJH's Journal
  • DaedalusK71's Journal
  • undead's programming corner
  • SubgateUniverseDevLog
  • Maciekp's Journal
  • Truxton's Journey into Game Development
  • -=cmaster.matso=-'s Journal
  • Not enought samples
  • Eigen's Journal
  • After Hours - and Then Some
  • Dylan's Journal
  • MelKay's Journal
  • Starpires - Space Strategy
  • StormJournal
  • QuestLore devblog
  • Journal of the Mini-Engine (ME)
  • Gl_Terminator's Journal
  • Terminal 0.1 Log 03
  • Odiee's Journal
  • Noisecrime's Journal
  • IMPACT Engine Development Blog
  • asm0day's Journal
  • YodamanJer's Journal
  • Learning Game Programming
  • The Beginning
  • GuardianResearch
  • Dumping Thoughts
  • lanemax's Journal
  • LaneMaxwell's Journal
  • IceFall Games
  • Ashnor's dev journal
  • moodywine's Journal
  • Thomas Amaranth's Journal
  • LoreHunter's Journal
  • VJ01's Journal
  • IronReaverGames Journal
  • OutlawZen's Journal
  • Xealgo's Tumblr Blog
  • Rich Markle's Journal
  • bigxow's Journal
  • Unity3D and AI Game Development
  • Project Updates
  • Lyost's Journal
  • AffenCode Blog
  • davispolk's Journal
  • LightSource Team's Journal
  • Midnight Thoughts
  • Subliminalman's Journal
  • AltairDali's Journal
  • NFL 2011 Talk
  • Valvatorezj's Development Journal
  • Silviu Andrei's Journal
  • Slaton's Journal
  • FlyingSpork's Journal
  • From AiGameDev's Secret Lab
  • FLeBlanc's Journal
  • sampad's Journal
  • Meh Entertainment
  • DeGod's Journal
  • dev.mind
  • ZEJOKER13's Journal
  • swiftcoding
  • paka3d's Journal
  • Lior Tal's Sandbox
  • The Forgotten Planet
  • Rav3nSt0rm's Journal
  • Litheon's Journal
  • ddn3 journal
  • Yacjys
  • I am a beginner and clueless.
  • Adventures in GameDev
  • Mallach's Dev Blog
  • mortalmarshy's Journal
  • Triax Bridge Command
  • EddyDownload's Journal
  • David Amador Journal
  • WorldAlpha.com DevBlog
  • DevDog82's Journal
  • Halley62373's Journal
  • pygame
  • Untitled zombie game
  • alwynd's Journal
  • Lucasnj's Journal
  • johnnycash's Journal
  • George Laskowsky's Journal
  • Eastfist Builds a Machine
  • Allar's Journal
  • irrationalistic's Journal
  • Bidimensional Dreams
  • Jeason's Journal
  • MikeDodgers' Journal
  • BrianTheProg's Journal
  • ZorgaGames Journal
  • Dreaming's Esoteric Teachings
  • compscialien's Journal
  • sythe's Journal
  • turbello's Journal
  • Xanthier's Journal
  • Flowers In Tears' Journal
  • Chris's Animation Blorg
  • Shaker25's Journal
  • SpeedRun's Journal
  • JetStone's Journal
  • sirkibble2's Journal
  • The Shadow Journals
  • Overm1nd's Journal
  • TommyForesd's Journal
  • LeonidValess' Journal
  • Black-Rook's Journal
  • My project blog
  • Mayley's Journal
  • Azure Acres
  • darc koder's Journal
  • Earthwalker's Journal
  • The Hitchhikers Guide to Video Game Production
  • LarryADaniel82's Journal
  • 2D Game Making, the Easy Way
  • DMFirmy's Development Blog
  • Giliam's Journal
  • Notes
  • The Curiously Recurring Gimlet Pattern
  • Zach's Development Journal
  • Dukandia
  • Under Development Law @ GDNet
  • #AltDevBlogADay
  • Digitalis Digoxin
  • Hedron Online Development
  • BlueStar03
  • Library of links to movies
  • SCForest's Journal
  • Heath's Journal
  • Malachor's Journal
  • Craftwork Games Blog
  • Behind the Scenes of Mirthwerx
  • omnomnom's RPG journal
  • Gaiiden's Journal
  • Overview Journal
  • Severed Infinity
  • Creating a Grand Strategy
  • Life at Demergo Studios
  • RADICAL HEROES: CRIMSON CITY CRISIS
  • Adam's Lair
  • Vilntus Entertainment
  • Lateral Creation's Journal
  • nodeg's learning journal
  • Eating The Elephant
  • Cbear's Dev Journal
  • The Siege Released
  • GDC 2012
  • ChezNoir
  • Journey Into Game Dev
  • Ya2's Journal
  • theNewb1e's Journal
  • Boreal's Dev Journal
  • www.Dubious-Games.co.uk
  • _Suezo_'s Journal
  • Lemon Treehouse
  • TechnoFlux
  • GrayMatters
  • Computational Contemplations
  • StarInc Android Development
  • Narf the Mouse's Journal
  • Antilia Development Journal
  • SpaceBeam development
  • Nocturnal Ferret
  • Tdawg30's Journal
  • Making the 'Rituals'
  • Timelines: Assault on America
  • Gunthera's Journal
  • Anthropocene: A Browser-Based Text RPG
  • AndreaTux's Journal
  • Rendering Is Fun
  • Emforce's Journal
  • _moagstar_'s Journal
  • Journey to Ironbane
  • Tipsy's Journal
  • Nick's Corner
  • Methods of A Madman
  • B O N E S' Journal
  • i-tech's Journal
  • Zul's Journal
  • kruncher's Journal
  • Misadventures in Game Making
  • WubWub Games
  • The Proverbial Bottom Rung
  • MidnightTangent's Journal
  • Bharath Raghavan's Journal
  • Stuff Games
  • From Pixel to Product
  • MissMarble's Journal
  • | dxCUDA | software development journal
  • Ralph McJournalstein
  • HorangiSoft
  • Flight of the Journal
  • Thekill473's Tinker Shop
  • Staring into the Moon
  • Mr Jones' Journal
  • BlackWingedGames' Journal
  • ChinaJoy CGDC 2012
  • A Weird Journal
  • necros devblog
  • CodeImp Game Developments
  • Face Punch Games Devblog
  • Sparked Studios Games
  • nighttime development
  • Coding In Transit
  • Journal
  • Kazuo5000's Journal
  • TMKCodes' Journal
  • miicchhii's Journal
  • Framework Philosophies
  • Journal of the Burning Hand
  • Warbringers - hotseat pvp game
  • Tyberthia Learning Experience
  • 2D MO Game
  • SIC Games' Journal
  • RATED-RKOFRANKLIN's Journal
  • Severin's Journal
  • lwm's Roa Journal
  • n00b0dy's Journal
  • uwi2k2 - Part Time Game Dev
  • Bluefirehawk's: "Path to World Domination"
  • Project Veritas - Working title
  • An Engine Through Time and Space
  • Epic Zombie's Journal
  • Bon Ink Creations' Journal
  • Aeronel's Journal
  • My Journey
  • vee's game development blog
  • The Long Road of Simulation
  • TestRoom
  • Amateuriffic
  • Alex Hopkins' Journal
  • Game Project #1
  • Project NN
  • Hostile Viking Studio Development
  • First game for Android
  • Jonathan's Journal
  • The Dwarfenheim Journal
  • codingnoobie's Journal
  • Will push pixels for food
  • Funstorm Dev Blog
  • Synchrex Studios Dev Blog
  • Tales of Allula: Crystal Spirits Development
  • Realm Chronicles developer's blog
  • dmdSpirit's Journal
  • Empyrios: Prophecy of Flame
  • Horizon Dev Journal
  • Corey Hoard's Journal
  • Freya's Journal
  • Hannah Wood's Producer Journal
  • Aurioch's Time Machine
  • achild's Journal
  • Retro Grade
  • Little Sticky Destroyer
  • C# Workshop - Some reedits.
  • creatures-of-gaia.com
  • Adventure Through Game Programming and Development
  • ellisvlad's MMORPG Development Journal
  • FantasyCraft's Game Engine Development
  • The life of a Unity Developer
  • My First Journal
  • Alex.SilR's Journal
  • Nathan's Blog
  • theartist493's Journal
  • Black's Tales
  • Fran Bow, a point & click adventure
  • Aaru's Journal
  • Drayan's TechBlog
  • Journal.Unknown
  • Josh Hartley's Journal
  • A long, frozen Path
  • Game Dev: P-13
  • Gianmarco Leone - Audio Director
  • slicer4ever's Journal
  • The Tribes Game Dev Journey
  • Like tears in the rain
  • Undead Castle Dev Journal
  • Welcome to Flying Cow Ink
  • Riphath's Journal
  • sgt_barnes' Journal
  • Voxel Game's
  • Xamusel's Gamedev Journal
  • Legends of Maelm
  • Crunch Magic
  • The Gameconomist
  • Kaptein's Journal
  • Morphex's Journal
  • Cafe Murder Dev Log
  • XNA 3D hexagon tile RPG testing
  • Modern Roguelike
  • Luis Krestos IOS
  • Gamieon's Journal
  • Koron
  • Sports Fiction ® New Sci-Fi Sports Game Project
  • cengizonkal's Journal
  • Minecraft/Survivalcraft Text Based Game
  • MrPhoenix's Dark Galaxy RPG
  • Vaerydian
  • j-jorge's Journal
  • Progress of 2D (?) Game
  • Orcus3D - The development of a modern game engine
  • Solo Game Developer Guy
  • Terrifying Secrets
  • Ground Up: A Journal Of An Engine
  • 1520:The Asylum
  • Electronic Meteor
  • Cthuga's Journal
  • ikam's Journal
  • Making a simple dungeon crawler
  • Digitopia's Journal
  • Ghostship Journal
  • Marc Mencher's Career Advice
  • Zombie Factory Dev Journal
  • Colony - Indiegame Dev Journal
  • Christian24's Journal
  • Joe's Games
  • MateiSoft's Journal
  • Tubocass' Journal
  • EWClay's Journal
  • And let there be light.
  • Starbase Citadel
  • arunDev's Journal
  • redw0lf's Journal
  • BGBTech: The Status Update
  • The Dawn Age - Development Journal
  • Fen's Journal
  • Jcam Engine 2 Development
  • More Than Cannons Announcement
  • chamomoe's Journal
  • Evolving as a programmer starting with Pong
  • scottrick49's Journal
  • Leadwerks Developer Blog
  • From idea to a game.
  • Game for kids
  • Azaral's Rants, Raves, and Lunatic Ideas
  • Krealit's Journal
  • Scarabus' Journal
  • Journey Into Functional Programming
  • The Beginner's Programmicon
  • Project Domini
  • fps games by mohammed 360
  • Infinity Elephant Development Journal
  • Making a Terrain Generator
  • Squared'D's Journal
  • Squire Studios: A Team of First-Timers!
  • AllEightUp's Journal
  • My attempt at making a platfo... no, a game
  • Spacetime Perpetuance
  • Multiplayer Project Journal
  • PokingWater's Journal
  • Creating A Game: My Journey
  • Konrad's Journal
  • Sam Jackson's World of Game Development
  • Miscellaneous Programming Notebook
  • Somewhere in space
  • Le Journal de Yahiko
  • TidBitCode
  • Nightmaare Shares
  • Dev notes from the Crypt!!!1eleven
  • Neometron's Journal
  • Snapey Code
  • Morikubo's Journal
  • Game A Week Self Challenge
  • DareDeveloper's Journal
  • Aura Games' Journal
  • Viadukt Dev-Journal
  • Arhim's Journal
  • DOT Space Hero's Journal
  • Building a browser game.
  • IcedCrow's Dev Journal
  • BigGiantHead's Journal
  • Richards Software Ramblings
  • Mikkel Staunsholm
  • The Wood under the Moon
  • ErihLee's Journal
  • Dialock's Journal
  • Meatsack's Workshop Journal
  • LouisMed's Journal
  • UncleVlad29's Journal
  • Hands On GameMaker:Studio
  • Project StickandCarrot
  • Casey Hardman's Journal
  • The SeaVax Journal
  • Howligan's Journal
  • Better Than Accounting
  • Death rays and scrapyards
  • Jsvcycling's Journal
  • Vilem Otte's Journal
  • Fight Club Games
  • TOT to Unity3D
  • LemCoop Development Journal
  • Dog Days Dev
  • The Journey of Taking Over Someone Else's Project
  • Gamedev info
  • Caveman
  • Project Z
  • A different way
  • Big Boss TV
  • Sunchasers development diary.
  • The Great Emoticon
  • Nothing Journal
  • Arkanong development blog
  • Building OllieBit
  • Kveitosphier -- Angelic Series (092113)
  • The Adventures of Mr. Fluffypants and Galaxy Lad
  • EraEngine
  • BallShooter Dev.
  • slayemin's Journal
  • Shane C's Journal
  • 2DFriends
  • PanPan's Journal
  • 2d Game Creation
  • #GameDevIsWayMoreFun
  • Grand Strategy: Space War
  • mabulous techblog
  • Mippy's Beehive
  • The development of Voxel
  • Return of Spy Ghost Raider
  • Wunderpong
  • Living and working in Russia
  • Dumont's Journal
  • reenigne's Journal
  • The coming Onslaught
  • Too dumb to make it, too dumb to quit.
  • The Development Blog of Neuton Mouse
  • Brass Watch Games Development
  • Sky Battles - Follow the evolution
  • Kornner Studios
  • The Dev Journal
  • N.I.B.'s Journal
  • jph's itreationGAMES development journal
  • csliva's Journal
  • Ilya Suzdalnitski's Journal
  • Project North Dev Journal.
  • Pete's Journal
  • A Youngster's Development Journal
  • [Theoretical] Games that evolve from player input
  • NerdSushi's Journal
  • Only if [Beta] - Surreal Puzzle Game
  • Never Miss: Dev Journal
  • My SDL Adventure
  • montify's Journal
  • Battle City
  • The Seven Tides
  • Latte Deconstruction - A classic 2D platform game deconstructible
  • SeaCraft! – game development journal
  • exOfde's Journal
  • Nyphoon's Thrilling Quest for Release and Everything In-Between
  • Tutorial Doctor's Journal
  • Path Tracing Adventures
  • ferrous' Journal
  • Alex's Journey Through Game Development
  • Exploring, learning and failing
  • arka80's Journal
  • J Fixby
  • GrinnTech's Notes
  • Spectra - First Game Creation
  • Fortification Hills Studios
  • QuickSilverCarpet's Journal
  • Flappy Assassin is now available
  • Animated Skinned Meshes
  • Undergroundies Projects
  • From End to Beginning
  • ShadowKind Games DevLog
  • Code Snippets
  • The Inner Circle
  • EveronWorlds Ew FPS Online
  • bradleycooper11's Journal
  • The Journeycat's Handbook
  • russelvedcse's Journal
  • MadRockGames
  • Sergioni's Journal
  • Pixel Perfect blog
  • MacAfeeje's Eludiant Time:Starlit
  • Smeagol's Journal
  • chel's Journal
  • Flared Development Journal
  • Malkavian Assembly's Journal
  • OLD Lactose!'s Journal
  • Alurik's Journal
  • Dreaming of adventure
  • Jsvcycling's Tower Defense DevBlog
  • Truerror's Journey Through Insanity
  • Jordan Bonser's Indie Dev Journal
  • afraidofdark's Journal
  • Journal Ov Azathotep
  • Fallen Shadows
  • GTRACE
  • deadstip's Journal
  • showtime
  • Edward's Journal
  • LOST ORBIT Development
  • Raven_rs Journal
  • PNGs and Things
  • Ding! Games
  • ZeroBeat's Journal
  • Coding with OpenGL
  • Joe Gilliver - Black Shuck Audio Journal
  • Giallanon's Journal
  • Project Root
  • delagames' Journal
  • Saint Retro's Journal
  • Arch1eN's GameDev Adventures
  • Return of the Dodo's
  • Riuthamus's Freelance
  • lalilulelost's Journal
  • newtechnology's Journal
  • normoyle1993's Journal
  • Kiritsu Games
  • LariGuilger's Journal
  • Creating Spacemasters
  • Hedeic's Journal
  • dustArtemis ECS Framework
  • IKazma: The Development & Experience
  • SelenaMiller's Journal
  • Project Anera
  • Daath Galaxy Devlog
  • Exploring Programming
  • Wombat Hole
  • GoCatGo's Development Journal
  • JumpSmash Legend a 3D Badminton Simulation Mobile Game
  • The Cuboid Zone
  • Avengers UTD Chronicles
  • Xylvan's Journal
  • Jean-François Fortin's Journal
  • Parallel Development Log
  • Gregory's Development Journal
  • SynchingFeeling's Journal
  • FinalXIIISora's Journal
  • The Big Procedural Game Journal
  • GiTS' Journal
  • Sporniket's log - Game programming while having a busy life
  • 2Play's Developer Journal
  • Garrett Hoofman's Journal
  • Island Troll Tribes
  • int main
  • cyberspace009's Journal
  • Impossibru is nothing!
  • NineheadGenesha's Journal
  • Inside a Wicked Lair
  • Final´s Game-Dev
  • Stett's Journal
  • Madolite's Journal
  • My Game"The Alien On The Planet"
  • How to make a clone of Futile Tiles
  • A Dreamer's Notebook
  • AfricanThunder's Journal
  • Arikin's Journal
  • Sinvas_K's Journal
  • Procedural Worlds
  • Binary Cats
  • Burnt Dragon's Journal
  • Washu's Journal
  • imoogiBG's Journal
  • Eck's Journal - Still Flying
  • Thaumaturge's Journal
  • ryan20fun's Journal of Rasterisation
  • Xaer0's Journal
  • The Week of Awesome II
  • The week of awesome II - shadowisadog
  • 0sok's Journal
  • Making of: Acclimate Engine
  • Misantes' Journal
  • The Week of Awesome II Herd of Nerd Star Participation
  • New Syntax blog for Week-of-Awesome-II
  • Captain Coffee's Journal
  • WoA II Journal
  • Jack & Francis's Week Of Awesome II
  • Erik Rufelt's Journal
  • Week of Awesome II
  • Xai's Awesome Living Toys
  • Week of Awesome II dev journal
  • WoA - My first gamejam
  • The Last Toy in the Toy Box
  • Extremely Usefull Bits
  • GeoffreyS' Journal
  • Jurassic Park Aftermath
  • Project PX
  • H.A.C.K. - Development Journal
  • ajm113's Journal
  • LV-341B
  • Archmage Rises
  • Stormynature's Miscellanea
  • Hierarchical subdivision
  • Radiant Engine Development
  • "Barricade"
  • New New Things
  • Librexus
  • mtlk's Journal
  • EmpiresInRuins' TD Journal
  • Collectible Card Game + Commercial Sim = Awesome
  • Legend of Grimrock 2 Review
  • Dr.John's Journal
  • Gorogorosama vs GameDev
  • Ironbane Devlog #1
  • Game News
  • PowerShell Games
  • ODMO - puzzle game - android release
  • Gaiiden's Journal^2
  • Gaiiden's Journal
  • Gaiiden's Journal
  • Debugging Diaries
  • General Thoughts
  • Captain's Log
  • Orangepixel's Journal
  • LAURENT*'s Journal
  • the game
  • fakhirs's Journal
  • A sound guy making a game.
  • Sisofys' Journal
  • Browser Scent
  • AuroraRL
  • Manager of Hell
  • Tales from the Engine's Core
  • Nemo Persona
  • victoriaadams02's Journal
  • Rico's Development Log
  • Funky Monkey Studios Dev Blog (French)
  • Fear the Light: The Path to Playable
  • Astari
  • mousetails RPG
  • Developing a JRPG
  • goldmoelly's Journal
  • Goblin War
  • Phaetonium's Journal
  • Flame
  • Reactor Engine
  • Boardspace.net Game AI Journal
  • TheComet's Journal
  • Negazina and his shenanigans
  • Realm Crawler Development Journal
  • Becoming an indie
  • The Wizards Blog
  • SIMSpace 8.0
  • Educating an artist
  • Michael Staud's Journal
  • YanimStudio's Journal
  • Adventures into Unreal Engine & indie dev
  • GamzTV
  • Blacksea Odyssey Devlog
  • The Furious Ape Journal
  • Feras' Journal
  • SnailLife
  • Ray Tracing Devlog
  • hgoel0974's Journal
  • GameGeezer's Journal
  • Pavloid game
  • cozzie's Journal
  • Han''s Quest Journal
  • Lost Repo
  • DevBlog: Wolves at the Door
  • victorx's Journal
  • TheChubu's Journal
  • Mobile Game Dev Journal
  • Protheus Engine
  • ducanhtuvu's Journal
  • YGGDRASIL STUDIO's Journal
  • Skinned Mesh/Skeletal Animation Editor in D3D11
  • Proceedings of TheUnimake
  • Inko makes Prototypes
  • Caldera Games' Journal
  • Machine Made
  • YAAG
  • Xam'n'Eggs
  • Developer Journal
  • Game Tale
  • Jygle's Journal
  • Sol-Ark's developer journal
  • Blender - skinned meshes and animation DirectX export
  • Night Lone Engine: Journal and progress
  • Vortex Game Studios
  • williamssara005's Journal
  • Onigiri Flash's Journal
  • The Week of Awesome III
  • Simmie's Journal
  • The Dark Prognosticus
  • Game explorations
  • Danmaku no Kyojin
  • Epicelitedude's Journal
  • Thinking about treasure lately
  • IYP's Graphics Journal
  • My Stuff
  • Trades with Spirals Development
  • WoA 3 (2015)
  • Seven Spells Of Destruction Development Journal
  • Battleships Development
  • An arcade console developer's Journal
  • Spidi, Magic Item Tech Journal
  • Galactic Adventures
  • Week of Awsome III journal
  • TeamTeamEric's Journal
  • From The Forth Dev journal
  • Speed's Progress
  • Gooey's Journal
  • Week of Awesome III
  • ArThor's Journal
  • hu3 team - WoA III
  • Inside the blizzard
  • JamCats' Week Of Awesome III
  • Our Week of Awesome Project
  • Lich Dev Log
  • Single-Handed Game Dev
  • GTEntertainment's Journal
  • Soulwielder Dev Journal (Week of Awesome III)
  • MarioLuigiMan's Journal
  • WoA3 - Still Flying
  • Calinabris' Journal
  • DKoding's Journal - Koding Nights
  • alexokita's Journal
  • TBFC's Week Of Awesome III Dev Journal
  • My First Game !!
  • Dusters Devblog
  • Bigdog57's Journal
  • ????? ???????? ????? ?????? 01283377353 + 35710008 ???? ????? ????? ????????
  • El Tomba - Developer Diary
  • Starshard Dev Journal
  • alexmasen's Journal
  • bobbentz's Journal
  • Merc Tactics
  • WatsonTBK's Journal
  • Spiral Lords: Armada
  • Arms of Telos
  • Really Slick Blog
  • c++ SFML TEAL
  • A random Game
  • Creation of Zergification tech demo
  • Opiniocracy
  • Kill All Demons!
  • Moon Pub Games
  • KruSuPhy's Journal
  • KruSuPhy's Journal
  • Final Year
  • Monster Chronicles: Mobile Strategy RPG
  • Shinylane's OpenGL Journal
  • psychedelia smith's Journal
  • Conkoon's Journal
  • GE2015's Journal
  • We the Innovation
  • Engine development for fun and bachelors thesis
  • Farom Studio
  • Geometer's Apprentice
  • NavWorkshop
  • an unnamed youtube simulator
  • Eck's Star Citizen Efforts
  • Project Gift
  • opmania35's Journal
  • Westorm's Journal
  • What I did
  • Short rules for beginners in game dev
  • DEV - War of Kingdoms Pocket
  • MoonKiteTree's Journal
  • Tinus Tate's Journal
  • Fowl Flying
  • Memorial Trees: forget-me-not Journal
  • Fidelum Games
  • Hexmind's Journal
  • MVG Interactive
  • EXODUS - A New Age Dawns
  • OmnicidalStudios Akintoo Journal
  • Kingpin
  • iMini Development
  • Oblivion Wars Development Journal
  • devlion's Journal
  • 2D Platformer
  • Cleemo's Journal
  • Becoming the Lord of Dwarves
  • Rogue555's Journal
  • Not Yet Implemented
  • Prali Games
  • Multiplayer RPG dev diary
  • Venatus
  • AVaW2015's Journal
  • Faison92's Journal
  • ProcGen Journal
  • Sector0's Journal
  • P2p online's Journal
  • One Piece Ultimate War
  • Syrena's Journal
  • w32's Journal
  • Max-Green's Journal
  • [GBA] Kingdom of Twilight a retro rom
  • Gamescrye's Game Design Blog
  • GameDev.net Partners
  • Blend4Web Development Journal
  • STAR SHIFT
  • Sweat, tears and blood
  • Amanda/adamSnowflake's Journal
  • Unity Parkour Game
  • Lawnjelly's Journal
  • ProcFxGen's Journal
  • dpadam450's Journal
  • Sungazer Software Development Log
  • A New Developer's Journey
  • De Feet - a 3D interactive story RPG
  • V0xel Sp4ce Development
  • yoshi_t's Journal
  • Strategy Empire's Journal
  • VikingVRStudio's Journal
  • Towards The Pantheon Devlogs
  • GameArch
  • SilviuShaders' WoA Dev Journal
  • Frango Digital Log - The Week of Awesome IV
  • AlienCore's Journal
  • Mousetails WoA 4 journal
  • Mind of Khan
  • XycsoscyX's Journal
  • The Week of Awesome IV
  • WOA 2016 | Team Bytetroll
  • EarthBanana's Journal
  • GameDev.net Staff Blog
  • Unnamed Turn-Based Strategy
  • "Popular" progress.
  • 3D, AI, procedural generation and black jack
  • Avalander's Journal
  • Andrey Macritskiy
  • Drone Combat Devlog
  • Rog Games' Journal
  • The Xoid Isometric Survival... from the start
  • Journal of Gruffler
  • Project Tidalwave
  • Ultra Kai's Graphics Journal
  • MY FIRST INDIE GAME! :D
  • DoomedGaming
  • V-Play Cross-Platform Game Engine
  • Bacterius' WoA Feedback
  • Project Mistwrapped
  • Game Development Adventures
  • The Achilles Journal
  • The Cptn's first voyage
  • A short Journey over Zeno's Bridge
  • MagForceSeven's Journal
  • TheCaptainSly's Journal
  • School and Mazes
  • Development of My Own Civilization
  • Richie2Pixel's Journal
  • khaniiuc's Journal
  • saadtaame's Journal
  • First Complete Game
  • Turn-based strategy about agriculture
  • Systemic Games
  • anyone needs a 3d modeller?
  • Vidar DevBlog
  • Vertexwahn's Journal
  • Opportunities in AR/VR
  • AngleWyrm Studios
  • "Project SpeceVille" Developer Journal
  • Floatlands devblog
  • Game Creation Journal: Midievalry
  • Arceneaux's Log
  • ViciousGaming's Journal
  • ACE Team's Journal
  • yps_sps' Journal
  • Alchemist
  • Project Life
  • GrindQuest
  • Paninairo's Journal
  • JacPete's Super Mage World
  • Resilients Journey
  • Who is Who? Dev blog
  • Multiverse: Cosmic Conquest TCG Development Journal
  • Aggroblakh's Journal
  • Fight the ADHD
  • The Time Rider Community Journal
  • Too few shopkeeper games!
  • VFX Highlights & Games
  • lougv22's Journal
  • First Impact: Rise of a Hero's Journal
  • Labraid's Journal
  • BattleForte Game DevLog
  • WinterDragon Says Print("hello")
  • Ascension Game Journal
  • bogosaur's great journal of wisdom.
  • AurumDust journal
  • Progress on The Last Score
  • BrykuTheDev's Journal
  • Developing a good looking story to make it a game
  • Rebirth of a classic card game
  • Ships vs Sea Monsters. From sketches to final edition
  • SquaserZ - The Devlog
  • Dev Quest With AriiMoose
  • ohoyy056's Journal
  • TheLastKind's Journal
  • ohoyy070's Journal
  • essaywriting
  • Idea To A Game
  • XyraniaDev's journal
  • ohoyy082's Journal
  • Pirate Dawn Universe
  • Deep Waters Devblog
  • brigittepetrie's Journal
  • GoldbarGames' Journal
  • Kickstarter/Greenlight Dev Journals/Tips/Insights
  • Delphinity
  • Big List of Mobile Game Reviews [UPDATED DAILY]
  • 0day's Blog
  • DuelingDevblogs
  • Jaden's Blog
  • Tee_Hunter
  • GDC 2017
  • Voxelaxy
  • Power Pong Devblog
  • Spinbot's Blog
  • SerikASA's Blog
  • Brewing the tee
  • Johnnymorgan's Blog
  • Blog #1 - You can't push a rope!
  • Korvas' Game Dev
  • Tough Story Volume I - Big Hell
  • VirtualRN's Blog
  • Game Blog
  • Dadou666's Blog
  • SHIRO Developers Log
  • Star Heritage
  • Bluword
  • Appodeal Blog
  • juegostudios
  • saraedward's Blog
  • shirawinget's Blog
  • Baro's Beginning
  • phil67rpg's Blog
  • Video Game Sound by Olivier Girardot
  • Deep Worked Blog
  • Swim Out
  • Bypassed - DevBlog
  • Muisca's Blog
  • AlexHoratio's Blog
  • Hell Warders
  • hydra1's Krypton Development Team
  • tommorow's Blog
  • ¿How to do Game?
  • My 1st GDC: Recap
  • Beyonce's Blog
  • donislawdev's Blog
  • Creating Complexity
  • dovodi's Blog
  • Stitched Showcase
  • itSeez3D Avatar SDK
  • 40Ggames' Blog
  • GamerX1221's Blog
  • HunterGaming
  • Nicolas Bertoa's Blog
  • Masters VR
  • PiN
  • Ben's Appallingly Humble Blog
  • Starfall Tactics
  • Ermergerd Ent's Blog
  • Secure Vend LLC's Blog
  • Cascapadia
  • Last Regiment Dev Blog
  • sarwar's Blog
  • Spaceguard 80
  • appguruz's Blog
  • ios\Android games promotions!
  • Forgiveness devblog
  • The creative industries digital game.
  • xboxoneya's Blog
  • Untitled: My journey with LibGDX and bullet hell
  • Block Builder Update Blog
  • noisechip's Blog
  • Call of Avatar
  • behc's Blog
  • Terrible Mess Games
  • polyfrag's Blog
  • polyfrag's Blog
  • Dr. Lexus Blog
  • Jungle Tag by The Kid Can Drive
  • polyfrag's Blog
  • Wormhole Devlog
  • Age of Dark
  • Trym Studios' Concept Blog
  • PSG's Blog
  • sinopgames
  • Space Warfare Blog
  • EdenAeternum's Blog
  • APPTUTTi's Blog
  • SlammaJammaMovie's Blog
  • Village Monsters Dev Diary
  • Rox087's Blog
  • THEDARKMEME's Blog
  • Progorion's Blog
  • lexnewgate's Blog
  • Starminer7Z7 of Fullpower's Blog
  • Progorion's Blog
  • DualTD
  • OandO's Blog
  • From UltDip to ...
  • io games
  • .io Games
  • JohnTheRipper88's Insight and Ramblings
  • Moosehunt
  • VBexEngine
  • Games Development Notes
  • Eart - a similar to an rpg but with typical elements of a bullet hell games
  • /~ 카톡 kk4678 ~/ 경주 출장안마-경주 출장만남-경주 출장마사지-경주 출장서비스/~ 카톡 kk4678 ~/
  • Valley of Crescent Mountain
  • Charly Men's BIZARRE
  • 울산오피 ○1○《⑻⑼⑷⑺)⑥⑥④⑧ 세계일등클래스
  • 청담안마 OlO⇔2816⇔2526 〃최저가 청담안마방 청담역안마 청담안마시술소 청담안마추천 청담역안마가격 청담안마위치 청담동안마방 청담동안마추천 청담안마예약
  • 인천출장샵
  • ⅸ강원도출장샵 阝카톡gg882출장콜걸.홈피 kiss45.COM출장안마/ 출장마사지/출장샵/출장업소/콜걸연락처/섹파/콜걸아가씨카톡/업소연락처.
  • Michael Zhou
  • が대구출장샵阝카톡gg882출장콜걸.홈피 kiss45.COM출장안마/ 출장마사지/출장샵/출장업소/콜걸연락처/섹파/콜걸아가씨카톡/업소연락처.
  • Battle of Millenia Update #1
  • ⅸ아산출장샵 阝카톡gg882출장콜걸.홈피 kiss45.COM출장안마/ 출장마사지/출장샵/출장업소/콜걸연락처/섹파/콜걸아가씨카톡/업소연락처.
  • A Passive Gamer's Blog
  • Newbie Gamer
  • Android, the most popular mobile platform throughout the world these days
  • Aggressive Gaming
  • 경마사이트추천 ⟡->『 AA77.ME 』<-⟡인터넷경마사이트
  • The Yii Development Framework for fast, extremely professional performance
  • Psychology in game design
  • Check out my Game!
  • Hell Warders Development blog
  • Wildlife control service
  • EP (A Platform Game)
  • Outentiq
  • See Gee Eye
  • Jenny's Magical Adventure
  • Last Hills Teaser Trailer (Horror Game) - Red Projekt -
  • Want to help make a game
  • New Game - ArcAngel is released.
  • Corona Labs Blog
  • Java&Python game development
  • How to write outstanding game reviews
  • Exactly how Does the Euromillions Millionaire Raffle Work?
  • puppysss
  • World Game Info
  • Rick Henderson And The Artifact Of Gods
  • Mobile Application Development Today
  • Runica: The Ancient Dungeon
  • Benefits of Mobile Application Development
  • Enterprise App Development you need to know
  • Mobile Application Development
  • krkrgames
  • My First Success - Dev Blog
  • Alchemica
  • Elemento : Development Blog
  • Remote Jobseekers
  • Bird With Toes Development Log
  • ェ웅촌출장마사지 << O①o.28O4.3885 >>ウ출장콜걸 업소핫한시원 웅촌출장마사지
  • Forward Creating
  • ギ일산출장마사지 << ㅇIㅇ / ②8ㅇ④ / ③⑧⑧⑤ >>キ빠끈신속 정확선입금 NO24시간 일산출장마사지
  • ゴ여천동출장마사지 ☎ 0①ⓞ.2⑧O④.③885 コ입니다.출장 콜걸뜨거운핫한 여천동출장마사지
  • ズ매곡동출장마사지 << ㅇ①ㅇ / ②⑧ⓞ④ / 3885 >>ス시원빠끈 신속후불선입금 NO 매곡동출장마사지
  • ℳ 제주출장샵 ↘☎예약안내톡↔MK53☎≡사이트예약WWW.HIT799.COM≡【히트외국인출장만남】

Found 24 results

  1. I was avoiding posting here because there's plenty of information on triangulation out there, but I'm beginning to find it more of a curse than a blessing due to how specified my case is and how many triangulation algorithms there are. I have 2D potentially-concave polygons that are defined as an ordered list of vertices in clockwise order. These vertices define the hull or outline of the shape - no vertices are inside the polygon. I was looking at ear-clipping, but the order of complexity seems like it could be improved with a better algorithm. Anyone have any good resources or personal knowledge specific to my case?
  2. For example I have 6000 entities on a 2D map and I want to get about 180 which are on my player's screen. When my player is moving new entities may appear on the map, at the same time some entities or enemies die so they disappear. I used to clear the entire spatial hash and insert everything again a few times a second. But I am thinking maybe it is better to only update those entities that change on the map, the number of changes may be huge though, but still, compared to the number of entities on the map it is still small. I am just not sure if this is worthy or not.
  3. Hello I've taken it upon myself to finally start learning how game engines work by making a toy engine myself. I've never done any game programming or anything like that but as an avid gamer and someone with a physics degree I've always wondered how these things are done. Today I implemented a basic spring force using Hooks Law. I was surprised however when over a short time span, maybe 30s, my default integrator of Velocity Verlet caused the spring's motion to escalate wildly. I tried stepping down to Symplectic Euler and the motion became normal. At first I was thinking there might be a bug in my code, but I can't see one so now I'm wondering if the good people of this forum might help shed some light on this. It does not make any sense to me that Symplectic Euler would be a better integrator than Velocity Verlet. Both are time reversible and symplectic, but Velocity Verlet is second order accurate. I've been writing up what I learn on a little blog, feel free to check it out to see my current understanding of these methods Symplectic Euler Velocity Verlet Code Symplectic Euler void SymplecticEuler::Solve( const NetForceAccumulator& net_force_accumulator, const std::vector<std::shared_ptr<PhysicsEntity>> &entity_ptrs, const std::shared_ptr<PhysicsEntity> entity_ptr) { Vector3Gf xi = entity_ptr->GetPosition(); Vector3Gf vi = entity_ptr->GetVelocity(); GLfloat mass = entity_ptr->GetMass(); Vector3Gf F; F.setZero(); net_force_accumulator.ComputeNetForce(entity_ptrs,entity_ptr,F); Vector3Gf vf = vi + m_dt*(1/mass)*F; Vector3Gf xf = xi + m_dt*vf; entity_ptr->SetNextPosition(xf); entity_ptr->SetNextVelocity(vf); }; Velocity Verlet void Verlet::Solve( const NetForceAccumulator& net_force_accumulator, const std::vector<std::shared_ptr<PhysicsEntity>> &entity_ptrs, const std::shared_ptr<PhysicsEntity> entity_ptr) { Vector3Gf xi = entity_ptr->GetPosition(); Vector3Gf vi = entity_ptr->GetVelocity(); GLfloat mass = entity_ptr->GetMass(); Vector3Gf Fi,Ff,ai,xf,af,vf; Fi.setZero(); net_force_accumulator.ComputeNetForce(entity_ptrs,entity_ptr,Fi); ai = (1/mass)*Fi; xf = xi + m_dt*vi + 0.5f*m_dt*m_dt*ai; entity_ptr->SetPosition(xf); // Load xf into position slot for computing F(x(t+h)) Ff.setZero(); net_force_accumulator.ComputeNetForce(entity_ptrs,entity_ptr,Ff); // Compute F(x(t+h)) af = (1/mass)*Ff; vf = vi + 0.5f*m_dt*(ai + af); entity_ptr->SetPosition(xi); // Load xi back into position slot as to not affect force calulations for other entities entity_ptr->SetNextPosition(xf); entity_ptr->SetNextVelocity(vf); }; Spring force void SpringForceGenerator::AccumulateForce( const GLfloat k, const GLfloat l0, const std::shared_ptr<PhysicsEntity> entity1_ptr, const std::shared_ptr<PhysicsEntity> entity2_ptr, Vector3Gf &F) const { Vector3Gf x1 = entity1_ptr->GetPosition(); Vector3Gf x2 = entity2_ptr->GetPosition(); Vector3Gf n = x2 - x1; GLfloat l = n.norm(); n = n/l; F += k*(l - l0)*n; } Thanks!
  4. Hello! I was looking for a data-structure that is meant to handle sorting of 3d-objects, where every object, within trees or child trees, will potentially move/change their position, hence no static objects. I am mainly curious if there is anything similar to an octree with a cheap update-complexity, because updating one element takes quite some iterations, e.g. recursively entering parent octrees, checking whether they fit in them or not... I considered to roll out a 3d spatial hashing instead, as octrees' precision seems quite unimportant for my project as well. It would seem to be easier to update compared than an octree. Why do I worry about performance? I really just would like to use the semantically most fitting structure. I often hear, quad- and octrees shine with static objects, because they allow a high precision via their branching of smaller trees within each tree. On the other hand, I totally do not need this, there is no complex collider either, just cubes. I might be totally wrong on my performance-observations, though! Summing it up, what would you recommend/use for a 3d-world with simple cube-colliders where every object is dynamic? Thanks for your time! Edit: Fixed terribly screwed sentences that were not even complete, sorry!
  5. I googled around but are unable to find source code or details of implementation. What keywords should I search for this topic? Things I would like to know: A. How to ensure that partially covered pixels are rasterized? Apparently by expanding each triangle by 1 pixel or so, rasterization problem is almost solved. But it will result in an unindexable triangle list without tons of overlaps. Will it incur a large performance penalty? B. A-buffer like bitmask needs a read-modiry-write operation. How to ensure proper synchronizations in GLSL? GLSL seems to only allow int32 atomics on image. C. Is there some simple ways to estimate coverage on-the-fly? In case I am to draw 2D shapes onto an exisitng target: 1. A multi-pass whatever-buffer seems overkill. 2. Multisampling could cost a lot memory though all I need is better coverage. Besides, I have to blit twice, if draw target is not multisampled.
  6. Hi, I was reading Game AI Pro how they implemented Supreme Commander path finding and came to one question. For the integration of cost field they are using Eikonal equation for traversing the areas. They recommended Fast Iterative Method and it's parallel version for solving this equation. However in all basic tutorials of flow field navigation that I found for integrating of the cost field is used simple grass/brush fire algorithm. My question is what would be the difference if they used in the game just grass fire algorithm? I guess the reason was some quality/performance trade of. Fortunately the Fast Iterative Method is very easy to implement so I can compare the performance, but what I don't understand is, what is the "quality" benefit.
  7. Hello Game Dev! Sorry if I'm beating a dead horse with this thread, but I'm making a fast paced action networked game, and I'm having trouble wrapping my head around some things. Namely, how should the server handle ticking player input packets that arrive at the server at an incorrect simulation steps, as a result of network lag, lag jitter, and inevitably imperfect time synchronization algorithms. I'll start by outlining my understandings, and I would be eternally grateful to anyone who can shed some light on what I'm missing. For the sake of simplicity, I'm assuming the client has synchronized to the server's clock in some respect, and bundles a "suggested simulation step" that the input ought to be executed on by the server. I've read a few threads here, and a lot of the documentation that exists out there. As far as I can tell, there are 2 main methods to rectify inputs arriving at the server at incorrect times: method 1. allow the server to rewind time and re simulate the game for late arriving input packets. This would allow late inputs to still have a chance of being simulated. The server would only allow rewinding to some maximum amount of time, to help curb cheating, and undesirably large jumps in the simulation for other players. method 2. synchronize the client's clock forward of the server's clock by half of round trip time (RTT/2), plus some constant (c) to account for jitter in lag. So in total, (RTT/2) + c. Then, when the input arrives at the server, it arrives on time most of the time. If the input arrives earlier than it needs to, it can be buffered at the server until the appropriate simulation step to execute the input. As far as I can tell, method 1 has the benefit of minimizing any sort of input buffering for players with good pings, but is a very heavy handed solution, and might cause frequent jumps in a given client's simulation. Method 2 seems to be a nice simple solution, would provide nice smooth simulation, but introduces a sizable lag for a given player's input to be seen by other players. I suppose I have 3 main questions on this topic, and I would be a very happy boy if I could get some help on them: 1. Is method 1 a widely used approach? It seems like it introduces a massive amount of work, as a result of the server and clients having to correct their simulation state, all the while introducing potentially jittery movement. 2. I get that method 2 can buffer early input packets, but how does it account for late arriving input packets? I get that the server should acknowledge the late input packet in some way to let the client know it should adjust its simulation time, but would it drop that late arrived input? would it execute it, but at the CURRENT frame? What if there are 2 or more late inputs? 3. Am I missing any other solution? Are these 2 methods the widely used methods for handling state and input on the server? I can imagine a combination solution of method 1 and method 2, is this advisable? Thanks in advance for all of your time! I feel very stuck on this, and will send all the karma your way for any help. In the mean time, I'll keep reading forum posts, to see if this has come up before. *edit* wording.
  8. I'm looking for a broad phase algorithm for brush-based worlds. I also need an algorithm for determining which areas of said world are visible from the view frustum. The Id tech engines in the 90's used BSP's for broad phase collision and PVS for visibility. Doom 3 in 2004 kept BSP's for collision but switched to portals for visibility. Its now 2017. I'm wonder what approach should be taken today?
  9. I have just noticed that, in quake 3 and half - life, dynamic models are effected from light map. For example in dark areas, gun that player holds seems darker. How did they achieve this effect ? I can use image based lighting techniques however (Like placing an environment probe and using it for reflections and ambient lighting), this tech wasn't used in games back then, so there must be a simpler method to do this. Here is a link that shows how modern engines does it. Indirect Lighting Cache It would be nice if you know a paper that explains this technique. Can I apply this to quake 3' s light map generator and bsp format ?
  10. Hi, I am trying to implement correct user experience for rotation tool in my game engine. I want it visually behave like the same tool in Maya or Unity. When I rotate an object, rotation tool should also rotate, BUT its axis should always be on the near camera plane and never go to another side of the tool like described in 2 first attached screenshots from Unity. You can see here that X axis (red) go to the up part of the tool instead of the back. The same for Y and Z axis. Currently I implement something similar, but my code has huge limitation - it gave me correct quaternion for rotation, BUT to have correct axis alignment I must rewrite my existing tool rotation, so I cannot accumulate rotation and I cannot implement correct visual experience for tool. (See next 2 screenshots). As you can see there is no difference between visual tool representation despite I rotate an object itself. Here is code I am using currently: /// <summary> /// Calculate Quaternion which will define rotation from one point to another face to face /// </summary> /// <param name="objectPosition">objectPosition is your object's position</param> /// <param name="targetPosition">objectToFacePosition is the position of the object to face</param> /// <param name="upVector">upVector is the nominal "up" vector (typically Vector3.Y)</param> /// <remarks>Note: this does not work when objectPosition is straight below or straight above objectToFacePosition</remarks> /// <returns></returns> public static QuaternionF RotateToFace(ref Vector3F objectPosition, ref Vector3F targetPosition, ref Vector3F upVector) { Vector3F D = (objectPosition - targetPosition); Vector3F right = Vector3F.Normalize(Vector3F.Cross(upVector, D)); Vector3F backward = Vector3F.Normalize(Vector3F.Cross(right, upVector)); Vector3F up = Vector3F.Cross(backward, right); Matrix4x4F rotationMatrix = new Matrix4x4F(right.X, right.Y, right.Z, 0, up.X, up.Y, up.Z, 0, backward.X, backward.Y, backward.Z, 0, 0, 0, 0, 1); QuaternionF orientation; QuaternionF.RotationMatrix(ref rotationMatrix, out orientation); return orientation; } And I am using some hack to correctly rotate all axis and keep them 90 degrees to each other: private void TransformRotationTool(Entity current, Camera camera) { var m = current.Transform.GetRotationMatrix(); if (current.Name == "RightAxisManipulator") { var rot = QuaternionF.RotateToFace(current.GetRelativePosition(camera), Vector3F.Zero, m.Right); rot.Z = rot.Y = 0; rot.Normalize(); current.Transform.SetRotation(rot); } if (current.Name == "UpAxisManipulator") { var rot = QuaternionF.RotateToFace(current.GetRelativePosition(camera), Vector3F.Zero, m.Up); rot.X = rot.Z = 0; rot.Normalize(); current.Transform.SetRotation(rot); } if (current.Name == "ForwardAxisManipulator") { var rot = QuaternionF.RotateToFace(current.GetRelativePosition(camera), Vector3F.Zero, m.Forward); rot.X = rot.Y = 0; rot.Normalize(); current.Transform.SetRotation(rot); } if (current.Name == "CurrentViewManipulator" || current.Name == "CurrentViewCircle") { var billboardMatrix = Matrix4x4F.BillboardLH( current.GetRelativePosition(camera), Vector3F.Zero, camera.Up, camera.Forward); var rot = MathHelper.GetRotationFromMatrix(billboardMatrix); current.Transform.SetRotation(rot); } } As you can see I am zeroing 2 of 3 axis and renormalize quaternion to keep axis perpendicular to each other. And when I try to accumulate rotation, I am receiving completely incorrect result. On the last image you see what happening with my tool when I try to apply rotation to face with some basic rotation. This issue is driving me crazy. Could anyone help me to implement correct behaviour?
  11. What exactly is an Octree? If you're completely unfamiliar with them, I recommend reading the wikipedia article (read time: ~5 minutes). This is a sufficient description of what it is but is barely enough to give any ideas on what it's used for and how to actually implement one. In this article, I will do my best to take you through the steps necessary to create an octree data structure through conceptual explanations, pictures, and code, and show you the considerations to be made at each step along the way. I don't expect this article to be the authoritative way to do octrees, but it should give you a really good start and act as a good reference. Assumptions Before we dive in, I'm going to be making a few assumptions about you as a reader: You are very comfortable with programming in a C-syntax-style language (I will be using C# with XNA). You have programmed some sort of tree-like data structure in the past, such as a binary search tree and are familiar with recursion and its strengths and pitfalls. You know how to do collision detection with bounding rectangles, bounding spheres, and bounding frustums. You have a good grasp of common data structures (arrays, lists, etc) and understand Big-O notation (you can also learn about Big-O in this GDnet article). You have a development environment project which contains spatial objects which need collision tests. Setting the stage Let's suppose that we are building a very large game world which can contain thousands of physical objects of various types, shapes and sizes, some of which must collide with each other. Each frame we need to find out which objects are intersecting with each other and have some way to handle that intersection. How do we do it without killing performance? Brute force collision detection The simplest method is to just compare each object against every other object in the world. Typically, you can do this with two for loops. The code would look something like this: foreach(gameObject myObject in ObjList) { foreach(gameObject otherObject in ObjList) { if(myObject == otherObject) continue; //avoid self collision check if(myObject.CollidesWith(otherObject)) { //code to handle the collision } } } Conceptually, this is what we're doing in our picture: Each red line is an expensive CPU test for intersection. Naturally, you should feel horrified by this code because it is going to run in O(N^2) time. If you have 10,000 objects, then you're going to be doing 100,000,000 collision checks (hundred million). I don't care how fast your CPU is or how well you've tuned your math code, this code would reduce your computer to a sluggish crawl. If you're running your game at 60 frames per second, you're looking at 60 * 100 million calculations per second! It's nuts. It's insane. It's crazy. Let's not do this if we can avoid it, at least not with a large set of objects. This would only be acceptable if we're only checking, say, 10 items against each other (100 checks is palatable). If you know in advance that your game is only going to have a very small number of objects (i.e., asteriods), you can probably get away with using this brute force method for collision detection and ignore octrees altogether. If/when you start noticing performance problems due to too many collision checks per frame, consider some simple targeted optimizations: 1. How much computation does your current collision routine take? Do you have a square root hidden away in there (ie, a distance check)? Are you doing a granular collision check (pixel vs pixel, triangle vs triangle, etc)? One common technique is to perform a rough, coarse check for collision before testing for a granular collision check. You can give your objects an enclosing bounding rectangle or bounding sphere and test for intersection with these before testing against a granular check which may involve a lot more math and computation time. Use a "distance squared" check for comparing distance between objects to avoid using the square root method. Square root calculation typically uses the newtonian method of approximation and can be computationally expensive. 2. Can you get away with calculating fewer collision checks? If your game runs at 60 frames per second, could you skip a few frames? If you know certain objects behave deterministically, can you "solve" for when they will collide ahead of time (ie, pool ball vs. side of pool table). Can you reduce the number of objects which need to be checked for collisions? A technique for this would be to separate objects into several lists. One list could be your "stationary" objects list. They never have to test for collision against each other. The other list could be your "moving" objects, which need to be tested against all other moving objects and against all stationary objects. This could reduce the number of necessary collision tests to reach an acceptable performance level. 3. Can you get away with removing some object collision tests when performance becomes an issue? For example, a smoke particle could interact with a surface object and follow its contours to create a nice aesthetic effect, but it wouldn't break game play if you hit a predefined limit for collision checks and decided to stop ignoring smoke particles for collision. Ignoring essential game object movement would certainly break game play though (ei, player bullets stop intersecting with monsters). So, perhaps maintaining a priority list of collision checks to compute would help. First you handle the high priority collision tests, and if you're not at your threshold, you can handle lower priority collision tests. When the threshold is reached, you dump the rest of the items in the priority list or defer them for testing at a later time. 4. Can you use a faster but still simplistic method for collision detection to get away from a O(N^2) runtime? If you eliminate the objects you've already checked for collisions against, you can reduce the runtime to O(N(N+1)/2), which is much faster and still easy to implement. (technically, it's still O(N^2)) In terms of software engineering, you may end up spending more time than it's worth fine-tuning a bad algorithm & data structure choice to squeeze out a few more ounces of performance. The cost vs. benefit ratio becomes increasingly unfavorable and it becomes time to choose a better data structure to handle collision detection. Spatial partitioning algorithms are the proverbial nuke to solving the runtime problem for collision detection. At a small upfront cost to performance, they'll reduce your collision detection tests to logarithmic runtime. The upfront costs of development time and CPU overhead are easily outweighed by the scalability benefits and performance gains. Conceptual background on spatial partitioning Let's take a step back and look at spatial partitioning and trees in general before diving into Octrees. If we don't understand the conceptual idea, we have no hope of implementing it by sweating over code. Looking at the brute force implementation above, we're essentially taking every object in the game and comparing their positions against all other objects in the game to see if any are touching. All of these objects are contained spatially within our game world. Well, if we create an enclosing box around our game world and figure out which objects are contained within this enclosing box, then we've got a region of space with a list of contained objects within it. In this case, it would contain every object in the game. We can notice that if we have an object on one corner of the world and another object way on the other side, we don't really need to, or want to, calculate a collision check against them every frame. It'd be a waste of precious CPU time. So, let's try something interesting! If we divide our world exactly in half, we can create three separate lists of objects. The first list of objects, List A, contains all objects on the left half of the world. The second list, List B, contains objects on the right half of the world. Some objects may touch the dividing line such that they're on each side of the line, so we'll create a third list, List C, for these objects. We can notice that with each subdivision, we're spatially reducing the world in half and collecting a list of objects in that resulting half. We can elegantly create a binary search tree to contain these lists. Conceptually, this tree should look something like so: In terms of pseudo code, the tree data structure would look something like this: public class BinaryTree { //This is a list of all of the objects contained within this node of the tree private List m_objectList; //These are pointers to the left and right child nodes in the tree private BinaryTree m_left, m_right; //This is a pointer to the parent object (for upward tree traversal). private BinaryTree m_parent; } We know that all objects in List A will never intersect with any objects in List B, so we can almost eliminate half of the number of collision checks. We've still got the objects in List C which could touch objects in either list A or B, so we'll have to check all objects in List C against all objects in Lists A, B & C. If we continue to sub-divide the world into smaller and smaller parts, we can further reduce the number of necessary collision checks by half each time. This is the general idea behind spatial partitioning. There are many ways to subdivide a world into a tree-like data structure (BSP trees, Quad Trees, K-D trees, OctTrees, etc). Now, by default, we're just assuming that the best division is a cut in half, right down the middle, since we're assuming that all of our objects will be somewhat uniformly distributed throughout the world. It's not a bad assumption to make, but some spatial division algorithms may decide to make a cut such that each side has an equal amount of objects (a weighted cut) so that the resulting tree is more balanced. However, what happens if all of these objects move around? In order to maintain a nearly even division, you'd have to either shift the splitting plane or completely rebuild the tree each frame. It'd be a bit of a mess with a lot of complexity. So, for my implementation of a spatial partitioning tree I decided to cut right down the middle every time. As a result, some trees may end up being a bit more sparse than others, but that's okay -- it doesn't cost much. To subdivide or not to subdivide? That is the question. Let's assume that we have a somewhat sparse region with only a few objects. We could continue subdividing our space until we've found the smallest possible enclosing area for that object. But is that really necessary? Let's remember that the whole reason we're creating a tree is to reduce the number of collision checks we need to perform each frame -- not to create a perfectly enclosing region of space for every object. Here are the rules I use for deciding whether to subdivide or not: If we create a subdivision which only contains one object, we can stop subdividing even though we could keep dividing further. This rule will become an important part of the criteria for what defines a "leaf node" in our octree. The other important criteria is to set a minimum size for a region. If you have an extremely small object which is nanometers in size (or, god forbid, you have a bug and forgot to initialize an object size!), you're going to keep subdividing to the point where you potentially overflow your call stack. For my own implementation, I defined the smallest containing region to be a 1x1x1 cube. Any objects in this teeny cube will just have to be run with the O(N^2) brute force collision test (I don't anticipate many objects anyways!). If a containing region doesn't contain any objects, we shouldn't try to include it in the tree. We can take our subdivision by half one step further and divide the 2D world space into quadrants. The logic is essentially the same, but now we're testing for collision with four squares instead of two rectangles. We can continue subdividing each square until our rules for termination are met. The representation of the world space and corresponding data structure for a quad tree would look something like this: If the quad tree subdivision and data structure make sense, then an octree should be pretty straight forward as well. We're just adding a third dimension, using bounding cubes instead of bounding squares, and have eight possible child nodes instead of four. Some of you might wonder what should happen if you have a game world with non-cubic dimensions, say 200x300x400. You can still use an octree with cubic dimensions -- some child nodes will just end up empty if the game world doesn't have anything there. Obviously, you'll want to set the dimensions of your octree to at least the largest dimension of your game world. Octree Construction So, as you've read, an octree is a special type of subdividing tree commonly used for objects in 3D space (or anything with 3 dimensions). Our enclosing region is going to be a three dimensional rectangle (commonly a cube). We will then apply our subdivision logic above, and cut our enclosing region into eight smaller rectangles. If a game object completely fits within one of these subdivided regions, we'll push it down the tree into that node's containing region. We'll then recursively continue subdividing each resulting region until one of our breaking conditions is met. At the end, we should expect to have a nice tree-like data structure. My implementation of the octree can contain objects which have either a bounding sphere and/or a bounding rectangle. You'll see a lot of code I use to determine which is being used. In terms of our Octree class data structure, I decided to do the following for each tree: Each node has a bounding region which defines the enclosing region Each node has a reference to the parent node Contains an array of eight child nodes (use arrays for code simplicity and cache performance) Contains a list of objects contained within the current enclosing region I use a byte-sized bitmask for figuring out which child nodes are actively being used (the optimization benefits at the cost of additional complexity is somewhat debatable) I use a few static variables to indicate the state of the tree Here is the code for my Octree class outline: public class OctTree { BoundingBox m_region; List m_objects; /// /// These are items which we're waiting to insert into the data structure. /// We want to accrue as many objects in here as possible before we inject them into the tree. This is slightly more cache friendly. /// static Queue m_pendingInsertion = new Queue(); /// /// These are all of the possible child octants for this node in the tree. /// OctTree[] m_childNode = new OctTree[8]; /// /// This is a bitmask indicating which child nodes are actively being used. /// It adds slightly more complexity, but is faster for performance since there is only one comparison instead of 8. /// byte m_activeNodes = 0; /// /// The minumum size for enclosing region is a 1x1x1 cube. /// const int MIN_SIZE = 1; /// /// this is how many frames we'll wait before deleting an empty tree branch. Note that this is not a constant. The maximum lifespan doubles /// every time a node is reused, until it hits a hard coded constant of 64 /// int m_maxLifespan = 8; // int m_curLife = -1; //this is a countdown time showing how much time we have left to live /// /// A reference to the parent node is nice to have when we're trying to do a tree update. /// OctTree _parent; static bool m_treeReady = false; //the tree has a few objects which need to be inserted before it is complete static bool m_treeBuilt = false; //there is no pre-existing tree yet. } Initializing the enclosing region The first step in building an octree is to define the enclosing region for the entire tree. This will be the bounding box for the root node of the tree which initially contains all objects in the game world. Before we go about initializing this bounding volume, we have a few design decisions we need to make: 1. What should happen if an object moves outside of the bounding volume of the root node? Do we want to resize the entire octree so that all objects are enclosed? If we do, we'll have to completely rebuild the octree from scratch. If we don't, we'll need to have some way to either handle out of bounds objects, or ensure that objects never go out of bounds. 2. How do we want to create the enclosing region for our octree? Do we want to use a preset dimension, such as a 200x400x200 (X,Y,Z) rectangle? Or do we want to use a cubic dimension which is a power of 2? What should be the smallest allowable enclosing region which cannot be subdivided? Personally, I decided that I would use a cubic enclosing region with dimensions which are a power of 2, and sufficiently large to completely enclose my world. The smallest allowable cube is a 1x1x1 unit region. With this, I know that I can always cleanly subdivide my world and get integer numbers (even though the Vector3 uses floats). I also decided that my enclosing region would enclose the entire game world, so if an object leaves this region, it should be quietly destroyed. At the smallest octant, I will have to run a brute force collision check against all other objects, but I don't realistically expect more than 3 objects to occupy that small of an area at a time, so the performance costs of O(N^2) are completely acceptable. So, I normally just initialize my octree with a constructor which takes a region size and a list of items to insert into the tree. I feel it's barely worth showing this part of the code since it's so elementary, but I'll include it for completeness. Here are my constructors: /*Note: we want to avoid allocating memory for as long as possible since there can be lots of nodes.*/ /// /// Creates an oct tree which encloses the given region and contains the provided objects. /// /// The bounding region for the oct tree. /// The list of objects contained within the bounding region private OctTree(BoundingBox region, List objList) { m_region = region; m_objects = objList; m_curLife = -1; } public OctTree() { m_objects = new List(); m_region = new BoundingBox(Vector3.Zero, Vector3.Zero); m_curLife = -1; } /// /// Creates an octTree with a suggestion for the bounding region containing the items. /// /// The suggested dimensions for the bounding region. /// Note: if items are outside this region, the region will be automatically resized. public OctTree(BoundingBox region) { m_region = region; m_objects = new List(); m_curLife = -1; } Building an initial octree I'm a big fan of lazy initialization. I try to avoid allocating memory or doing work until I absolutely have to. In the case of my octree, I avoid building the data structure as long as possible. We'll accept a user's request to insert an object into the data structure, but we don't actually have to build the tree until someone runs a query against it. What does this do for us? Well, let's assume that the process of constructing and traversing our tree is somewhat computationally expensive. If a user wants to give us 1,000 objects to insert into the tree, does it make sense to recompute every subsequent enclosing area a thousand times? Or, can we save some time and do a bulk blast? I created a "pending" queue of items and a few flags to indicate the build state of the tree. All of the inserted items get put into the pending queue and when a query is made, those pending requests get flushed and injected into the tree. This is especially handy during a game loading sequence since you'll most likely be inserting thousands of objects at once. After the game world has been loaded, the number of objects injected into the tree is orders of magnitude fewer. My lazy initialization routine is contained within my UpdateTree() method. It checks to see if the tree has been built, and builds the data structure if it doesn't exist and has pending objects. /// /// Processes all pending insertions by inserting them into the tree. /// /// Consider deprecating this? private void UpdateTree() //complete & tested { if (!m_treeBuilt) { while (m_pendingInsertion.Count != 0) m_objects.Add(m_pendingInsertion.Dequeue()); BuildTree(); } else { while (m_pendingInsertion.Count != 0) Insert(m_pendingInsertion.Dequeue()); } m_treeReady = true; } As for building the tree itself, this can be done recursively. So for each recursive iteration, I start off with a list of objects contained within the bounding region. I check my termination rules, and if we pass, we create eight subdivided bounding areas which are perfectly contained within our enclosed region. Then, I go through every object in my given list and test to see if any of them will fit perfectly within any of my octants. If they do fit, I insert them into a corresponding list for that octant. At the very end, I check the counts on my corresponding octant lists and create new octrees and attach them to our current node, and mark my bitmask to indicate that those child octants are actively being used. All of the left over objects have been pushed down to us from our parent, but can't be pushed down to any children, so logically, this must be the smallest octant which can contain the object. /// /// Naively builds an oct tree from scratch. /// private void BuildTree() //complete & tested { //terminate the recursion if we're a leaf node if (m_objects.Count <= 1) return; Vector3 dimensions = m_region.Max - m_region.Min; if (dimensions == Vector3.Zero) { FindEnclosingCube(); dimensions = m_region.Max - m_region.Min; } //Check to see if the dimensions of the box are greater than the minimum dimensions if (dimensions.X <= MIN_SIZE && dimensions.Y <= MIN_SIZE && dimensions.Z <= MIN_SIZE) { return; } Vector3 half = dimensions / 2.0f; Vector3 center = m_region.Min + half; //Create subdivided regions for each octant BoundingBox[] octant = new BoundingBox[8]; octant[0] = new BoundingBox(m_region.Min, center); octant[1] = new BoundingBox(new Vector3(center.X, m_region.Min.Y, m_region.Min.Z), new Vector3(m_region.Max.X, center.Y, center.Z)); octant[2] = new BoundingBox(new Vector3(center.X, m_region.Min.Y, center.Z), new Vector3(m_region.Max.X, center.Y, m_region.Max.Z)); octant[3] = new BoundingBox(new Vector3(m_region.Min.X, m_region.Min.Y, center.Z), new Vector3(center.X, center.Y, m_region.Max.Z)); octant[4] = new BoundingBox(new Vector3(m_region.Min.X, center.Y, m_region.Min.Z), new Vector3(center.X, m_region.Max.Y, center.Z)); octant[5] = new BoundingBox(new Vector3(center.X, center.Y, m_region.Min.Z), new Vector3(m_region.Max.X, m_region.Max.Y, center.Z)); octant[6] = new BoundingBox(center, m_region.Max); octant[7] = new BoundingBox(new Vector3(m_region.Min.X, center.Y, center.Z), new Vector3(center.X, m_region.Max.Y, m_region.Max.Z)); //This will contain all of our objects which fit within each respective octant. List[] octList = new List[8]; for (int i = 0; i < 8; i++) octList = new List(); //this list contains all of the objects which got moved down the tree and can be delisted from this node. List delist = new List(); foreach (Physical obj in m_objects) { if (obj.BoundingBox.Min != obj.BoundingBox.Max) { for (int a = 0; a < 8; a++) { if (octant[a].Contains(obj.BoundingBox) == ContainmentType.Contains) { octList[a].Add(obj); delist.Add(obj); break; } } } else if (obj.BoundingSphere.Radius != 0) { for (int a = 0; a < 8; a++) { if (octant[a].Contains(obj.BoundingSphere) == ContainmentType.Contains) { octList[a].Add(obj); delist.Add(obj); break; } } } } //delist every moved object from this node. foreach (Physical obj in delist) m_objects.Remove(obj); //Create child nodes where there are items contained in the bounding region for (int a = 0; a < 8; a++) { if (octList[a].Count != 0) { m_childNode[a] = CreateNode(octant[a], octList[a]); m_activeNodes |= (byte)(1 << a); m_childNode[a].BuildTree(); } } m_treeBuilt = true; m_treeReady = true; } private OctTree CreateNode(BoundingBox region, List objList) //complete & tested { if (objList.Count == 0) return null; OctTree ret = new OctTree(region, objList); ret._parent = this; return ret; } private OctTree CreateNode(BoundingBox region, Physical Item) { List objList = new List(1); //sacrifice potential CPU time for a smaller memory footprint objList.Add(Item); OctTree ret = new OctTree(region, objList); ret._parent = this; return ret; } Updating a tree Let's imagine that our tree has a lot of moving objects in it. If any object moves, there is a good chance that the object has moved outside of its enclosing octant. How do we handle changes in object position while maintaining the integrity of our tree structure? Technique 1: Keep it super simple, trash & rebuild everything. Some implementations of an Octree will completely rebuild the entire tree every frame and discard the old one. This is super simple and it works, and if this is all you need, then prefer the simple technique. The general consensus is that the upfront CPU cost of rebuilding the tree every frame is much cheaper than running a brute force collision check, and programmer time is too valuable to be spent on an unnecessary optimization. For those of us who like challenges and to over-engineer things, the "trash & rebuild" technique comes with a few small problems: You're constantly allocating and deallocating memory each time you rebuild your tree. Allocating new memory comes with a small cost. If possible, you want to minimize the amount of memory being allocated and reallocated over time by reusing memory you've already got. Most of the tree is unchanging, so it's a waste of CPU time to rebuild the same branches over and over again. Technique 2: Keep the existing tree, update the changed branches I noticed that most branches of a tree don't need to be updated. They just contain stationary objects. Wouldn't it be nice if, instead of rebuilding the entire tree every frame, we just updated the parts of the tree which needed an update? This technique keeps the existing tree and updates only the branches which had an object which moved. It's a bit more complex to implement, but it's a lot more fun too, so let's really get into that! During my first attempt at this, I mistakenly thought that an object in a child node could only go up or down one traversal of the tree. This is wrong. If an object in a child node reaches the edge of that node, and that edge also happens to be an edge for the enclosing parent node, then that object needs to be inserted above its parent, and possibly up even further. So, the bottom line is that we don't know how far up an object needs to be pushed up the tree. Just as well, an object can move such that it can be neatly enclosed in a child node, or that child's child node. We don't know how far down the tree we can go. Fortunately, since we include a reference to each node's parent, we can easily solve this problem recursively with minimal computation! The general idea behind the update algorithm is to first let all objects in the tree update themselves. Some may move or change in size. We want to get a list of every object which moved, so the object update method should return to us a boolean value indicating if its bounding area changed. Once we've got a list of all of our moved objects, we want to start at our current node and try to traverse up the tree until we find a node which completely encloses the moved object (most of the time, the current node still encloses the object). If the object isn't completely enclosed by the current node, we keep moving it up to its next parent node. In the worst case, our root node will be guaranteed to contain the object. After we've moved our object as far up the tree as possible, we'll try to move it as far down the tree as we can. Most of the time, if we moved the object up, we won't be able to move it back down. But, if the object moved so that a child node of the current node could contain it, we have the chance to push it back down the tree. It's important to be able to move objects down the tree as well, or else all moving objects would eventually migrate to the top and we'd start getting some performance problems during collision detection routines. Branch Removal In some cases, an object will move out of a node and that node will no longer have any objects contained within it, nor have any children which contain objects. If this happens, we have an empty branch and we need to mark it as such and prune this dead branch off the tree. There is an interesting question hiding here: When do you want to prune the dead branches off a tree? Allocating new memory costs time, so if we're just going to reuse this same region in a few cycles, why not keep it around for a bit? How long can we keep it around before it becomes more expensive to maintain the dead branch? I decided to give each of my nodes a count down timer which activates when the branch is dead. If an object moves into this nodes octant while the death timer is active, I double the lifespan and reset the death timer. This ensures that octants which are frequently used are hot and stick around, and nodes which are infrequently used are removed before they start to cost more than they're worth. A practical example of this usefulness would be apparent when you have a machine gun shooting a stream of bullets. Those bullets follow in close succession of each other, so it'd be a shame to immediately delete a node as soon as the first bullet leaves it, only to recreate it a fraction of a second later as the second bullet re-enters it. And if there's a lot of bullets, we can probably keep these octants around for a little while. If a child branch is empty and hasn't been used in a while, it's safe to prune it out of our tree. Anyways, let's look at the code which does all of this magic. First up, we have the Update() method. This is a method which is recursively called on all child trees. It moves all objects around, does some house keeping work for the data structure, and then moves each moved object into its correct node (parent or child). public void Update(GameTime gameTime) { if (m_treeBuilt == true) { //Start a count down death timer for any leaf nodes which don't have objects or children. //when the timer reaches zero, we delete the leaf. If the node is reused before death, we double its lifespan. //this gives us a "frequency" usage score and lets us avoid allocating and deallocating memory unnecessarily if (m_objects.Count == 0) { if (HasChildren == false) { if (m_curLife == -1) m_curLife = m_maxLifespan; else if (m_curLife > 0) { m_curLife--; } } } else { if (m_curLife != -1) { if(m_maxLifespan <= 64) m_maxLifespan *= 2; m_curLife = -1; } } List movedObjects = new List(m_objects.Count); //go through and update every object in the current tree node foreach (Physical gameObj in m_objects) { //we should figure out if an object actually moved so that we know whether we need to update this node in the tree. if (gameObj.Update(gameTime)) { movedObjects.Add(gameObj); } } //prune any dead objects from the tree. int listSize = m_objects.Count; for (int a = 0; a < listSize; a++) { if (!m_objects[a].Alive) { if (movedObjects.Contains(m_objects[a])) movedObjects.Remove(m_objects[a]); m_objects.RemoveAt(a--); listSize--; } } //recursively update any child nodes. for( int flags = m_activeNodes, index = 0; flags > 0; flags >>=1, index++) if ((flags & 1) == 1) m_childNode[index].Update(gameTime); //If an object moved, we can insert it into the parent and that will insert it into the correct tree node. //note that we have to do this last so that we don't accidentally update the same object more than once per frame. foreach (Physical movedObj in movedObjects) { OctTree current = this; //figure out how far up the tree we need to go to reinsert our moved object //we are either using a bounding rect or a bounding sphere //try to move the object into an enclosing parent node until we've got full containment if (movedObj.BoundingBox.Max != movedObj.BoundingBox.Min) { while (current.m_region.Contains(movedObj.BoundingBox) != ContainmentType.Contains) if (current._parent != null) current = current._parent; else break; //prevent infinite loops when we go out of bounds of the root node region } else { while (current.m_region.Contains(movedObj.BoundingSphere) != ContainmentType.Contains)//we must be using a bounding sphere, so check for its containment. if (current._parent != null) current = current._parent; else break; } //now, remove the object from the current node and insert it into the current containing node. m_objects.Remove(movedObj); current.Insert(movedObj); //this will try to insert the object as deep into the tree as we can go. } //prune out any dead branches in the tree for (int flags = m_activeNodes, index = 0; flags > 0; flags >>= 1, index++) if ((flags & 1) == 1 && m_childNode[index].m_curLife == 0) { m_childNode[index] = null; m_activeNodes ^= (byte)(1 << index); //remove the node from the active nodes flag list } //now that all objects have moved and they've been placed into their correct nodes in the octree, we can look for collisions. if (IsRoot == true) { //This will recursively gather up all collisions and create a list of them. //this is simply a matter of comparing all objects in the current root node with all objects in all child nodes. //note: we can assume that every collision will only be between objects which have moved. //note 2: An explosion can be centered on a point but grow in size over time. In this case, you'll have to override the update method for the explosion. List irList = GetIntersection(new List()); foreach (IntersectionRecord ir in irList) { if (ir.PhysicalObject != null) ir.PhysicalObject.HandleIntersection(ir); if (ir.OtherPhysicalObject != null) ir.OtherPhysicalObject.HandleIntersection(ir); } } } else { } } Note that we call an Insert() method for moved objects. The insertion of objects into the tree is very similar to the method used to build the initial tree. Insert() will try to push objects as far down the tree as possible. Notice that I also try to avoid creating new bounding areas if I can use an existing one from a child node. /// /// A tree has already been created, so we're going to try to insert an item into the tree without rebuilding the whole thing /// /// A physical object /// The physical object to insert into the tree private void Insert(T Item) where T : Physical { /*make sure we're not inserting an object any deeper into the tree than we have to. -if the current node is an empty leaf node, just insert and leave it.*/ if (m_objects.Count <= 1 && m_activeNodes == 0) { m_objects.Add(Item); return; } Vector3 dimensions = m_region.Max - m_region.Min; //Check to see if the dimensions of the box are greater than the minimum dimensions if (dimensions.X <= MIN_SIZE && dimensions.Y <= MIN_SIZE && dimensions.Z <= MIN_SIZE) { m_objects.Add(Item); return; } Vector3 half = dimensions / 2.0f; Vector3 center = m_region.Min + half; //Find or create subdivided regions for each octant in the current region BoundingBox[] childOctant = new BoundingBox[8]; childOctant[0] = (m_childNode[0] != null) ? m_childNode[0].m_region : new BoundingBox(m_region.Min, center); childOctant[1] = (m_childNode[1] != null) ? m_childNode[1].m_region : new BoundingBox(new Vector3(center.X, m_region.Min.Y, m_region.Min.Z), new Vector3(m_region.Max.X, center.Y, center.Z)); childOctant[2] = (m_childNode[2] != null) ? m_childNode[2].m_region : new BoundingBox(new Vector3(center.X, m_region.Min.Y, center.Z), new Vector3(m_region.Max.X, center.Y, m_region.Max.Z)); childOctant[3] = (m_childNode[3] != null) ? m_childNode[3].m_region : new BoundingBox(new Vector3(m_region.Min.X, m_region.Min.Y, center.Z), new Vector3(center.X, center.Y, m_region.Max.Z)); childOctant[4] = (m_childNode[4] != null) ? m_childNode[4].m_region : new BoundingBox(new Vector3(m_region.Min.X, center.Y, m_region.Min.Z), new Vector3(center.X, m_region.Max.Y, center.Z)); childOctant[5] = (m_childNode[5] != null) ? m_childNode[5].m_region : new BoundingBox(new Vector3(center.X, center.Y, m_region.Min.Z), new Vector3(m_region.Max.X, m_region.Max.Y, center.Z)); childOctant[6] = (m_childNode[6] != null) ? m_childNode[6].m_region : new BoundingBox(center, m_region.Max); childOctant[7] = (m_childNode[7] != null) ? m_childNode[7].m_region : new BoundingBox(new Vector3(m_region.Min.X, center.Y, center.Z), new Vector3(center.X, m_region.Max.Y, m_region.Max.Z)); //First, is the item completely contained within the root bounding box? //note2: I shouldn't actually have to compensate for this. If an object is out of our predefined bounds, then we have a problem/error. // Wrong. Our initial bounding box for the terrain is constricting its height to the highest peak. Flying units will be above that. // Fix: I resized the enclosing box to 256x256x256. This should be sufficient. if (Item.BoundingBox.Max != Item.BoundingBox.Min && m_region.Contains(Item.BoundingBox) == ContainmentType.Contains) { bool found = false; //we will try to place the object into a child node. If we can't fit it in a child node, then we insert it into the current node object list. for(int a=0;a<8;a++) { //is the object fully contained within a quadrant? if (childOctant[a].Contains(Item.BoundingBox) == ContainmentType.Contains) { if (m_childNode[a] != null) m_childNode[a].Insert(Item); //Add the item into that tree and let the child tree figure out what to do with it else { m_childNode[a] = CreateNode(childOctant[a], Item); //create a new tree node with the item m_activeNodes |= (byte)(1 << a); } found = true; } } if(!found) m_objects.Add(Item); } else if (Item.BoundingSphere.Radius != 0 && m_region.Contains(Item.BoundingSphere) == ContainmentType.Contains) { bool found = false; //we will try to place the object into a child node. If we can't fit it in a child node, then we insert it into the current node object list. for (int a = 0; a < 8; a++) { //is the object contained within a child quadrant? if (childOctant[a].Contains(Item.BoundingSphere) == ContainmentType.Contains) { if (m_childNode[a] != null) m_childNode[a].Insert(Item); //Add the item into that tree and let the child tree figure out what to do with it else { m_childNode[a] = CreateNode(childOctant[a], Item); //create a new tree node with the item m_activeNodes |= (byte)(1 << a); } found = true; } } if (!found) m_objects.Add(Item); } else { //either the item lies outside of the enclosed bounding box or it is intersecting it. Either way, we need to rebuild //the entire tree by enlarging the containing bounding box //BoundingBox enclosingArea = FindBox(); BuildTree(); } } Collision Detection Finally, our octree has been built and everything is as it should be. How do we perform collision detection against it? First, let's list out the different ways we want to look for collisions: Frustum intersections. We may have a frustum which intersects with a region of the world. We only want the objects which intersect with the given frustum. This is particularly useful for culling regions outside of the camera view space, and for figuring out what objects are within a mouse selection area. Ray intersections. We may want to shoot a directional ray from any given point and want to know either the nearest intersecting object, or get a list of all objects which intersect that ray (like a rail gun). This is very useful for mouse picking. If the user clicks on the screen, we want to draw a ray into the world and figure out what they clicked on. Bounding Box intersections. We want to know which objects in the world are intersecting a given bounding box. This is most useful for "box" shaped game objects (houses, cars, etc). Bounding Sphere Intersections. We want to know which objects are intersecting with a given bounding sphere. Most objects will probably be using a bounding sphere for coarse collision detection since the mathematics is computationally the least expensive and somewhat easy. The main idea behind recursive collision detection processing for an octree is that you start at the root/current node and test for intersection with all objects in that node against the intersector. Then, you do a bounding box intersection test against all active child nodes with the intersector. If a child node fails this intersection test, you can completely ignore the rest of that child's tree. If a child node passes the intersection test, you recursively traverse down the tree and repeat. Each node should pass a list of intersection records up to its caller, which appends those intersections to its own list of intersections. When the recursion finishes, the original caller will get a list of every intersection for the given intersector. The beauty of this is that it takes very little code to implement and performance is very fast. In a lot of these collisions, we're probably going to be getting a lot of results. We're also going to want to have some way of responding to each collision, depending on what objects are colliding. For example, a player hero should pick up a floating bonus item (quad damage!), but a rocket shouldn't explode if it hits said bonus item. I created a new class to contain information about each intersection. This class contains references to the intersecting objects, the point of intersection, the normal at the point of intersection, etc. These intersection records become quite useful when you pass them to an object and tell them to handle it. For completeness and clarity, here is my intersection record class: public class IntersectionRecord { Vector3 m_position; /// /// This is the exact point in 3D space which has an intersection. /// public Vector3 Position { get { return m_position; } } Vector3 m_normal; /// /// This is the normal of the surface at the point of intersection /// public Vector3 Normal { get { return m_normal; } } Ray m_ray; /// /// This is the ray which caused the intersection /// public Ray Ray { get { return m_ray; } } Physical m_intersectedObject1; /// /// This is the object which is being intersected /// public Physical PhysicalObject { get { return m_intersectedObject1; } set { m_intersectedObject1 = value; } } Physical m_intersectedObject2; /// /// This is the other object being intersected (may be null, as in the case of a ray-object intersection) /// public Physical OtherPhysicalObject { get { return m_intersectedObject2; } set { m_intersectedObject2 = value; } } /// /// this is a reference to the current node within the octree for where the collision occurred. In some cases, the collision handler /// will want to be able to spawn new objects and insert them into the tree. This node is a good starting place for inserting these objects /// since it is a very near approximation to where we want to be in the tree. /// OctTree m_treeNode; /// /// check the object identities between the two intersection records. If they match in either order, we have a duplicate. /// ///the other record to compare against /// true if the records are an intersection for the same pair of objects, false otherwise. public override bool Equals(object otherRecord) { IntersectionRecord o = (IntersectionRecord)otherRecord; // //return (m_intersectedObject1 != null && m_intersectedObject2 != null && m_intersectedObject1.ID == m_intersectedObject2.ID); if (otherRecord == null) return false; if (o.m_intersectedObject1.ID == m_intersectedObject1.ID && o.m_intersectedObject2.ID == m_intersectedObject2.ID) return true; if (o.m_intersectedObject1.ID == m_intersectedObject2.ID && o.m_intersectedObject2.ID == m_intersectedObject1.ID) return true; return false; } double m_distance; /// /// This is the distance from the ray to the intersection point. /// You'll usually want to use the nearest collision point if you get multiple intersections. /// public double Distance { get { return m_distance; } } private bool m_hasHit = false; public bool HasHit { get { return m_hasHit; } } public IntersectionRecord() { m_position = Vector3.Zero; m_normal = Vector3.Zero; m_ray = new Ray(); m_distance = float.MaxValue; m_intersectedObject1 = null; } public IntersectionRecord(Vector3 hitPos, Vector3 hitNormal, Ray ray, double distance) { m_position = hitPos; m_normal = hitNormal; m_ray = ray; m_distance = distance; // m_hitObject = hitGeom; m_hasHit = true; } /// /// Creates a new intersection record indicating whether there was a hit or not and the object which was hit. /// ///Optional: The object which was hit. Defaults to null. public IntersectionRecord(Physical hitObject = null) { m_hasHit = hitObject != null; m_intersectedObject1 = hitObject; m_position = Vector3.Zero; m_normal = Vector3.Zero; m_ray = new Ray(); m_distance = 0.0f; } } Intersection with a Bounding Frustum /// /// Gives you a list of all intersection records which intersect or are contained within the given frustum area /// ///The containing frustum to check for intersection/containment with /// A list of intersection records with collisions private List GetIntersection(BoundingFrustum frustum, Physical.PhysicalType type = Physical.PhysicalType.ALL) { if (m_objects.Count == 0 && HasChildren == false) //terminator for any recursion return null; List ret = new List(); //test each object in the list for intersection foreach (Physical obj in m_objects) { //skip any objects which don't meet our type criteria if ((int)((int)type & (int)obj.Type) == 0) continue; //test for intersection IntersectionRecord ir = obj.Intersects(frustum); if (ir != null) ret.Add(ir); } //test each object in the list for intersection for (int a = 0; a < 8; a++) { if (m_childNode[a] != null && (frustum.Contains(m_childNode[a].m_region) == ContainmentType.Intersects || frustum.Contains(m_childNode[a].m_region) == ContainmentType.Contains)) { List hitList = m_childNode[a].GetIntersection(frustum); if (hitList != null) { foreach (IntersectionRecord ir in hitList) ret.Add(ir); } } } return ret; } The bounding frustum intersection list can be used to only render objects which are visible to the current camera view. I use a scene database to figure out how to render all objects in the game world. Here is a snippet of code from my rendering function which uses the bounding frustum of the active camera: /// /// This renders every active object in the scene database /// /// public int Render() { int triangles = 0; //Renders all visible objects by iterating through the oct tree recursively and testing for intersection //with the current camera view frustum foreach (IntersectionRecord ir in m_octTree.AllIntersections(m_cameras[m_activeCamera].Frustum)) { ir.PhysicalObject.SetDirectionalLight(m_globalLight[0].Direction, m_globalLight[0].Color); ir.PhysicalObject.View = m_cameras[m_activeCamera].View; ir.PhysicalObject.Projection = m_cameras[m_activeCamera].Projection; ir.PhysicalObject.UpdateLOD(m_cameras[m_activeCamera]); triangles += ir.PhysicalObject.Render(m_cameras[m_activeCamera]); } return triangles; } Intersection with a Ray /// /// Gives you a list of intersection records for all objects which intersect with the given ray /// ///The ray to intersect objects against /// A list of all intersections private List GetIntersection(Ray intersectRay, Physical.PhysicalType type = Physical.PhysicalType.ALL) { if (m_objects.Count == 0 && HasChildren == false) //terminator for any recursion return null; List ret = new List(); //the ray is intersecting this region, so we have to check for intersection with all of our contained objects and child regions. //test each object in the list for intersection foreach (Physical obj in m_objects) { //skip any objects which don't meet our type criteria if ((int)((int)type & (int)obj.Type) == 0) continue; if (obj.BoundingBox.Intersects(intersectRay) != null) { IntersectionRecord ir = obj.Intersects(intersectRay); if (ir.HasHit) ret.Add(ir); } } // test each child octant for intersection for (int a = 0; a < 8; a++) { if (m_childNode[a] != null && m_childNode[a].m_region.Intersects(intersectRay) != null) { List hits = m_childNode[a].GetIntersection(intersectRay, type); if (hits != null) { foreach (IntersectionRecord ir in hits) ret.Add(ir); } } } return ret; } Intersection with a list of objects This is a particularly useful recursive method for determining if a list of objects in the current node intersect with any objects in any child nodes (See: Update() method for usage). It's the method which will be used most frequently, so it's good to get this right and efficient. What we want to do is start at the root node of the tree. We compare all objects in the current node against all other objects in the current node for collision. We gather up any of those collisions as intersection records, and insert them into a list. We then pass our list of tested objects down to our child nodes. The child nodes will then test their objects against themselves, then against the objects we passed down to them. The child nodes will capture any collisions in a list, and return that list to its parent. The parent then takes the collision list received from its child nodes and appends it to its own list of collisions, finally returning it to its caller. If you count out the number of collision tests in the illustration above, you can see that we conducted 29 hit tests and recieved 4 hits. This is much better than [11*11 = 121] hit tests. private List GetIntersection(List parentObjs, Physical.PhysicalType type = Physical.PhysicalType.ALL) { List intersections = new List(); //assume all parent objects have already been processed for collisions against each other. //check all parent objects against all objects in our local node foreach (Physical pObj in parentObjs) { foreach (Physical lObj in m_objects) { //We let the two objects check for collision against each other. They can figure out how to do the coarse and granular checks. //all we're concerned about is whether or not a collision actually happened. IntersectionRecord ir = pObj.Intersects(lObj); if (ir != null) { intersections.Add(ir); } } } //now, check all our local objects against all other local objects in the node if (m_objects.Count > 1) { #region self-congratulation /* * This is a rather brilliant section of code. Normally, you'd just have two foreach loops, like so: * foreach(Physical lObj1 in m_objects) * { * foreach(Physical lObj2 in m_objects) * { * //intersection check code * } * } * * The problem is that this runs in O(N*N) time and that we're checking for collisions with objects which have already been checked. * Imagine you have a set of four items: {1,2,3,4} * You'd first check: {1} vs {1,2,3,4} * Next, you'd check {2} vs {1,2,3,4} * but we already checked {1} vs {2}, so it's a waste to check {2} vs. {1}. What if we could skip this check by removing {1}? * We'd have a total of 4+3+2+1 collision checks, which equates to O(N(N+1)/2) time. If N is 10, we are already doing half as many collision checks as necessary. * Now, we can't just remove an item at the end of the 2nd for loop since that would break the iterator in the first foreach loop, so we'd have to use a * regular for(int i=0;i tmp = new List(m_objects.Count); tmp.AddRange(m_objects); while (tmp.Count > 0) { foreach (Physical lObj2 in tmp) { if (tmp[tmp.Count - 1] == lObj2 || (tmp[tmp.Count - 1].IsStatic && lObj2.IsStatic)) continue; IntersectionRecord ir = tmp[tmp.Count - 1].Intersects(lObj2); if (ir != null) intersections.Add(ir); } //remove this object from the temp list so that we can run in O(N(N+1)/2) time instead of O(N*N) tmp.RemoveAt(tmp.Count-1); } } //now, merge our local objects list with the parent objects list, then pass it down to all children. foreach (Physical lObj in m_objects) if (lObj.IsStatic == false) parentObjs.Add(lObj); //parentObjs.AddRange(m_objects); //each child node will give us a list of intersection records, which we then merge with our own intersection records. for (int flags = m_activeNodes, index = 0; flags > 0; flags >>= 1, index++) if ((flags & 1) == 1) intersections.AddRange(m_childNode[index].GetIntersection(parentObjs, type)); return intersections; } ;i++)> Screenshot Demos This is a view of the game world from a distance showing the outlines for each bounding volume for the octree. This view shows a bunch of successive projectiles moving through the game world with the frequently-used nodes being preserved instead of deleted. Complete Code Sample I've attached a complete code sample of the octree class, the intersection record class, and my generic physical object class. I don't guarantee that they're all bug-free since it's all a work in progress and hasn't been rigorously tested yet.
  12. Hello everybody. I have implemented a 2D raycasting algorithm in my game engine but I must be doing something very wrong, since my game is pretty much unplayable if I cast around 10 rays each frame (it runs fine at around 5-6 casts per frame). I tried profiling but, as you can see from the two pictures, I ended up on STL territory, which tells me that the performance issues arise from my approach to the problem. I'm using the Sweep-and-Prune algorithm for my broadphase detection, which divides my entire map into sections, and colliders inside a section are only checked for collisions with other colliders from that section. This approach is used in my raycasting algorithm as well. Initially, I get a list of all colliders inside the raycast's radius and then I check the ray against every collider in that list. As far as I understand it the problem lies not in the Ray vs. Shape checks, but in the preparation work before that. Any tips or guidelines on how to correct my approach, or specifics of the algorithms, are most welcome. Thank you in advance. Raycast BroadCircleToOBB SOBB::GetSupportPoint
  13. Hello everybody from Gamedev.net, Lately, I continued every project in finalisation steps, like Candy World II, Candy to the Rescue IV & Lights of Dreams IV. For other projects, like Candy Racing Cup & Candy's Space Mysteries, I'll augment the realism of particles on the road & on space. Friendly, Xylvan, Xilvan Design.
  14. Anyone new to the Artificial Intelligence field with an interest in gaming should attempt to create a simple board game program with an AI opponent. The best part about board games are the simple rules - this means less time implementing the game, more time on the AI. This essay will detail some of the techniques that you can apply to simple board games (this does not include chess, Go, Go-moku and the likes). Priority Board A technique often used is something I call a priority board, an identically sized board that the AI agent uses to store values in. Each value corresponds to the place on the board; the higher the value, the more likely the agent will move there. For example, let us take the overly-simple game of tictactoe, for this board: [x][ ][ ] [ ][O][ ] [x][O][ ] With the computer playing X and X to move, the priority board could look something like: [0][5][0] [9][0][0] [0][0][0] The program would obviously move to (2,1) and win the game. Notice that if that opportunity wasn't their for the computer, then it would move to (1,2) and block the opponent from winning the game. Now, for a small board like tictactoe, a priority board is not necessary, but for larger games (like Pente, which is on a 19x19 board - 361 positions!) priority boards can be very useful to assess the large number of places. So, how do you assess the positions? Heuristics Heuristics is basically a fancy name for rules, and it is these heuristics that will make or break the game. Firstly, you should narrow down your board game rules to a couple of heuristics that you can implement as code. For example, the rules of Pente dictate that you win if you place 5 pieces in a row, or get 5 captures. Therefore, some possible heuristics are as follows: Check for 4-pieces in a row Check for 3-pieces in a row Check for 2-pieces in a row Check for captures Now, obviously, the first 3 can be reduced further, "Check for x-pieces in a row" which narrows our heuristic down to two! Thing is, so far we have only an offensive agent. In the worst case scenario, we'd want a purely defensive agent - purely offensive agents will be easily beaten! So, we will add an additional 2 heuristics to our program: Check for opponent potentially getting x-pieces in a row Check for opponent potentially making a capture We now have 4 heuristics that can be applied to the game in both defensive and offensive styles. I have found the best place to proceed from here is by applying a two step evaluation. Firstly, you assign a number to the priority board place in your heuristic routine. For example, in our "Check x-pieces in a row" heuristic we could assign the number of pieces to the priority board. For example, given a simple Pente board: [ ][ ][ ][ ][x] [ ][ ][ ][x][ ] [ ][ ][ ][ ][ ] [ ][x][ ][ ][ ] [ ][ ][ ][ ][ ] Our initial priority board after the first heuristic would look something like this: [1][2][2][2][0] [1][1][1][0][2] [1][1][3][1][2] [1][0][1][2][1] [3][1][1][1][1] Note that the diagonal has the highest values since there are 3 pieces in the 5-line, therefore (3,3) and (5,1) get the highest values assigned to them. With experience, I've found it useful to multiply each heuristic by a certain bias. I've also found it useful to assign a slightly higher value to defensive heuristics (for example, I use a bias of 1.2 as opposed to 1.0 (which is no bias) in PenteAI). Hopefully, you will find with the right heuristics and biases, you will get a certain amount of emergent behaviour - behaviour you had not planned, but comes from all the heuristics interacting with each other. For example, when I first ran my recent PenteAI program, I found the AI spaced out its moves. I had not planned this at all, indeed I wanted quite the opposite! After playing with this for a while, I realized it was an excellent way of limiting your opponents moves 3 or 4 moves ahead - and it is a technique that I myself have now adopted when playing the game! Beyond This... For board games this simple, there aren't that many additional simple techniques. It all depends on your game and the complexity of the game itself. For more complex games, you start to look a certain number of moves ahead to keep in front of your opponent. You can also employ more advanced AI techniques to simple board games with some interesting results - genetic algorithms to evolve biases and weights (although this is time consuming) can generate a very formidable opponent. Using neural networks to recognize patterns in the players behaviour can also be very challenging for the player.
  15. Symbolic AI Systems vs Connectionism Symbolic AI systems manipulate symbols, instead of numbers. Humans, as a matter of fact, reason symbolically (in the most general sense). Children must learn to speak before they are able to deal with numbers for example. More specifically, these systems operate under a set of rules, and their actions are determined by these rules. They always operate under task oriented environments, and are wholly unable to function in any other case. You can think of symbolic AI systems as "specialists". A program that plays 3d tic tac toe will not be able to play PenteAI (a game where 5 in a row is a win, but the players are allowed to capture two pieces if they are sandwiched by the pieces of an opposing player). Although symbolic AI systems can't draw connections between meanings or definitions and are very limited with respect to types of functionality, they are very convenient to use for tackling task-center problems (such as solving math problems, diagnosing medical patients etc.). The more flexible approach to AI involves neural networks, yet NN systems are usually so underdeveloped that we can't expect them to do "complex" things that symbolic AI systems can, such as playing chess. While NN systems can learn more flexibly, and draw links between meanings, our traditional symbolic AI systems will get the job done fast. An example of a programming language designed to build symbolic AI systems is LISP. LISP was developed by John McCarthy during the 1950s to deal with symbolic differentiation and integration of algebraic expressions. Production Systems (This model of production systems is based on chapter 5 of Stan Franklin's book, The Artificial Mind, the example of the 8-puzzle was also based on Franklin's example) Production systems are applied to problem solving programs that must perform a wide-range of seaches. Production ssytems are symbolic AI systems. The difference between these two terms is only one of semantics. A symbolic AI system may not be restricted to the very definition of production systems, but they can't be much different either. Production systems are composed of three parts, a global database, production rules and a control structure. The global database is the system's short-term memory. These are collections of facts that are to be analyzed. A part of the global database represents the current state of the system's environment. In a game of chess, the current state could represent all the positions of the pieces for example. Production rules (or simply productions) are conditional if-then branches. In a production system whenever a or condition in the system is satisfied, the system is allowed to execute or perform a specific action which may be specified under that rule. If the rule is not fufilled, it may perform another action. This can be simply paraphrased: WHEN (condition) IS SATISFIED, PERFORM (action) A Production System Algorithm DATA (binded with initial global data base) when DATA satisfies the halting condition do begin select some rule R that can be applied to DATA return DATA (binded with the result of when R was applied to DATA) end For a scenerio where a production system is attempting to solve a puzzle, pattern matching is required to tell whether or not a condition is satisfied. If the current state of a puzzle matches the desired state (the solution to the puzzle), then the puzzle is solved. However, if this case is not so, the system must attempt an action that will contribute to manipulating the global database, under the production rules in such a way that the puzzle will eventually be solved. In order to take a closer look to control structures let us look at a problem involving the eight puzzle. The eight puzzle contains eight numbered squares laid in a three-by-three grid, leaving one square empty. Initially it appears in some, obfuscated state. The goal of the production system is to reach some final state (the goal). This can be obtained by successively moving squares into the empty position. This system changes with every move of the square, thus, the global database changes with time. The current state of the system is given as the position and enumeration of the squares. This can be represented for example as a 9 dimensional vector with components 0, 1, 2, 3,..., 8, NULL, the NULL object being the empty space. In this puzzle, the most general production rule can be simply summed up in one sentence: If the empty square isn't next to the left edge of the board, move it to the left However, in order to move the empty square to the left, the system must first make room for the square to move left. For example, from the initial state (refer to above figure) the 1-square would be moved down 1 space, then, the 8-square right 1 space, then the 6-square up one space in order for the empty square to be moved left (i.e., a heuristic search). All these sequences require further production rules. The control system decides which production rules to use, and in what sequence. To reiterate, in order to move the empty square left, the system must check if the square is towards the top, or somewhere in the middle or bottom before it can decide what squares can be moved to where. The control system thus picks the production rule to be used next in a production system algorithm (refer to the production system algorithm figure above). Another example of a production system can be found in Ed Kao's 3-dimensional tic-tac-toe program. The rules and conditions for the AI are conviently listed just like for the 8 puzzle. The question that faces many artificial intelligence researchers is how capable is a production system? What activities can a production system control? Is a production system really capable of intelligence? What can it compute? The answer lies in Turing machines...
  16. As humans, we like to implement solutions which are familiar to us. We get caught up doing things the way we know how to do them, rather than the "best" way to do them. It's easy to get caught up in thinking like this and as a result we end up using outdated technologies and implement features in ways that our modern contemporaries don't understand, or are simply less effective or efficient. My purpose with this and future papers will be to expose readers to a broad spectrum of solutions that will hopefully help them in their own coding. Today I'll be covering Action Lists! Action Lists are a simple yet powerful type of AI that all game developers should know about. While ultimately not scalable for large AI networks, they allow for relatively complex emergent behavior and are easy to implement. Whether you are just getting into AI programming or are an experienced industry veteran looking to expand your toolkit, this presentation will introduce you to Action Lists and provide concrete examples to help you implement your own solutions. Let's begin the story. Once Upon A Time... Several years ago I was starting the development of King Randall's Party, a game in which the player builds a castle and tries to defend it against the King who is trying to knock it down. I needed to create a reasonably smart AI that could look at the player's castle and figure out how to circumvent or destroy it in order to reach its objective - the gold pile the player is defending. This was a big challenge, almost too big to consider all at once. So like any good programmer I broke it down into a more manageable problem set. The first challenges: I needed to get the units to have a specific set of behaviors that they would act according to. A quick internet search caused my mind to implode, of course. Searching for "Game AI" brought up results on planners, finite state machines, steering behaviors, flocking, A*, pathfinding, etc. I had no clue where to start, so I did what any reasonable, rational person would do. I asked my dog. This isn't anything new, of course. Whenever I have a tech problem, I ask my dog. Now I know what you're thinking "Jesse, that's dumb, and you're crazy... What do dogs know about computers?" Well, let's just gloss over that. It may or may not have involved some illegal technology and or college class auditing. Anyway, I said "Ok Frankie - there is so much going on with AI, I really don't have a clue where to start. How should I go about creating an AI framework for my game units?" Frankie gave me this pretty withering look that basically informed me that I was an idiot and pretty dumb, despite what my high school teacher Mr. Francis may have told me about there never being any stupid questions. I'm pretty sure Frankie wouldn't have had nice thoughts about Mr. Francis either. "Jesse", she asked, "how do you typically start your day?" Well, I write everything that I need to do that day down in a list and then prioritize it according to how important the task is and how soon it needs to be done. I explained this to Frankie and she responded "And that, is an Action list." She told me that an Action List is a list of tasks or behaviors that your game units work their way through one at a time. It is a form of finite state system, and could be described as a simple behavior tree with a single branch level. Here is how they work. According to my dog. How Action Lists Work First you write down all the behaviors you want your AI to have. Then you order them according to priority. Lowest to highest. Now we iterate over the list checking each action to see if it can execute and if it can, executing it. We then check the actions Blocking property, and if the item is Blocking further actions we exit the list. We will get into why Blocking is important later. In our example here, our first action Attack Player will only execute if the AI is close to the player. Let's say it is not, so it checks if it can build a ladder at this location (and should it), and so on until it finds an action item it can execute such as Break Door. It then executes the Break Door code. Here is where Blocking comes into play. If Break Door occurs instantly, then it will not block any further actions and the rest of the list can execute. This is typically not the case - actions usually take up more than one frame. So in this case the Break Door Action Item calls unit.Attack(door), which will change the unit's CurrentState from Waiting to BreakDoor and will return true until the door is broken. A Simple Finite State Machine Well ok. That sounds workable. Frankie had made a good suggestion and Action Lists seem like a great fit for my project. But I'd never heard of them before so I had my doubts - most of what I hear floating around about AI has to do with transition-based finite state machines, similar to what Unity3D uses for animations in Mechanim. You define a bunch of states, and identify when and how they transition between each other. In exchange for some belly scratches, Frankie explained to me when you make a transition based finite state machine, you need to define all the states you want to have, and then also define all of the transitions to and from each of those individual states. This can get complicated really, really fast. If you have a Hurt state, you need to identify every other state that can transition to this state, and when. Walking to hurt; jumping to hurt, crouching to hurt, attacking to hurt. This can be useful, but can also get complicated really fast. If your AI requirements are fairly simple, that's a lot of potentially unnecessary overhead. Another difficulty with transition-based state machines is that it is difficult to debug. If you set a break point and look at what the AI's current state is, it is impossible without additional debug code to know how the AI got into its current state, what the previous states were and what transition was used to get to the current state. Drawbacks of Action Lists As I dug into action lists some more, I realized that they were perfect for my implementation, but I also realized they had some drawbacks. The biggest flaw is simply the result of its greatest strength - its simplicity. Because it is a single ordered list, I couldn't have any sort of complex hierarchy of priorities. So if I wanted Attack Player to be a higher priority than Break Door, but lower than Move To Objective, while also having Move To Objective being lower priority than Break Door... that's not a simple problem to solve with action lists, but trivial with finite state machines. In summary, action lists are really useful for reasonably simple AI systems, but the more complex the AI you want to model, the more difficult it will be to implement action lists. That being said, there are a few ways you can extend the concept of Action Lists to make them more powerful. Ways to Extend This Concept So some of my AI units are multitaskers - they can move and attack at the same time. I could create multiple action lists - one to handle movement and one to handle attacking, but that is can be problematic - what if some types of movement preclude attacking, and some attacks require the unit to stand still? This is where Action Lanes come in. Action Lanes are an extension to the concept of Blocking. With Action Lanes, Action Items can now identify specific types of Action Items that it blocks from executing while allowing others to execute without problem. Let's show this in action. An Action Lane is just an additional way to determine what action. Each Action Item belongs to one or more lanes, and when its Blocking property returns true, it will add the lanes it belongs to Each action has a lane or multiple lanes they are identified with, and they will only block other actions which belong to those lanes. As an example, Attack Player belongs in the Action Lane, Move to Goal belongs in the Movement lane, and Build Ladder belongs in both since the unit must stand still and cannot attack while building. Then we order these items, and if they execute they will block subsequent actions appropriately. Example Implementation Now that we've gone over the theory, it is useful to step through a practical implementation. First let's setup our Action List and Action Items. For Action Items I like to decouple implementation, so let's make an interface. Here is an example implementation of the IActionItem for the BreakDoor Action Item. For the Action List itself we can use a simple List. Then we load it up with the IActionItems. After that, we setup a method that iterates over the list every frame. Remember we also have to handle blocking. Things get a bit more complicated if you want to use action lanes. In that case we define Action Lanes as a bitfield and then modify the IActionItem interface. Then we modify the iterator to take these lanes into account. Action Items will be skipped over if their lane is blocked, but will otherwise check as normal. If all lanes are blocked then we break out of the loop. Conclusion So that's a lot to take in. While coding the other day Frankie asked me to summarize my learnings. Thinking about it, there were a few key takeaways for me. Action lists are easier to setup and maintain then small transition-based state systems. They model a recognizable priority system. There are a few ways they can be extended to handle expanded functionality. As with anything in coding, there is often no best solution. It is important to keep a large variety of coding tools in our toolbox so that we can pick the right one for the problem at hand. Action Lists turned out to be perfect for King Randall's Party. Perhaps they will be the right solution for your project? Originally posted on gorillatactics.com
  17. NPC Conversation Techniques [Author unknown] Courtesy of Amit Patel Did I hear a request to discuss conversation engine techniques? That means an opportunity to repost for discussion my 26 screen paper on the best way to talk in a game. Booo-ha-ha-ha-ha-ha... : ) Seriously, I'm quite interested in how to work a solid, intuitive conversation, and any suggestions would be welcome. 1.0 Introduction I've noticed a preponderance of posts all looking for various graphics tricks and techniques to use in their games. While I have no problem with this (in fact, I've learned quite a few things), there's been another programming problem on my mind lately. I haven't really though too heavily about it, but I'd like to throw a few ideas out in this forum and see where it goes. Results of open-discussion will be incorporated into this paper over time. Source code will inevitably follow, and the resulting monolith (as it seems to be taking on a life of its own) will be donated to the Rec.Games.Programmer Programming Encyclopedia if it is deemed useful enough. 1.0.1 Statement of Purpose What I'm interested in creating is a conversation engine. I want to find a method of allowing communication between players and the computer characters (Non Player Characters or NPCs). Ideally it would allow the following: Structured interaction between the player(s) and NPCs. This would allow conversations to take place, and would be the normal method of communication. It would allow player input, as well as the "standard greeting" given by an NPC from whom nothing else can be obtained. For example: it would allow players to negotiate with a shop owner, but also allow players to get information from a pedestrian ("Welcome to Port Nowhere". ). Flexible dialogues based on external flags. This would allow NPCs to change conversations depending upon events in the storyline. For example: everyone in town will talk of nothing other than the slimy alien who ate the mayor. Once the alien is disposed of, they would be free to talk about other things. It should be (fairly) easy for the players to determine how to ask certain questions, while not be merely a matter of walking through every branch of a conversation tree. For example: the venerable Sierra engine vs. Ultima Underworld (more detail on this later). It should be fairly easy to program and maintain (including efficient storage) to allow many large conversations to be created, tested, and maintained without inordinate amounts of effort. It should be flexible enough to provide better than 3rd grade levels of conversation, but extensible enough to handle modifications without undue difficulty. It should be easy to use for novice players, but convenient for advanced players. This means it should also allow both keyboard and mouse input. If it can incorporate both seamlessly, then the player can decide what combination works best. One other item to keep in mind, is that the conversation engine should be flexible enough to be incorporated into the rest of the interface. It must function smoothly with the movement engine, and any other control routines the program may require. What this list of requirements does, is prove that this problem will be more difficult to solve effectively than the graphics portion of my program, because the approach is not terribly well defined. 2.0 Common Approaches There are three main approaches I have seen. They are: Text Parsing Menu-Driven Conversations Hybrid Conversations Each has distinct advantages and disadvantages: 2.1 Text Parsing Text Parsing Engine. A prompt is given to the player, nothing more. Input is typed in the following syntax: . This is a very old and refined method of input for a game, allowing all manner of action to be effected upon the environment. Generally, it has been used as the primary means of interacting with the game (as in the case of the old text adventure games), but has also been seen used as a primitive vehicle for interaction with NPCs. Examples of this sort of input would be: TADS (the Text ADventure game System), old Sierra games, Zork (really old people might remember this one : ) ), etc. Advantages: "Correct" actions are concealed from the player. Player needs to think about problems, rather than just walk though all the possibilities. Generally very good for puzzle creation, where the trick is to determine what to use X for to effect Y (for example: "put the key in the lock", "open the door"). The fact that it is the oldest form of input means that it has been resolved to a respectable level of complexity, and can simulate natural conversation fairly well. For example: ASK THE MAN ABOUT THE WHALE "Oh, the whale. He's a real killer alright. Nary a man sails the sea without keeping one eye out for the whale." ASK THE MAN ABOUT A BOAT "A boat? Surely you're not thinking of sailing? You're crazier than I thought!" Disadvantages: "Correct" actions are often extremely difficult to determine, leading to frustration on the part of the user, especially if the puzzles are difficult, ill-conceived, or multi-part. This is especially difficult when a nice illustration or snazzy description does not match the name by which an object is referred to internally. Anyone who has ever played one of these games has seen the following: TAKE THE WINE "I don't know what a WINE is" TAKE THE FLASK "I don't know what a FLASK is" TAKE THE DAMN BOTTLE "I don't know what a DAMN is" TAKE THE BOTTLE "You have taken the bottle." This can quickly lead to frustration, as the player has difficulty in manipulating the interface. The largest problem is that user though patterns are always a mystery, as we have all seen (especially from beta testers: "What? You mean you tried to put the bathtub in your backpack and the game crashed? Gee... I never thought of that one...") Players, especially good ones, are notorious for trying the bizarre just to see what happens. (In fact, I 've always found that in these types of games, finding the little bizarre cases that they actually put into the game just to see if anyone tries it are the most interesting parts of these games.) Regardless, this form of communication is user un-friendly, despite the fact that it's relatively straightforward to program. 2.2 Menu-Driven Conversations Menu Driven Conversations: These are conversations where the NPC says something and the player is presented with a multiple choice answer. Ultima Underworld II used this form of communication: Angry Orc: "Hey! Nobody gets in here without the password." A. "Yes. The password. I know it." B. "The password? Oh, I forgot it. It's downstairs. I'll be right back." C. "Password? I don't need no stinkin' password!" Advantages: The choices are obvious, allowing the player to concentrate on their course of action, not "guess the right question". An interface should intrude upon the game as little as possible, allowing the player to invlove themselves with your game, not entangle themsleves in their hardware. The conversation is a little more colorful (I've always loved choice "C".) and allows you to texture the conversation and use consistent slang to keep the player in character: B. "Yea, the scourge of the east approaches." Disadvantages: The choices are a little too obvious. A player can merely save their game, and then try all the different branches of the conversation tree until they find the desired path. One possible solution is to allow save games only in certain locations, making it more trouble than it's worth to try all the options at will. On the other hand, this inconveniences the player and complicates the interface. (Personally. I don't mind the limited saves concept. It has the extra advantage of making combat a little more stressful than infinite save points does.) Large numbers of choices are difficult to implement. If your game is a detective-type game, where you have large numbers of questions to ask large numbers of people, than the engine becomes unwieldy. It can also take a long time to traverse enough branches to get the desired result. This also detracts from the feel of the game. 2.3 Hybrid Engine The hybrid engine is a combination of both previous systems. On the one hand, it presents the player with a list of actions that may be tried, allowing them to decide which is appropriate. It also obscures the painful obviousness of multiple-choice answers. From this basis, there are two major variations: the full-keyword version, and the basic choices plus optional keyword version. Both systems traverse conversations in the same way. Typical conversation: (Approach Fred, initiate conversation by selecting GREETING from list) you: "Greetings friend." response: "Greetings yourself, traveler. Nice day today." (select TRADE) you: "I have traveled many lands and have acquired many curiosities. Perhaps you might have as well. Would you care to barter a bit?" response: "Ho there! Is my profession so obvious that you can spot me as a trader a mile off? Of course! Let us see what we have..." 2.3.1 The All-Keyword System This engine presents the player with a list of keywords. The player picks a keyword, and the appropriate conversation proceeds from there. As the game progresses, more keywords are added to the list, allowing the player to revisit certain NPCs to see if they know anything new. An example of this type of game would be Bad Blood, a post-apocalyptic game. As you progressed in the game, new keywords would be added to your list of options. You would know which parts of conversations were important, and could then revisit key characters and try the new keywords. Disadvantages: The all-keyword system. This allows the player to talk to everyone about everything, and wait for the important keywords to show up. (Similar to the way you'd get points in the old Sierra games for doing correct things.) This could take some of the thought out of the game, as a player can simply run through conversations only looking for the 'beep' that indicates a new keyword. On the other hand, it allows some feedback to the player on their progress. Another disadvantage, is that all intonation is predetermined. If you wish to ask a character about a certain item. Like a bottle, you choose bottle and the computer phrases your question for you. It takes away a player's ability to decide how they wish to phrase their question. Phrasing is especially useful when giving NPCs their own motivations. For example, you might want to lean on a weak-willed Orc to get information, but you would probably affect a more fawning tone in the presence of royalty, lest you find yourself shorter by a head. Intonation and interpretation is a vital part of communication (as seen by the net usage of : ) and similar icons to ensure that the intended meaning is not misinterpreted by the reader) and eliminating that aspect of conversation can detract from the player's association with their character. 2.3.2 The Standard Choices With Optional Keyword This is similar to the first option, only this time, there are only basic choices presented to the player. There is also a blank space, where the player may try any other keywords they might like to try. This allows for some subtlety on the part of the designer. Key hints could be given and the keyword not added to the list (which would really annoy some players, who would accuse you of design flaws) or the list of choices could always be the same, relying on the character to keep track of what might be important. An example of this type of game would be The Summoning, a single-person dungeon game. Disadvantages: This system might seem to present some of the same limited choices that commonly have players trying vaguely related verbs. For example, the ubiquitous "use" verb that also stands for: twist, read, peel, pry, flick, turn on, etc. The other possible twist is that a player may find out a keyword before the plot would normally present it to them. This might be more common than initially thought, with stumped players frequently requesting this sort of information at the wrong time, or for someone who might by playing a second time. The solution would be to implement the EVENT flag concept, locking out certain keywords and conversations until certain events have happened. This system also suffers from the same lack of intonation as the previous flavor of this engine. 3.0 Conclusions To be honest, I'm not quite sure. If I had to say that I was leaning towards any particular engine, I'd have to say it was type 2.3.2: standard action words with optional keyword. It seems to offer the strongest balance between player assistance and mystery. Unfortunately, it does nothing to solve the intonation issue. We would seem to need another option for our list of choices: one which allows some flair in conversation, allows the player to choose emotional context for their statements, yet obscure the choices somewhat, making the conversation less of a "try all the choices in order" process. What I'd like to know is if anyone else has thought about this problem, if I've might have missed another way, or if there is a better way to implement one of these choices. 4.0 Coding Issues As for the coding issues discussed initially, I 'd like to keep those in mind when discussing the possibilities (e.g. how could they be implemented) without clouding the issue with coding techniques just yet. (Because we all completely think through our ideas before we start programming them right? : ) ) Even so, we need to remember that the system should be extensible. If it works well, I intend to adapt the engine for use with examining objects and other sorts of interaction with the environment around the players. Flexibility is the key - we are looking to support both short conversations, as well as longer ones, and we will need to be able to maintain and dry-run our conversations to ensure that they flow. This section will be expanded along with the others as the topic matures. Bibliography The Journal of Computer Game Design, Volume 6, Number 3. Estvanik, Steve. Designing a Mouse/Command Line Interface. February, 1993. p.10-11. The Journal of Computer Game Design, Volume 6, Number 3. Em, Michele. How to write Interactive Characters and Dialogue. February, 1993. p. 14-5. (Before you ask: "The Journal of Computer Game Design is published six times a year. To subscribe to the Journal, send a check or money order for $36 ($50 outside North America) to: The Journal of Computer Game Design 5251 Sierra Road San Jose, CA 95132 Although I wouldn't if I were you. Not that the effort isn't appreciated, but it's hard to get in-depth articles from starving programmers who are already past deadlines. Articles are 1 - 2 pages and very abstract. The Journal has moved away from code-oriented articles in favor of "interactive storytelling" types. I also cannot vouch for the accuracy of this information. I stopped getting it a year ago after the first (and only year) of my subscription.) Hartnell, Tim. Creating Adventure Games on Your Computer. Ballantine Books. New York, New York. 1984.
  18. Click the link (PDF) to view the paper by Victor Allis entitled Searching For Solutions in Games and Artificial Intelligence, published in 1994. View: Click here
  19. Courtesy of Amit Patel Newsgroup: comp.ai.games From: andrew@cs.uct.ac.za (Andrew Luppnow) Date: Fri, 2 Dec 1994 10:10:50 +0200 (SAT) This document proposes an approach to the problem of designing the AI routines for intelligent computer wargame opponents. It is hoped that the scheme will allow the efficient, or at least feasible, implementation of opponents which are capable of formulating strategy, rather than behaving predictably according to fixed sets of simple rules. In the text below, "DMS" is an abbreviation for "decision-making-system". I use the term very loosely to denote any programming subsystem which accepts, as input, a "situation" and which generates, as output, a "response". The DMS may be a simple neural network, a collection of hard-coded rules, a set of fuzzy logic rules, a simple lookup table, or whatever you want it to be! It's most important feature is that it must be SIMPLE and TRACTABLE - in particular, it must accept input from a small, finite set of possible inputs and generate output which belongs in a similarly small, finite set of possible outputs. Some time ago I asked myself how a programmer might begin to implement the AI of a wargame which requires the computer opponent to develop a sensible military strategy. I eventually realized that simply feeding a SINGLE decision-making system with information concerning the position and status of each friendly and enemy soldier is hopelessly inefficient - it would be akin to presenting a general with such information and expecting him to dictate the movement of each soldier! But in reality a general doesn't make that type of decision, and neither does he receive information about the precise location of each soldier on the battlefield. Instead, he receives strategic information from his commanders, makes strategic decisions and presents the chosen strategy to the commanders. The commanders, in turn, receive tactical information and make tactical decisions based on (1) that information and (2) the strategy provided by the general. And so the process continues until, at the very bottom level, each soldier receives precise orders about what he and his immediate comrades are expected to accomplish. The important point is that the whole process can be envisaged in terms of several 'levels'. Each level receives information from the level immediately below it, 'summarises' or 'generalises' that information and presents the result to the level immediately above it. In return, it receives a set of objectives from the level above it and uses (1) this set of objectives and (2) the information from the lower level to compute a more precise set of objectives. This latter set of objectives then becomes the 'input from above' of the next lower level, and so on. In summary: information filters UP through the levels, becoming progressively more general, while commands and objectives filter DOWN through the levels, becoming progressively more detailed and precise. I decided that this paradigm might represent a good conceptual model for the implementation of the AI procedures in a complex strategy-based game: a "tree of DMS's" can be used to mimic the chain of command in a military hierarchy. Specifically, one might use one or more small, relatively simple DMS's for each level. The inputs for a DMS of level 'k' would be the outputs of a level (k+1) DMS and the information obtained by 'summarising' level (k-1) information. The outputs of the level k DMS would, in turn, serve as inputs for one or more level (k-1) DMS's. Outputs of the level zero DMS's would be used to update the battlefield. "Top brass" - fewer, MORE GENERAL options allow lookahead and Level 3 ^ o "what-if reasoning." /|\ / \ Level 2 / | \ o o | /|\ |\ Level 1 | o o o o o \ | / /| | | | |\ Level 0 \|/ o o o o o o o Individual soldiers - V many options, but decision-making is As information simple and doesn't filters UP the attempt "lookahead", tree, it becomes "what-if reasoning", more general. As etc. objectives filter DOWN the tree, they become more specific. The main advantage of this scheme is that it allows the "higher levels" of the hierarchy to formulate strategy, without being overwhelmed by the immense and intractably large number of possibilities which the computer AI would have to consider if it possessed only information about individual soldiers. Indeed, at the topmost level, decisions would involve rather abstract options such as "direct all military activity towards seizing territory X", or "conduct wars of attrition in territories X, Y, and Z", or "buy time - stick to diplomacy for the time being", or "avoid direct military engagement - concentrate on disrupting enemy supply routes", etc. Under these circumstances, it would be feasible for the computer to attempt a certain amount of "lookahead", or to consider "what-if" scenarios - something which would be out of the question if options were presented in terms of the actions of individual soldiers. At the time of writing this, I haven't yet had the opportunity to explore an implementation of these ideas in a working game, but if anybody DOES enjoy some practical success with these ideas, I'd be interested in hearing from him/her! --- Andrew Luppnow
  20. Snake movement probably has been asked and answered many times before. I managed to do some basic snake movement. But I find it hard to fix the distance. Let me explain my problem. The code I am using is like this: const dx = this.tracer.x - this.x; const dy = this.tracer.y - this.y; const actualDistance = Math.hypot(dx, dy); this.vx = this.tracer.speed * ( dx / actualDistance ) || 0; this.vy = this.tracer.speed * ( dy / actualDistance ) || 0; if (actualDistance >= this.distance) { this.x += this.vx; this.y += this.vy; } else { this.x += lerp(0, this.vx, actualDistance / this.distance); this.y += lerp(0, this.vy, actualDistance / this.distance); } The above code is in the "update" function of each snake segment. Each segment will follow the previous segment to its target position. The tracer means the body which is following by current body. The distance is a pre-calculated fixed value. I want to move the snake at normal speed, or at a higher speed, or slow down to normal speed. Like that in slither.io. This is not hard to do using my script. I can move my snake at normal speed or speed up or slow down with all the bodies following the previous one. I can also turn or rotate the snake smoothly. But there is one problem when I try to move fast and rotate at the same time. The snake will squeeze shorter which means all the distance between two adjacent bodies become shorter. So the snake looks like a smaller one when it is doing a fast turn. This will last until it slows down its speed to normal and it's back to its normal shape. All I want is make it same size as normal no matter how I turn or rotate the snake at any speed. Can this be achieved?
  21. I have a set of tiles in an hexagonal coordinate system, and I want to see whether it forms an "almost convex" region. By almost convex, I mean that a square with zigzaging hex edges would still count as convex. The idea is to split non convex regions into convex ones, and merge small regions into larger convex ones. What I don't want is merging a corridor with a room or 2 rooms separated by a wall together. I was thinking about sweeping a line along 2 axis and see whether it goes through any missing tile (in case of diagonal, the check would fail only if both tiles are missing). Would that work? Edit: it wouldn't, as a L or cross shaped area would pass. How can I do it?
  22. Wilberforce Colorbleed Hello, we have recently released our new plugin - Colorbleed. Free Demo (full-featured) is available for download (Unity 5.4 and higher). About Colorbleed Color bleeding is when reflected light transfers the color of surface to surrounding objects. This resembles reflections on matte surfaces. Add new levels of visual quality to your scene with this great asset. Easy to use and control, lets you select exactly the balance of performance and quality your project deserves. See the video Get The Free Demo Implemented as two different algorithms that makes the asset perfect for both realtime graphics in games and for more demanding pre-rendered animations or stills. - Point Cloud algorithm is a simple and fast solution - it gets good speed performance with nice visual results. - Ray Marching is slower but with better appearance - recommended for model visualizations, interior designs, videos etc. Colorbleed plugin can also be setup to produce Ambient Occlusion like effects. If you like Colorbleed and wish to use it please buy it at Unity Asset Store to support its development. Also let us know what you think, your feedback is welcome.
  23. I'm having trouble programming a collision system, I had one working reasonably well when only velocity was being handled, or only rotation is being handled, by using light casting algorithms at the verticies, treating one object as stationary, and the other with the sum of the movements. But I can't figure out how have velocity, scaling, rotation, and bounding box changes due to the frame of the sprite changing. Typically, when I find some instructions there isn't any obvious way to apply it to the bounding box changing. I'm also unsure if GJK is applicable to this situation, because the objects are meant to stay inside the level geometry, rather than outside of it (this makes visibility testing faster). More specifically, the level is comprised of convex quads, where each edge has a permeability, if that permeability is higher than the object solidity the object doesn't check for collision against it. So essentially, for each side of the object's bounding box, I have a line segment S1 representing the edge of the object at the start of the tick, and a line segment S2 representing the end of the tick, and a line segment R representing the edge of the level geometry to test collision against. It occurred to me that I could look for intersections between the face formed by S1 and S2, and the plane formed by R, but that turned out to not be all that helpful. What's a good way to handle this?
  24. I want to simulate eyeballs roll in eyes and I have found and forked this implementation in codepen.io. This is exactly what I need. Smart way but I don't understand why it needs to work like this way. Why is it using `ratioX` and `ratioY` which are calculated from dividing `mouseX` and `mouseY` with their sum? Is there a simpler or even cleverer way to do similar simulation?