Any one up for a practice pygame project.

Re: Any one up for a practice pygame poroject.

Postby Yoriz » Thu Jun 27, 2013 7:21 pm

Ive not actually done any programming with pygame, i did recently finish a online course 'An Introduction to Interactive Programming in Python' where the final project was a asteroid like game.
It uses codeskultper which runs python in the browser, i think the coding is probably quite similar to pygame so you could have a look how they got us to organize the code, maybe it will give ideas on pygame codeing, it runs best in the chrome browser.
All the globals are just how got codeskulpter to deal with events, i wouldn't want to use them normally.
http://www.codeskulptor.org/#user16_bgepvzsoDW_26.py
New Users, Read This
Join the #python-forum IRC channel on irc.freenode.net!
Spam topic disapproval technician
Windows7, Python 2.7.4., WxPython 2.9.5.0., some Python 3.3
User avatar
Yoriz
 
Posts: 565
Joined: Fri Feb 08, 2013 1:35 am
Location: UK

Re: Any one up for a practice pygame poroject.

Postby metulburr » Thu Jun 27, 2013 8:35 pm

OK regarding the pause
Code: Select all
import pygame


class Player:
    def update(self, scr):
        #scr.blit()
        pass
       
class Enemy:
    def update(self, scr):
        #scr.blit()
        pass
       

class Control:
    def __init__(self):
        pygame.init()
        self.screensize = (400,400)
        self.screen = pygame.display.set_mode(self.screensize)
        pygame.display.set_caption('Plants VS Zombies')
        self.clock = pygame.time.Clock()
        self.gamestate = True
        self.pause = False
        self.keys = None
        self.player = Player()
        self.enemy = Enemy()
       
        self.mainloop()
       
    def text(self, displaytext, color=(255,255,255), size=35, ul=False, bold=False,
            ital=False, font='timesnewroman'):
        font = pygame.font.SysFont(font, size)
        font.set_underline(ul)
        font.set_bold(bold)
        font.set_italic(ital)
        label = font.render(displaytext, 1, color)
        return label
       
    def mainloop(self):
        while self.gamestate:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.gamestate = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_p:
                        if self.pause:
                            self.pause = False
                        else:
                            self.pause = True

            if self.pause:
                self.screen.fill((0,0,0))
                self.screen.blit(self.text('GAME PAUSED'), (0,0))
                self.screen.blit(self.text('Press p to unpause'), (0,35))
                pygame.display.update()
                print('pause screen')
            else:
                self.screen.fill((0,0,0))
                self.screen.blit(self.text('GAME IN PROGRESS'), (0,0))
                self.screen.blit(self.text('Press p to pause'), (0,35))
                self.update()
                print('game play screen')
               
           
           
    def update(self):
       
        self.keys = pygame.key.get_pressed()
        self.player.update(self.screen)
        self.enemy.update(self.screen)
        pygame.display.flip()
           
           
if __name__ == '__main__':
    app = Control()


and the drawings and such are handled by their individual class, being passed the screen
New Users, Read This
version Python 3.3.2 and 2.7.5, tkinter 8.5, pyqt 4.8.4, pygame 1.9.2 pre
OS Ubuntu 13.04, Mint 11, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
User avatar
metulburr
 
Posts: 1096
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: Any one up for a practice pygame poroject.

Postby DrakeMagi » Thu Jun 27, 2013 10:06 pm

Here an example what I'm talking about.
Code: Select all
import os
import pygame
import random
pygame.init()

os.environ['SDL_VIDEO_CENTERED'] = '1'
       
class cHandle(object): pass

# polymorph class
class Page(object):
   handle = cHandle()

   def Entrance(self):
      pass
    
   def Exit(self):
      pass
    
   def Blit(self, surface):
      pass
    
   def Event(self, event):
      pass

   def Update(self, tick):
      pass
    
   @property
   def Handle(self):
      return Page.handle
      
# handle window and page flipping
class Handler(object):
   def __init__(self, caption, width, height, flags = 0, depth=0 ):
      self.screen = pygame.display.set_mode( (width, height), flags, depth )
      pygame.display.set_caption( caption )

      self.clock = pygame.time.Clock()
      self.fps = 60

      self.__current_page = None
      self.__new_page = None

      self.Pages = {}
      Page.handle.Pages = self.Pages
      Page.handle.SetPage = self.SetPage
      Page.handle.GetSize = self.GetSize
      Page.handle.GetRect = self.GetRect
   
   def GetSize(self):
      return self.Screen.get_size()

   def GetRect(self):
      return self.Screen.get_rect()

   def SetPage(self, name):
      self.__new_page = self.Pages[name]

   def Loop(self):
      running = True;
    
      while(running):
         if self.__new_page is not None:
            if self.__current_page is not None:
               self.__current_page.Exit()
            self.__current_page = self.__new_page
            self.__current_page.Entrance()
            self.__new_page = None
            pygame.event.clear()

         for event in pygame.event.get():
            if event.type == pygame.QUIT:
               running = False
          
            elif self.__current_page is not None:
               self.__current_page.Event(event)

         if self.__current_page is not None:
            self.__current_page.Blit(self.screen)
            tick = pygame.time.get_ticks()
            self.__current_page.Update(tick)

         pygame.display.flip()
         self.clock.tick(self.fps)
      pygame.quit()

class IntroPage( Page ):
   def __init__(self):
      font = pygame.font.Font(None, 50)
      self.text = font.render('Intro Page', 1, (255,255,255))
      self.text_rect = self.text.get_rect()
      self.text_rect.centerx = 400
      self.text_rect.top = 10
      
      self.anykey = font.render('Press Any Key', 1, (200,200,255))
      self.anykey_rect = self.anykey.get_rect()
      self.anykey_rect.centerx = 400
      self.anykey_rect.bottom = 590
      
   def Blit(self, surface):
      surface.fill((0,0,0))
      surface.blit(self.text, self.text_rect.topleft)
      surface.blit(self.anykey, self.anykey_rect.topleft)
      
   def Event(self, event):
      if event.type in [pygame.KEYDOWN, pygame.MOUSEBUTTONDOWN]:
         self.Handle.SetPage('Game')
         
class Box(object):
   def __init__(self):
      self.move = 0, 0
      while self.move[0] == 0 and self.move[1] == 0:
         self.move = random.randint(-3, 3), random.randint(-4, 4)
      
      color = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
      rnum = random.randint(10, 30)
      self.image = pygame.Surface((rnum, rnum))
      self.image.fill(color)
      self.rect = self.image.get_rect()
      self.rect.topleft = random.randint(20, 750), random.randint(20, 550)
      self.tick = 0
      
   def Blit(self, surface):
      surface.blit(self.image, self.rect.topleft)
      
   def Update(self, tick):
      if tick > self.tick:
         self.tick = tick + 20
         self.rect.move_ip( *self.move )
         
         x, y = self.move
         if self.rect.left < 0 or self.rect.right > 800:
            self.move = -x, y
         if self.rect.top < 0 or self.rect.bottom > 600:
            self.move = x, -y
      
class GamePage( Page ):
   def __init__(self):
      self.boxes = [Box() for x in range(10)]
   
   def Entrance(self):
      self._pauseText('Press p to Pause', (200,200,200))
      
   def _pauseText(self, pystr, color):
      font = pygame.font.Font(None, 30)
      self.pause_text = font.render(pystr, 1, color)
      self.pause_rect = self.pause_text.get_rect()
      self.pause_rect.centerx = 400
      self.pause_rect.y = 5
      
   def Blit(self, surface):
      surface.fill((0,0,40))
      for box in self.boxes:
         box.Blit(surface)
      surface.blit(self.pause_text, self.pause_rect.topleft)
         
   def Event(self, event):
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_p:
            self.Handle.SetPage('PauseGame')
   
   def Update(self, tick):
      for box in self.boxes:
         box.Update(tick)
         
class PauseGamePage( Page ):
   def __init__(self):
      font = pygame.font.Font(None, 30)
   
   def   Entrance(self):
      self.Handle.Pages['Game']._pauseText('Press p to Unpause', (100,200,100))
      
   def Blit(self, surface):
      self.Handle.Pages['Game'].Blit(surface)
   
   def Event(self, event):
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_p:
            self.Handle.SetPage('Game')
   
def main():
   screen = Handler('Test',800,600)
   screen.Pages['Intro'] = IntroPage()
   screen.Pages['Game'] = GamePage()
   screen.Pages['PauseGame'] = PauseGamePage()
   
   screen.SetPage('Intro')
   screen.Loop()


if __name__ == '__main__':
   main()


what i mean about Page Flipping is changing which class has control.

Page class is like your control class except the Handler process it.
The Handler uses page polymorph class and send signals back to control page.

Plants Vs Zombies has a LoadPage, IntroPage, StartPage, NamePage, PlantPickingPage, GamePage, and more.
That control class is going to get pretty big.
DrakeMagi
 
Posts: 72
Joined: Sun May 12, 2013 8:36 pm

Re: Any one up for a practice pygame poroject.

Postby metulburr » Thu Jun 27, 2013 10:46 pm

ah well looking at it now, it looks a lot better organized

I guess the first order of business, would be to go about 1) removing my Control class for your structure...if everyone agrees?
New Users, Read This
version Python 3.3.2 and 2.7.5, tkinter 8.5, pyqt 4.8.4, pygame 1.9.2 pre
OS Ubuntu 13.04, Mint 11, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
User avatar
metulburr
 
Posts: 1096
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: Any one up for a practice pygame poroject.

Postby metulburr » Thu Jun 27, 2013 11:38 pm

to be honest there are a few things that drive me nuts about your code...most are small.

Is there a reason you are making vars private?
Code: Select all
self.__current_page = None


capping method names
Code: Select all
def Loop(self):


uneeded parenths:
Code: Select all
while(running):


Are you testing this against False also as a reason to not using if self.__new_page:
Code: Select all
if self.__new_page is not None:


This part is prolly just me, as i have dual monitors, but whenever someone uses this it splits it in the center half on one monitor and half on the other monitor, somtimes resulting in trouble finding it to be honest.
Code: Select all
os.environ['SDL_VIDEO_CENTERED'] = '1'


but for some reason i have the urge to go and change this sort when i look at your code, lol
New Users, Read This
version Python 3.3.2 and 2.7.5, tkinter 8.5, pyqt 4.8.4, pygame 1.9.2 pre
OS Ubuntu 13.04, Mint 11, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
User avatar
metulburr
 
Posts: 1096
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: Any one up for a practice pygame poroject.

Postby Mekire » Thu Jun 27, 2013 11:40 pm

Drake's Handler and Pages are essentially the same thing as my Control class and States. The handler/controller has a dictionary of pages/states that it updates via polymorph. When you want a new phase to your game, you add a new page/state. Anyway, I am kinda on the side of doing something a little more original. I don't think a PVZ clone would take very long though so go ahead :D (I think you guys will finish the code fairly quickly and find you have endless art requirements left though). I do tend to think that Drake and I would clash a bit on the underlying core of the program however, so I am leaning towards sitting this one out and seeing what you guys come up with.

-Mek
User avatar
Mekire
 
Posts: 814
Joined: Thu Feb 07, 2013 11:33 pm
Location: Amakusa, Japan

Re: Any one up for a practice pygame poroject.

Postby metulburr » Thu Jun 27, 2013 11:43 pm

Drake's Handler and Pages are essentially the same thing as my Control class and States.

As i am looking at it i am starting to see that. But Drake's seems more of a complicated process (no offense Drake), especially to a pygame beginner like me

I do tend to think that Drake and I would clash a bit on the underlying core of the program however, so I am leaning towards sitting this one out and seeing what you guys come up with.

See that what i thought originally. But my interest in working with other programmers intrigues me, enough to wheel and deal the core of the program. If Drake insists on his core style, i am OK with it, although I would prefer Mekire's. So this is where the clash is that i am not sure what to do when you have multiple programmers.

Anyway, I am kinda on the side of doing something a little more original

ideas?
New Users, Read This
version Python 3.3.2 and 2.7.5, tkinter 8.5, pyqt 4.8.4, pygame 1.9.2 pre
OS Ubuntu 13.04, Mint 11, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
User avatar
metulburr
 
Posts: 1096
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: Any one up for a practice pygame poroject.

Postby Yoriz » Thu Jun 27, 2013 11:51 pm

Mekire wrote:seeing what you guys come up with.
-Mek

Well i just managed to get a white circle to appear in probably completely the wrong way, so i dont think there's much chance of me completing anything quickly and i have no idea of pygames underlying core that you guys are bouncing of the walls at each other..... goes off to make the circle move a bit

haha i made more of a smudge then a moving circle :P
New Users, Read This
Join the #python-forum IRC channel on irc.freenode.net!
Spam topic disapproval technician
Windows7, Python 2.7.4., WxPython 2.9.5.0., some Python 3.3
User avatar
Yoriz
 
Posts: 565
Joined: Fri Feb 08, 2013 1:35 am
Location: UK

Re: Any one up for a practice pygame poroject.

Postby metulburr » Thu Jun 27, 2013 11:56 pm

Well i just managed to get a white circle to appear in probably completely the wrong way, so i dont think there's much chance of me completing anything quickly and i have no idea of pygames underlying core that you guys are bouncing of the walls at each other..... goes off to make the circle move a bit

lol

I don't think a PVZ clone would take very long though so go ahead

I dont think this is going to be quick.
New Users, Read This
version Python 3.3.2 and 2.7.5, tkinter 8.5, pyqt 4.8.4, pygame 1.9.2 pre
OS Ubuntu 13.04, Mint 11, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
User avatar
metulburr
 
Posts: 1096
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: Any one up for a practice pygame poroject.

Postby Yoriz » Fri Jun 28, 2013 12:01 am

I'm off to a good start just need to find a use case in the game for a white circle that flys of the screen leaving a trail behind it :lol:
New Users, Read This
Join the #python-forum IRC channel on irc.freenode.net!
Spam topic disapproval technician
Windows7, Python 2.7.4., WxPython 2.9.5.0., some Python 3.3
User avatar
Yoriz
 
Posts: 565
Joined: Fri Feb 08, 2013 1:35 am
Location: UK

Re: Any one up for a practice pygame poroject.

Postby metulburr » Fri Jun 28, 2013 12:51 am

OK so what direction are we going with this?
Are we agreed on doing a mimic of plants vs zombies? I guess that should be the first question.

To go with Mekire's or Drakes core program style?
New Users, Read This
version Python 3.3.2 and 2.7.5, tkinter 8.5, pyqt 4.8.4, pygame 1.9.2 pre
OS Ubuntu 13.04, Mint 11, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
User avatar
metulburr
 
Posts: 1096
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: Any one up for a practice pygame poroject.

Postby DrakeMagi » Fri Jun 28, 2013 12:58 am

Drake's Handler and Pages are essentially the same thing as my Control class and States.

As i am looking at it i am starting to see that. But Drake's seems more of a complicated process (no offense Drake), especially to a pygame beginner like me

I take no offense. I think it easy myself.

Is there a reason you are making vars private?
Code: Select all
self.__current_page = None

Yes. post to use SetPage to change page

capping method names
Code: Select all
def Loop(self):

bad habit i got into. Never took the time to look at python pep8.
something i have to work on.

uneeded parenths:
Code: Select all
while(running):

c++ habbit coming out

Are you testing this against False also as a reason to not using if self.__new_page:
Code: Select all
if self.__new_page is not None:

I think they were discussing style for that at the time.

This part is prolly just me, as i have dual monitors, but whenever someone uses this it splits it in the center half on one monitor and half on the other monitor, somtimes resulting in trouble finding it to be honest.
Code: Select all
os.environ['SDL_VIDEO_CENTERED'] = '1'


you do know you can just comment that out.
just something i do.

Hey now. I not going to be the guy that breaks the camels back.
I was just making a suggestion. At least it got people talking.
I will have to learn how to do it in your frame work. or let you handle it.
since 1 vote is not enough.

what you mean doing something a little more original ?

Yoriz did give some quick graphic option.

To go with Mekire's or Drakes core program style?

you know what way i would vote.
DrakeMagi
 
Posts: 72
Joined: Sun May 12, 2013 8:36 pm

Re: Any one up for a practice pygame poroject.

Postby Mekire » Fri Jun 28, 2013 1:31 am

His method is identical to mine save for what I see as a little C(++) influence. I believe this is the explanation for the psuedoprivate members as well as the naming convention inconsistencies. I also don't find writing getters for things I can already get useful (IE why write a getter Handler.get_rect that just calls Surface.get_rect()). I do think that you guys should pep8 everything before you start so you are on the same page (at least in terms of naming conventions; I think 80 character line limits are a bit archaic and silly)

On the os.environ['SDL_VIDEO_CENTERED'] = '1' I agree your case of dual monitors is an exception but I think using it is better than the alternative of the window appearing randomly. I believe there is another setting to specifically say the screen offset of the window which would probably work better in your case but I would have to research.

Couple trivial notes. You need to call set_caption (and set_icon) before you call set_mode for the display. Also I think you need to make your handler tell the next state what the previous state was in the control methods. This is for cases when a state can be accessed from different portions of the game.

-Mek

Edit:
This is fairly typical for what my control classes look like. The below was a three state game. I tend to custom tailor them to each game rather than use it as a static framework:
Code: Select all
class Control:
    def __init__(self):
        self.screen = pg.display.get_surface()
        self.done = False
        self.Clock = pg.time.Clock()
        self.fps = 50

        self.state_dict = {"SPLASH":splash.Splash(),
                           "TITLE" :title.Title(),
                           "GAME"  :game.Game()}

        self.state_name = "SPLASH"
        self.State = self.state_dict[self.state_name]

    def update(self):
        if self.State.done:
            self.state_name = self.State.next
            self.State.__init__()
            self.State = self.state_dict[self.state_name]
        self.State.update(self.screen)

    def event_loop(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_ESCAPE:
                    if self.state_name in ("SPLASH","TITLE"):
                        self.done = True
            #Pass the event along to the current state.
            self.State.get_event(event)

    def main(self):
        while not self.done:
            self.event_loop()
            self.update()
            pg.display.update()
            self.Clock.tick(self.fps)
        pg.quit();sys.exit()
User avatar
Mekire
 
Posts: 814
Joined: Thu Feb 07, 2013 11:33 pm
Location: Amakusa, Japan

Re: Any one up for a practice pygame poroject.

Postby metulburr » Fri Jun 28, 2013 2:45 pm

what you mean doing something a little more original ?

i believe he means a game that we can call our own, and claim ownership of.

@Mekire
ok makes more sense.
New Users, Read This
version Python 3.3.2 and 2.7.5, tkinter 8.5, pyqt 4.8.4, pygame 1.9.2 pre
OS Ubuntu 13.04, Mint 11, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
User avatar
metulburr
 
Posts: 1096
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: Any one up for a practice pygame poroject.

Postby DrakeMagi » Fri Jun 28, 2013 4:26 pm

@Mekire
I see i not the only one that doesn't follow pep8.
but my projects will follow pep8. Even thou i don't like there underscore(_).
I believe camelCase would be better. It just matter of preference.

We do somethings alike.
I just make class handle there events, and updates.
I also use polymorph class to let people know what to handle

I see you use next, get_event(), done, and update() in your control classes.

but i do questions your use __init__() ?
Do you really need to re init a class.
What happens when variables are pass to the class.
Code: Select all
def update(self):
    if self.State.done:
        self.state_name = self.State.next
        self.State.__init__() # this is where I use entrance
DrakeMagi
 
Posts: 72
Joined: Sun May 12, 2013 8:36 pm

Re: Any one up for a practice pygame poroject.

Postby Mekire » Fri Jun 28, 2013 5:09 pm

DrakeMagi wrote:but i do questions your use __init__() ?
Do you really need to re init a class.
What happens when variables are pass to the class.

The piece I posted just happens to be from a game where no information needed retaining between state changes (as I said I tend to modify them for projects as needed). In more general cases, I give my State classes a function called cleanup which is called during the state flipping. I overload it in the specific states as necessary but might have its default behavior in the base State class call __init__.

As for pep8 my naming conventions follow the standard guidelines. I don't follow every little thing (like as I said 80 character max line width) and I don't always capitalize certain class names like rects or surfaces (I do however always capitalize my own classes and instances of such). CamelCase in the python community is strongly attached to only classes and instances of classes. Using camel case for standard variable names or even capitalizing them is just asking for trouble.

I should also mention that I organize my projects as packages so as to maintain a nice tidy top level directory. The only file I have in my top level directory usually looks like this:
Code: Select all
import pygame as pg
import sys
from data.main import main

if __name__ == '__main__':
    main()
    pg.quit();sys.exit()

-Mek
User avatar
Mekire
 
Posts: 814
Joined: Thu Feb 07, 2013 11:33 pm
Location: Amakusa, Japan

Re: Any one up for a practice pygame poroject.

Postby metulburr » Fri Jun 28, 2013 6:56 pm

I should also mention that I organize my projects as packages so as to maintain a nice tidy top level directory. The only file I have in my top level directory usually looks like this:

This i find the best solution as to when you download a pygame game and there is no structure like this. You end up looking through a ton of modules looking for main.py or a module named the name of the game. It just makes it simple stupid of which module is the start up script.

A question regarding basic imports:
on python3.x:
Code: Select all
from data.main import main

this works as expected for me whereas in python2.x it was unable to find data. Based on the fact of getting best of both worlds, would there be a a simple solution to this.
New Users, Read This
version Python 3.3.2 and 2.7.5, tkinter 8.5, pyqt 4.8.4, pygame 1.9.2 pre
OS Ubuntu 13.04, Mint 11, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
User avatar
metulburr
 
Posts: 1096
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: Any one up for a practice pygame poroject.

Postby Hypernova » Fri Jun 28, 2013 7:37 pm

If everyones goal is to practice programming and learn to work in a team then you're better off making a clone or the concept or the game in my opinion. In my experience working on original projects, a lot of time is spent on conjecture about artistic aspects, plot/ideology and making it all concise. If it's the latter that you want to improve on, then do that, otherwise working on a clone mean the structure and artistic aspects have already been worked through for you allowing you to concentrate on making it work.
Hypernova
 
Posts: 18
Joined: Mon Jun 10, 2013 12:23 am

Re: Any one up for a practice pygame poroject.

Postby DrakeMagi » Fri Jun 28, 2013 11:30 pm

A question regarding basic imports:
on python3.x:
Code: Select all
from data.main import main


i been working on this problem too.
I needed __init__.py in the folder

here what i came up with.
Code: Select all
from __future__ import absolute_import
import os
import sys
if sys.platform == 'win32' :
   import site
   site.addsitedir(os.path.dirname(__file__))
from data.main import main
DrakeMagi
 
Posts: 72
Joined: Sun May 12, 2013 8:36 pm

Re: Any one up for a practice pygame poroject.

Postby metulburr » Sat Jun 29, 2013 12:30 am

i been working on this problem too.
I needed __init__.py in the folder

oh im a dummy, i must of deleted it between tests. Whats interesting is python3.x runs it without a __init__.py in the directory.
New Users, Read This
version Python 3.3.2 and 2.7.5, tkinter 8.5, pyqt 4.8.4, pygame 1.9.2 pre
OS Ubuntu 13.04, Mint 11, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
User avatar
metulburr
 
Posts: 1096
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

PreviousNext

Return to Game Development

Who is online

Users browsing this forum: No registered users and 2 guests