Make_resourceful en namespaces

Welkom bij het tweede deel in de wekelijkse reeks van presentaties die bij 45north worden gegeven. Deze week ga ik het hebben over de Ruby on Rails plugin ‘make_resourceful‘ en zal ik in het kort de zogenaamde ‘namespaces’ binnen Rails behandelen. Ik heb hier samen met mijn collega Daniël Zwijnenburg een presentatie over gehouden bij 45north. We hebben uitgelegd wat make_resourceful is, waarom je het moet gebruiken en wat voor kanttekeningen er zijn. Hiernaast hebben we een hoop voorbeelden gegeven en hebben we in het kort verteld wat namespaces zijn. Ik zal dezelfde volgorde aanhouden voor deze blogpost.

Meer >

Vijanden ontwerpen voor mijn game #2

Bedankt voor de leuke reacties allemaal! Ook hartstikke bedankt voor de feedback. Ik heb er zeker wat aan gehad. Vandaag heb ik de vijanden laten zien aan mijn teamgenoten en ze vonden dat het nog iets gruwelijker kon. Ik ben aan de slag gegaan en wat je hier ziet is het eindresultaat. Even laten goedkeuren en ik kan gaan animeren!

Is wel iets gruwelijker, toch? ;)

Vijanden ontwerpen voor mijn game

Ik ben de laatste weken bezig om samen met een team van zes man een complete game te maken. Ik heb onder andere het ontwerpen van de vijanden op mezelf genomen. Ik moet een paar vijanden maken en als iedereen ermee akkoord is kan ik ze gaan animeren. Eerst heb ik zitten schetsen met mijn nieuwe Wacom Intuos4 tablet. Daarna ben ik ze gaan tekenen in Illustrator en heb ik ze daar ook ingekleurd. Hierna heb ik ze weer in Photoshop wat schaduwen gegeven. Ik wilde mijn eerste vijanden even met jullie delen.

Laat even in de comments weten wat je ervan vind. Alle feedback is uiteraard welkom!

Complexe formulieren met acts_as_virtual_attribute

Ik was vanavond aan het stoeien met een complex formulier voor een applicatie waarmee ik bezig ben voor mijn werk. Ik moest aan een ‘post’ meerdere code snippets, tags en bestanden toevoegen. Dit deed ik op de manier uit Railscast afleveringen #73, #74 en #75. Dit werkte in het begin erg goed, maar ik kwam er al gauw achter dat er een aantal problemen waren. Als ik bijvoorbeeld nieuwe bestanden, tags of code snippets wilde toevoegen in de edit actie, gebeurde er allemaal rare dingen. Sommige velden werden gewoon genegeerd, waardoor ze uit de database werden verwijderd. Bestanden die werden geüpload waren 0kb in grootte, wat natuurlijk niet goed is. Ik werd er helemaal gek van en ben maar gaan zoeken naar mogelijke oplossingen. Ik stuitte op een geweldige oplossing in de vorm van een plugin: acts_as_virtual_attribute.

Ik installeerde de plugin en verving al mijn code met 1 regel: acts_as_virtual_attribute. Tot mijn verbazing werkte dit helemaal perfect. Alle problemen waren verdwenen als sneeuw voor de zon! De plugin heeft ervoor gezorgd dat ik deze avond niet uren heb moeten debuggen en daar ben ik de maker ervan heel dankbaar voor. Hiernaast is heel veel code verdwenen, waardoor alles een stuk overzichtelijker is. Als bedankje aan de maker zal ik een post wijden aan het gebruik van deze plugin.

UPDATE: Blijkbaar is er sinds Rails 2.3.0 een functie binnen Rails die alles doet wat deze plugin ook doet. Deze functie heet accepts_nested_attributes_for en stop je ook gewoon in de model. Het werkte wel aardig, maar toen ik bestanden ermee probeerde te uploaden had ik weer hetzelfde probleem als wat ik eerst had. Alle bestanden waren 0kb bestanden, waardoor ik toch maar ben gebleven bij deze plugin. Het werkt gewoon goed en je kunt het ook gemakkelijker de code aanpassen. Met dat ‘accepts_nested_attributes_for’ gaat alles via het Rails framework, waardoor je niet al te veel kan customizen. Als je er toch meer over wilt lezen raad ik je aan het volgende artikel te lezen: http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes.

Meer >

REST en Ruby on Rails

Bij 45north zijn we sinds kort begonnen om elke week opgedane kennis met elkaar te delen door korte presentaties te geven aan alle aanwezige collega’s. Deze presentaties gaan vooral over het gebruik van Ruby on Rails, maar kunnen ook over dingen als HTML, CSS en Actionscript gaan. Ik ben van plan om elke week samen met iemand anders een presentatie voor te bereiden en te geven. Nu leek het mij wel leuk om al deze presentaties op mijn blog te stoppen in de vorm van een post, zodat iedereen het nog een keer kan nalezen en mensen die niet bij 45north werken toch nog kunnen deelnemen aan deze presentaties.

Vorige week heb ik samen met mijn collega Mark van de Korput een presentatie gegeven over REST binnen Ruby on Rails. We hebben uitgelegd hoe het REST principe precies werkt en hoe je het kunt gebruiken binnen Ruby on Rails. In deze post zal ik alles wat we in de presentatie hebben verteld nog eens haarfijn uitleggen.

Meer >

Handige Ruby helpers

Ik heb toenet even snel een aantal helpers geschreven die je kunt gebruiken in je Ruby on Rails applicaties. Je kunt ze in de normale helpers stoppen, maar natuurlijk ook in de ApplicationController (je kunt ze dan aanspreken vanuit de views door er een helper_method van te maken). Download het bestand via de volgende link: functions.rb.

# Als de naam van de gebruiker in de 'users' tabel is opgedeeld in drieën is het handig
# om een functie te hebben die deze drie kolommen samenvoegt. Stuur het object van de
# gebruiker naar 'get_username' en je krijgt de naam van de gebruiker terug.
def get_username(user)
  return "#{user.first_name} #{user.last_name}" if user.preposition.blank?
  return "#{user.first_name} #{user.preposition} #{user.last_name}" unless user.preposition.blank?
end

# Soms wil je weten of een bepaald bestand bestaat. Dit kun je doen met 'File.exist?'.
# Het is echter misschien iets handiger om hier een simpele helper voor te hebben.
def file?(path)
  File.exist?(path)
end

# Wil je een string van een aantal willekeurige cijfers? Dan kun je natuurlijk zelf een functie schrijven.
# Ik gebruik de volgende functie om een aantal willekeurige cijfers te krijgen. Erg gemakkelijk.
def random_numbers(len)
  random = ""
  len.times { random += rand(10).to_s }
  return random
end

# En dan hier een snelle functie om een random string te maken (met letters en cijfers).
def random_string(len)
  return Array.new(len/2) { rand(256) }.pack('C*').unpack('H*').first
end

# Een hele simpele functie om een tekst een SHA1 hash te geven.
def sha1_hash(text)
  return Digest::SHA1.hexdigest(text)
end

# Een hele simpele functie om een tekst een MD5 hash te geven.
def md5_hash(text)
  return Digest::MD5.hexdigest(text)
end

En dat waren dan de helpers. Heb jij een leuke helper die je wilt delen? Laat het even achter in de comments. Verbeteringen voor deze helpers? Dan kun je dat natuurlijk ook in de comments kwijt.

Vernieuwingen in Rails 3.0

Ruby on Rails logo

Alweer bijna een maand geleden kwam de bèta van Rails 3.0 uit. Ik had beloofd om hier wat over te schrijven en aangezien ik nu de tijd heb gevonden om dit te doen, zal ik nu de leukste vernieuwingen in Rails 3.0 behandelen. Vorige week heb ik een cursus Ruby on Rails gegeven op mijn school. Hierin heb ik presentaties gegeven en de cursisten geholpen bij het leren van Ruby on Rails. In de tijd dat ik geen vragen te beantwoorden had heb ik mezelf in de bèta van Ruby on Rails 3.0 gestort. Ik heb de complete release notes gelezen, filmpjes erover bekeken op railscasts.com, complete slideshows bewonderd en natuurlijk heb ik zelf zitten experimenteren. Het resultaat van dit kleine onderzoek kun je hier lezen.

Als we het over Rails 3.0 hebben zijn er een aantal belangrijke veranderingen die ervoor zorgen dat je Rails op een totaal andere manier zult gaan gebruiken. Zo is het ActiveRecord query gedeelte compleet omgegooid, werken AJAX links op een betere manier, zijn de routes aangepast en is respond_to versimpeld. Ik zal deze belangrijke vernieuwingen één voor één behandelen en zal hierna de wat kleinere veranderingen bespreken. Er is genoeg te bespreken, dus neem even de tijd om de volledige post te lezen.

Meer >

Neutralizer ‘Most polished game’ gewonnen!

Voor de minor Game Design die ik volg kregen we deze week de opdracht om in één week een complete game te bedenken, ontwikkelen en testen. We werden opgedeeld in teams en ik had het geluk om in een ge-wel-dig team te belanden: goed gebalanceerd, gemotiveerd, professioneel en creatief. We waren met zijn vijven en hadden één programmeur en vier designers. De vier designers hebben het hele spel verzonnen en ontworpen en de programmeur heeft alles erg goed in elkaar gezet. De designers maakten het geluid (niet zomaar geluiden van internet gejat), het design, de levels en alle andere onderdelen. Het is echt ‘onze game’ geworden. Ik presenteer daarom vol trots onze game: Neutralizer.

In Neutralizer bestuur jij een poppetje die met zijn geweer plusjes en minnetjes kan schieten. Hiermee kunnen verschillende blokjes in de levels kapot worden gemaakt. Een plus schieten op een ‘min-blokje’ zorgt ervoor dat het min-blokje verdwijnt. Hetzelfde geldt voor een min schieten op een plus-blokje. Blokjes die rusten op een onderliggend blokje vallen naar beneden als je dat blokje wegschiet. Hierdoor zijn er interessante puzzels mogelijk die later in het spel behoorlijk moeilijk kunnen worden. We hebben 10 levels ontworpen die langzaam de gebruiker het spel ‘leren’ en later steeds moeilijker worden. Het heeft een goede ‘learning curve’ en dit hebben we goed gemerkt tijdens al het testen wat is gedaan. Het ontwerpen van alles is ontzettend goed gegaan en we waren vrijdag ook helemaal klaar met het spel en konden het presenteren.

In een ruimte op de zevende verdieping in de Leeuwenburg (HvA gebouw bij Amstel Station) lieten alle Game Design en Game Technology studenten hun game zien. Er zaten een aantal erg leuke games bij die leuk waren om naar te kijken en te spelen. Ons spel was echter de enige game die echt ‘af’ was. Het was een game die met een paar kleine aanpassingen zo op Xbox Live Arcade zou kunnen worden gezet. Het zat goed in elkaar en was gemakkelijk uit te breiden. We hebben daarom ook de prijs ‘Most polished game’ gekregen van de jury. De jury vond dat onze game er met kop en schouders bovenuit stak op het gebied van de compleetheid van de game. Ze vonden dat het goed was uitgedacht en zowat helemaal klaar was. Deze prijs was een geweldige bekroning op ons harde werken deze week en we zijn er uitermate trots op.

En wat heb ik gedaan? Verschillende dingen: gameplay verzorgen, levels designen, de blokjes maken, het team aansturen en nog een paar andere kleine dingen. Ik was deze keer niet de programmeur en heb goed samen kunnen werken met de andere designers. Het is echt een team-effort geweest en vooral de programmeur heeft echt heel goed werk afgeleverd. Hij heeft in Microsoft XNA (programmeer omgeving voor PC en Xbox360 games met de programmeertaal C#) het spel gemaakt en hierdoor kunnen alle Windows gebruikers die dit lezen nu gewoon gaan spelen! Voor de link kun je naar beneden scrollen. Het spel is bedoeld voor de Xbox360 en je kan het dus met een Xbox360 controller spelen. Heb je die niet? Geen probleem. Het werkt ook met muis en toetsenbord.

Wat belangrijk was bij het proces die we hebben doorlopen om de game te maken is het testen. We hebben in korte iteraties gewerkt en steeds na elke iteratie een speler buiten ons team het spel laten testen. Hierdoor kwamen er steeds nieuwe punten naar boven waardoor ons spel zoveel beter is geworden dan het zou zijn geweest als we niet hadden getest. Testen is ontzettend belangrijk voor games en de emoties van de tester observeren is een belangrijk onderdeel van games designen. Bij elke iteratie schreven we de slechte en goede gevoelens van de tester op, waardoor we de slechte gevoelens konden verbeteren. Elke keer pasten we een klein deel van de game aan en keken we of de testpersoon het allemaal snapte. Dit is iets waar je bij het maken van websites ook goed bij stil moet staan, maar is een vereiste voor als je een game gaat maken.

Het project van deze week was erg leuk en ik kijk nu al uit naar de game die we gaan maken voor het grote project. Dit was een van de leukste projecten die ik ooit heb gedaan en ik heb nu al zin om na de vakantie verder te gaan met de minor. We gaan misschien ook Neutralizer verder ontwikkelen om het uit te brengen op Xbox Live Arcade. Hoe dit gaat laat ik weten. Ook als het spel voor het grote project af is maak in een post hierover, zodat je het lekker kan spelen. Ik zal tijdens dit proces ook wat vaker erover posten, zodat jullie ook op de hoogte worden gehouden.

Hier volgt de link om het spel te downloaden. Let wel op: je hebt bepaalde Microsoft software nodig om het spel te spelen. Dit staat uitgelegd op de volgende link:
http://neutralizer.nulian.nl/publish.htm

Voor nog wat extra screenshots en informatie kun je terecht op robinbrouwer.nl:
http://robinbrouwer.nl/cases/show/29

Ga nu maar snel het spel spelen en post jouw beste tijd in de comments hieronder! :)

Ruby on Rails 3.0 BETA!

De bèta voor Ruby on Rails 3.0 is er eindelijk! Je kunt vanaf nu de nieuwste versie van Ruby on Rails installeren en ermee gaan spelen. Er zijn ontzettend veel nieuwe dingen te vinden in deze bèta en ik raad je dan ook aan deze even goed door te nemen voordat je het gaat installeren. Onderaan dit bericht vind je een aantal links die je daarmee op weg helpen. Lees het goed door en als je denkt dat je er klaar voor bent, kun je Rails 3.0 gaan installeren. Een handige tutorial hierover is te vinden in de nieuwste railscast op Railscasts.com.

Ik ga natuurlijk ook Rails 3.0 installeren en ermee spelen. Ik zal later een post maken over al mijn bevindingen. Ik heb de release notes al een beetje doorgelezen en er zitten een aantal erg leuke dingen tussen. Stay tuned! :)

Rails 3.0 bèta release notes
Blogpost over Rails 3.0 bèta
Railscast over Rails 3.0 installeren

Game Design minor is begonnen

Voor mijn opleiding moeten we in het derde jaar een zogenaamde minor volgen. Dit is een kleine opleiding die je kunt volgen om jezelf te verdiepen in materie die iets anders is dan je huidige opleiding. Sommigen volgen de minor van de opleiding zelf, anderen gaan naar een minor van een andere opleiding en er zijn zelfs studenten die naar het buitenland gaan. Ik hoor bij de tweede groep en heb gekozen voor de minor Game Design die wordt georganiseerd door de opleiding Informatica. Samen met de minor Game Technology krijgen we de opdracht om een game te maken. Game Design gaat over het designen van games en Game Technology over het programmeren van games. Ik wilde een keer iets anders doen dan programmeren en aangezien ik games spelen en maken geweldig vind, was Game Design een gemakkelijke keuze.

Ik ben vandaag begonnen met de minor. We hebben een korte introductie gehad waarin werd verteld wat we allemaal gingen doen. Het eerste wat opviel was dat de minor in het Engels gegeven wordt. Er zijn namelijk een aantal buitenlandse studenten die ook deze minor volgen. We kregen te horen dat we in maart voor een project een team moeten vormen van ongeveer vijf of zes studenten. Maximaal twee daarvan mogen van Game Technology komen en er moet in elk team een buitenlandse student komen. Dat wordt dus Engels praten tijdens vergaderingen. Dat lijkt me erg leuk en een goede oefening om mijn Engels te verbeteren.

We zullen verschillende lessen krijgen over hoe we een game kunnen maken. We krijgen les in ‘gameplay’, ‘canon of games’ en ‘game art’. Het lijkt me ontzettend interessant en ik kijk er nu al naar uit. Naast de lessen zullen we dus een project hebben. Dit is een ontzettend vrije opdracht die we met een team van maximaal zes man mogen doen. We gaan namelijk een game maken. Geen opdrachtgever, geen restricties: gewoon een goede game maken. Het mag van alles zijn: RPG, Action, Sport, Puzzle, etc. Het maakt niet uit welk genre je kiest. Je bent helemaal vrij. Dit spreekt mij enorm aan en ik heb al een aantal leuke ideeën voor een game. Ik zal deze later met jullie delen.

Ik ben heel erg enthousiast over de minor en heb er nu al zin in. Ik ga daarom nu even research doen… Ik denk dat Uncharted 2 een goed begin daarvoor is. ;)