sexta-feira, 16 de março de 2012

Explorando a mecânica de Diamond Dash e Bejeweled

Pequeno experimento de hoje para fazer um jogo similar a Diamond Dash


Granja Maluca

Modelando inimigos usando Máquinas de Estado.
O uso da função exp para ajuste de dificuldade



quinta-feira, 2 de fevereiro de 2012

Approximating damping calculations using Taylor expansions in physics simulation

I was happily following Game Physics Engine Development Book when I came across the damping approximation. Without any real explanations we got this 2 lines of code:
// Impose drag.
velocity *= real_pow(damping, duration);
An equation that involves a power of t, I freaked out. How is this possible? And then, researching a little about this I tried to understand how to numerical approximate the friction equation F = -cv. Researching more, I started to explore Box2D code, when I finnaly got a reasonable explanation, but still, there was some magical steps. Time to get my calculus books from the shelf.


This can be coded in as3 as:
velocity.scaleBy(1 - damping*duration);

It's always nice when you have the opportunity to use the stuff you learned in your undergrad course. I still don't understand the power of t thing, but I can accept this solution.

quarta-feira, 1 de fevereiro de 2012

How to make a High Scores board to your Flash game using Google App Engine - Part 1

In this tutorial you will learn how to make an online high scores board to your flash game using Google App Engine infrastructure. It'll be a two posts tutorial, on this first you'll build the server in Python and in the second post the client in AS3.

First, you need to install Python 2.5 and Google App Engine. Both sites are full of tutorials on how to do this in many operating systems.

Google App Engine is a platform for developing and hosting web applications. So, to make things easier, our flash game will interact with our app as it were a web site. How can we do this? Using the UrlRequest and UrlLoader classes

I'm not going to cover more than the really necessary part of Google App Engine framework for making a high scores board. Let's examine these data storage examples of Google's page
from google.appengine.ext import db

class Greeting(db.Model):
    author = db.UserProperty()
    content = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)
We can easily adapt this to our needs:
class Score(db.Model):
     name = db.StringProperty()
     points = db.IntegerProperty()  

This one is bit more confusing, but if you have some experience with web development you can understand why we can turn this
class Guestbook(webapp.RequestHandler):
    def post(self):
      guestbook_name = self.request.get('guestbook_name')
      greeting = Greeting(parent=guestbook_key(guestbook_name))

      if users.get_current_user():
        greeting.author = users.get_current_user()

      greeting.content = self.request.get('content')
      greeting.put()
      self.redirect('/?' + urllib.urlencode({'guestbook_name': guestbook_name}))

to this
class SendScore(webapp.RequestHandler):
    def post(self):
        score = Score()

        score.name = self.request.get('name')
        score.points = int(self.request.get('points'))
        score.put()

        self.response.out.write('ok')

This last snippet is going to get the variables name and points from a urlrequest and save them on Score database. For more explanations on this check the original example.

And finally, we need to list the first nth players (in this case, 15):
class MainHandler(webapp.RequestHandler):
    def get(self):
        #self.response.out.write('Hello world 2!')

        scores = db.GqlQuery("SELECT * FROM Score ORDER BY points DESC LIMIT 15")

        for score in scores:
            self.response.out.write(score.name)
            self.response.out.write('\t')
            self.response.out.write(str(score.points))
            self.response.out.write('\n')

def main():
    application = webapp.WSGIApplication([('/', MainHandler),
                                          ('/sendscore', SendScore)],
                                         debug=True)
    run_wsgi_app(application)


if __name__ == '__main__':
    main()
It's very straightforward if you know some SQL and Python. The characters \t and \n are used to parse the data in as3. It's done. In the next part we'll learn how to communicate with this server through as3 using the flash.net API.

domingo, 29 de janeiro de 2012

Portfolio


games

Fui responsável pelo game design e toda a programação deste jogo. Este jogo foi feito utilizando o framework de desenho PIXI.


Physiojoy - Therapeutic - Game Developer
Neste jogo fui responsável pela implementação de parte da lógica de jogo, e também da integração com Kinect, este projeto é feito com a engine Unity.


Hotpark é um advergame para facebook. Fui responsável pela implementação do gameplay utilizando flixel, um detalhe interessante foi o 3D falso que foi usado controlando o tamanho dos objetos, além disto também animei as interfaces por código. Neste jogo também fiz a integração com facebook e o highscore.


Este foi um experimento que fiz para implementar o algoritmo de inteligência artificial minimax. 


Metamorphosis foi um jogo que eu e um amigo fizemos em 48 horas para um desafio online, ele foi responsável pela arte e parte do level design e eu pelo game design e programação, foi utilizada a engine flixel.

demos
Este demo foi um trabalho da matéria computação gráfica do meu curso de ciência da computação. Nesta demonstração tive que implementar um loader de .obj, além da lógica de skybox e movimentação da nave.


Este foi um experimento para aplicar um algoritmo de busca em profundidade. Também gostei das cores que escolhi.

sexta-feira, 23 de dezembro de 2011

Estudar aplicação ou linguagem de programação?

Aconteceu comigo, e acho que deve acontecer com a maioria dos desenvolvedores, o momento onde aprender novas linguagens de programação não me permite resolver problemas que eu não resolvia antes, até porque a maioria das linguagens mainstream vivem copiando recursos umas das outras.

Mas então, como eu vou continuar progredindo para programar a Matrix? Simples, desenvolva programas que você nunca fez, e aconselho você a usar a linguagem e ambiente mais produtivo que estiver a sua disposição. Por exemplo, eu sou um aspirante à desenvolvedor de jogos, já tentei muita coisa, desde C com Allegro, XNA/C#, até C++/OpenGL, e acabou que o único ambiente que tinha uma boa IDE e me permitia experimentar coisas rápido foi a AS3 do flash no FlashDevelop.

Este é um ponto crucial que muita gente costuma ignorar, a IDE. A linguagem de programação é grande parte do pipeline de trabalho, mas não é o pipeline inteiro, para se ser produtivo e fazer as coisas sem se sentir frustrado, o ambiente inteiro precisa ser rápido e te ajudar a cometer menos erros.

Se você quiser ser um melhor desenvolvedor, terá que se arriscar aprendendo a programar novos tipos de aplicações, sejam elas, desktop, web, interativas, de inteligência artificial, ou até mesmo controle de estoque, caso você não tenha feito um. E este nível de granularidade pode diminuir cada vez mais, por exemplo, você é um programador de sistemas web php. Crie uma limitação fictícia onde o seu cliente terá milhões de pageviews diários e o código precisa ser todo escrito em C++. Ótimo, agora você precisa aprender a fazer um web server. No final do processo, vai entender muito mais sobre suas páginas php e poderá pegar projetos muito mais ousados.

Enfim, o bom programador programa qualquer coisa em qualquer linguagem. Até hoje me impressiona os jogos de Super Nintendo e Megadrive terem sido feitos em Assembly, assembly... Eu sempre uso este fato como fator motivacional para continuar aprendendo, por que se eles fizeram aquilo tudo em Assembly, qualquer coisa é possível em Linguagem de Alto Nível Cool da Moda.

Mas não deixe de aprender novas linguagens de programação, ainda mais se elas forem de algum paradigma que é alienígeno a você, no meu caso estou me aventurando aos poucos no paradigma puramente funcional através de Common Lisp.

terça-feira, 20 de dezembro de 2011

Achievements list for the game programmer

CHECK:  You coded everything
SEMI-CHECK: You used some engine

  • "Guess the number" / Hangman (basic interface, select data from a database) CHECK
  • Tic-Tac-Toe / Rock-Paper-Scissors (turn-based gameplay, opponent AI) CHECK
  • Arkanoid / Pong (collisions, stable frame rate, score, levels) SEMI-CHECK
  • Tetris (data structures and how they relate to gaming)
  • 1942 / Shoot-em-up (enemies, bullets)
  • simple platformer / pinball game if your engine does platformers (gravity-based collisions) SEMI-CHECK
  • Bomberman / Pacman (tile-based movement, complex enemy AI)
  • Two-player game of any of the types above (two player inputs) CHECK
  • Roguelike / Diablo (Inventory management, multiple enemy AIs, saving and loading complex game states)
  • Faceball / Wolfenstein 3D (basic 3d movement and rendering)
  • Network turn-based game (basic networking) CHECK
  • Gimmicky 3D third-person platformer (physics, complex 3d movement)
  • Network real-time game (Client-server synchronism, lag)
  • MMORPG (Persistent world)
What's your list like?