Differences between revisions 32 and 33
Revision 32 as of 2009-05-29 06:01:08
Size: 1834
Editor: buf189
Comment: added link to OOP based tutorial with Python and pygame
Revision 33 as of 2010-06-07 08:36:13
Size: 4016
Editor: smp-82-167
Comment: good
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Game Programming With Python = # Copyright (c) 2005 Nokia Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
Line 3: Line 15:
You can write whole games in Python using [[http://www.pygame.org/|PyGame]]. See a list of other PythonGameLibraries maintained in this Wiki, or [[http://www.devmaster.net/engines/list.php?fid=6&sid=11|this list maintained on DevMaster.net]]. import appuifw
from graphics import *
import e32
from key_codes import *
Line 5: Line 20:
If you have an existing game and want to add a scripting engine to make it more flexible, Python is also a very good choice. But you'll have to learn about IntegratingPythonWithOtherLanguages. class Keyboard(object):
    def __init__(self,onevent=lambda:None):
        self._keyboard_state={}
        self._downs={}
        self._onevent=onevent
    def handle_event(self,event):
        if event['type'] == appuifw.EEventKeyDown:
            code=event['scancode']
            if not self.is_down(code):
                self._downs[code]=self._downs.get(code,0)+1
            self._keyboard_state[code]=1
        elif event['type'] == appuifw.EEventKeyUp:
            self._keyboard_state[event['scancode']]=0
        self._onevent()
    def is_down(self,scancode):
        return self._keyboard_state.get(scancode,0)
    def pressed(self,scancode):
        if self._downs.get(scancode,0):
            self._downs[scancode]-=1
            return True
        return False
keyboard=Keyboard()
Line 7: Line 43:
Read [[http://www.onlamp.com/pub/a/python/2002/07/11/pythonnews.html|Humongous Python]] for a case study. appuifw.app.screen='full'
img=None
def handle_redraw(rect):
    if img:
        canvas.blit(img)
appuifw.app.body=canvas=appuifw.Canvas(
    event_callback=keyboard.handle_event,
    redraw_callback=handle_redraw)
img=Image.new(canvas.size)
Line 9: Line 53:
Read [[http://rene.f0o.com/mywiki/PythonGameProgramming|Python game programming tutorial]]. Or if you need object-oriented design read [[http://pygametutorials.wikidot.com | Yet another game programming tutorial]]. running=1
def quit():
    global running
    running=0
appuifw.app.exit_key_handler=quit
Line 11: Line 59:
Two pages that are dedicated for python in 3d are [[http://www.py3d.org/|Python 3D(py3d.org)]] and [[http://www.vrplumber.com/py3d.py|Python 3D Software]] location=[img.size[0]/2,img.size[1]/2]
speed=[0.,0.]
blobsize=16
xs,ys=img.size[0]-blobsize,img.size[1]-blobsize
gravity=0.03
acceleration=0.05
Line 13: Line 66:
[[http://www.pyweek.org|PyWeek]] is a bi-annual programming challenge that produces several great games. import time
start_time=time.clock()
n_frames=0
# To speed things up, we prerender the text.
labeltext=u'Use arrows to move ball'
textrect=img.measure_text(labeltext, font='normal')[0]
text_img=Image.new((textrect[2]-textrect[0],textrect[3]-textrect[1]))
text_img.clear(0)
text_img.text((-textrect[0],-textrect[1]),labeltext,fill=0xffffff,font='normal')
Line 15: Line 76:
== Books == while running:
    img.clear(0)
    img.blit(text_img, (0,0))
    img.point((location[0]+blobsize/2,location[1]+blobsize/2),
              0x00ff00,width=blobsize)
    handle_redraw(())
    e32.ao_yield()
    speed[0]*=0.999
    speed[1]*=0.999
    speed[1]+=gravity
    location[0]+=speed[0]
    location[1]+=speed[1]
    if location[0]>xs:
        location[0]=xs-(location[0]-xs)
        speed[0]=-0.80*speed[0]
        speed[1]=0.90*speed[1]
    if location[0]<0:
        location[0]=-location[0]
        speed[0]=-0.80*speed[0]
        speed[1]=0.90*speed[1]
    if location[1]>ys:
        location[1]=ys-(location[1]-ys)
        speed[0]=0.90*speed[0]
        speed[1]=-0.80*speed[1]
    if location[1]<0:
        location[1]=-location[1]
        speed[0]=0.90*speed[0]
        speed[1]=-0.80*speed[1]
        
    if keyboard.is_down(EScancodeLeftArrow): speed[0] -= acceleration
    if keyboard.is_down(EScancodeRightArrow): speed[0] += acceleration
    if keyboard.is_down(EScancodeDownArrow): speed[1] += acceleration
    if keyboard.is_down(EScancodeUpArrow): speed[1] -= acceleration
    if keyboard.pressed(EScancodeHash):
        filename=u'e:\\screenshot.png'
        canvas.text((0,32),u'Saving screenshot to:',fill=0xffff00)
        canvas.text((0,48),filename,fill=0xffff00)
        img.save(filename)
Line 17: Line 115:
There's also some books that specifically cover game programming in Python:     n_frames+=1
end_time=time.clock()
total=end_time-start_time
Line 19: Line 119:
http://www.charlesriver.com/titles/pythongame.html
  "Game Programming with Python is about building games using Python. It deals with general concepts of game development and specifics that apply when using Python for game development. Some of the general topics include simulations, game architectures, graphics, networking, and user interfaces."

http://www.handysoftware.com/cpif
  "The author set out to write a book like the one he used to teach himself programming at age 12. ... This book has been successfully used by homeschooling families and public school teachers." The library and example code supplied with the book is also available for download.
print "%d frames, %f seconds, %f FPS, %f ms/frame."%(n_frames,total,
                                                     n_frames/total,
                                                     total/n_frames*1000.)

# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License.

import appuifw from graphics import * import e32 from key_codes import *

class Keyboard(object):

  • def init(self,onevent=lambda:None):

    • self._keyboard_state={} self._downs={} self._onevent=onevent
    def handle_event(self,event):
    • if event['type'] == appuifw.EEventKeyDown:
      • code=event['scancode'] if not self.is_down(code):
        • self._downs[code]=self._downs.get(code,0)+1
        self._keyboard_state[code]=1
      elif event['type'] == appuifw.EEventKeyUp:
      • self._keyboard_state[event['scancode']]=0
      self._onevent()
    def is_down(self,scancode):
    • return self._keyboard_state.get(scancode,0)
    def pressed(self,scancode):
    • if self._downs.get(scancode,0):
      • self._downs[scancode]-=1 return True
      return False

keyboard=Keyboard()

appuifw.app.screen='full' img=None def handle_redraw(rect):

  • if img:
    • canvas.blit(img)

appuifw.app.body=canvas=appuifw.Canvas(

  • event_callback=keyboard.handle_event, redraw_callback=handle_redraw)

img=Image.new(canvas.size)

running=1 def quit():

  • global running running=0

appuifw.app.exit_key_handler=quit

location=[img.size[0]/2,img.size[1]/2] speed=[0.,0.] blobsize=16 xs,ys=img.size[0]-blobsize,img.size[1]-blobsize gravity=0.03 acceleration=0.05

import time start_time=time.clock() n_frames=0 # To speed things up, we prerender the text. labeltext=u'Use arrows to move ball' textrect=img.measure_text(labeltext, font='normal')[0] text_img=Image.new((textrect[2]-textrect[0],textrect[3]-textrect[1])) text_img.clear(0) text_img.text((-textrect[0],-textrect[1]),labeltext,fill=0xffffff,font='normal')

while running:

  • img.clear(0) img.blit(text_img, (0,0)) img.point((location[0]+blobsize/2,location[1]+blobsize/2),
    • 0x00ff00,width=blobsize)
    handle_redraw(()) e32.ao_yield() speed[0]*=0.999 speed[1]*=0.999 speed[1]+=gravity location[0]+=speed[0] location[1]+=speed[1]

    if location[0]>xs:

    • location[0]=xs-(location[0]-xs) speed[0]=-0.80*speed[0] speed[1]=0.90*speed[1]

    if location[0]<0:

    • location[0]=-location[0] speed[0]=-0.80*speed[0] speed[1]=0.90*speed[1]

    if location[1]>ys:

    • location[1]=ys-(location[1]-ys) speed[0]=0.90*speed[0] speed[1]=-0.80*speed[1]

    if location[1]<0:

    • location[1]=-location[1] speed[0]=0.90*speed[0] speed[1]=-0.80*speed[1]
    if keyboard.is_down(EScancodeLeftArrow): speed[0] -= acceleration if keyboard.is_down(EScancodeRightArrow): speed[0] += acceleration if keyboard.is_down(EScancodeDownArrow): speed[1] += acceleration if keyboard.is_down(EScancodeUpArrow): speed[1] -= acceleration if keyboard.pressed(EScancodeHash):
    • filename=u'e:\\screenshot.png' canvas.text((0,32),u'Saving screenshot to:',fill=0xffff00) canvas.text((0,48),filename,fill=0xffff00) img.save(filename)
    n_frames+=1

end_time=time.clock() total=end_time-start_time

print "%d frames, %f seconds, %f FPS, %f ms/frame."%(n_frames,total,

  • n_frames/total, total/n_frames*1000.)

GameProgramming (last edited 2020-06-12 09:29:10 by DavidBoddie)

Unable to edit the page? See the FrontPage for instructions.