TGC Codebase Backup



Very slow/very basic 2D sprite basced pacman clone. by Chesh

11th Sep 2003 9:38
Summary

*Very* basic pacman clone, poor frame rate.



Description

This is my first attempt at game creation with DarkBASIC. It's entirely sprite based and uses the most basic of commands. The maze is made from a tiled set of sprites. Turning the right angle corners doesn't work exactly like pacman (because the collision is based on the sprite and pacman is round you can get caught on corners!) The ghost moves in random directions and doesn't obey the collision of the maze.. it wouldn't make a great pacman game either because I drew the sprites too big to start with :) Any recommendations on how to improve/where I should go next (especially if anyone can tell me anything about how to use sprites better to improve the frame rate) would be greatly appreciated!!

(sprite bank is contained in attached zip file compressed .bmp)



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    `pacman mess-about code

`To do list:
`1. Improve frame rate!
`2. Make ghost obey maze collision
`3. Make pacman's collision less fiddly when turning corners
`4. Power pills!
`5. Make pacman animate while holding down directional key in directions: l,u,d (image frame is always reset!)
`6. Second ghost

`sprites 1 - 16 are currently the four frames of animation in each of the four directions pacman can face
`sprites 17 - 20 are currently the four frames of the pink ghost
`sprites 21 - 24 are the four frames of the blue ghost (currently unused)
`sprites 25 and 26 are the two frames when the ghosts are scared (currently unused)
`sprite 27 is the pill, 28 is the power pill (currently unused)
`sprites 29 - 36 are the maze pieces (piece 35 is currently unused)

`load sprite bank bitmap into bank 1
LOAD BITMAP "pacman2.bmp",1
HIDE MOUSE

`cut invidual frames from bitmap, cuts 16 frames in total for pacman
`4 for pink, 4 for blue, 2 frames for the scared flashing ghost, 2 for each type of pill
FOR y=0 to 6
   FOR x=0 TO 3
      GET IMAGE 1+x+(y*4),(x*64),(y*64),(x*64)+64,(y*64)+64
   NEXT x
NEXT y
`cuts 8 individual frames for maze
FOR y=0 to 7
   GET IMAGE y+29,256,(y*64),256+64,(y*64)+64
NEXT y

`now that all the individual frames are stored in memory we can delete the bitmap
DELETE BITMAP 1

`these variables are used to set pacman's starting position and starting anim image
xpos=64
ypos=352
image=1
`this one determines pacman's direction (1=r/2=l/3=u/4=d)
pacd=1

`these variables are used to set pinky's starting position and starting anim image
p_xpos = 320
p_ypos = 176
p_image = 17
`determines pinky's direction
pinkyd = 4
`counts how many units pinky has moved before thinking about changing direction
pinkysteps = 0
`value used for when pinky actually thinks about changing direction (increase to travel in straight line longer)
pinkychange = 40

`manual sync
SYNC ON
SYNC RATE 30
`build the maze (REMEMBER - use an array to do this eventually!!), all maze sprites >2 and <41
`1
sprite 3,0,32,29 : sprite 4,64,32,34 : sprite 5,128,32,34 : sprite 6,192,32,34 : sprite 7,256,32,31
sprite 8,320,32,29 : sprite 9,384,32,34 : sprite 10,448,32,34 : sprite 11,512,32,34 : sprite 12,576,32,31
`2
sprite 13,0,96,33 : sprite 14,256,96,30 : sprite 15,320,96,32 : sprite 16,576,96,33
`3
sprite 17,0,160,32 : sprite 18,128,160,36 : sprite 19,448,160,36 : sprite 20,576,160,30
`4
sprite 21,256,224,36 : sprite 22,320,224,36
`5
sprite 23,0,288,31 : sprite 24,128,288,36 : sprite 25,448,288,36 : sprite 26,576,288,29
`6
sprite 27,0,352,33 : sprite 28,256,352,29 : sprite 29,320,352,31 : sprite 30,576,352,33
`7
sprite 31,0,416,30 : sprite 32,64,416,34 : sprite 33,128,416,34 : sprite 34,192,416,34 : sprite 35,256,416,32
sprite 36,320,416,30 : sprite 37,384,416,34 : sprite 38,448,416,34 : sprite 39,512,416,34 : sprite 40,576,416,32

`place the pills (REMEMBER - use an array to do this eventually!!), all pill sprites = >40 and <72
`1
sprite 41,64,96,27 : sprite 42,128,96,27 : sprite 43,192,96,27 : sprite 44,384,96,27 : sprite 45,448,96,27
sprite 46,512,96,27
`2
sprite 47,64,160,27 : sprite 48,192,160,27 : sprite 49,256,160,27 : sprite 50,320,160,27 : sprite 51,384,160,27
sprite 52,512,160,27
`3
sprite 53,0,224,27 : sprite 54,64,224,27 : sprite 55,128,224,27 : sprite 56,192,224,27 : sprite 57,384,224,27
sprite 58,448,224,27 : sprite 59,512,224,27 : sprite 60,576,224,27
`4
sprite 61,64,288,27 : sprite 62,192,288,27 : sprite 63,256,288,27 : sprite 64,320,288,27 : sprite 65,384,288,27
sprite 66,512,288,27
`5
sprite 67,128,352,27 : sprite 68,192,352,27 : sprite 69,384,352,27 : sprite 70,448,352,27 : sprite 71,512,352,27
` place pac
sprite 1,xpos,ypos,image

`main loop
DO
   if rightkey()=1 then pacd=1
   if leftkey()=1 then pacd=2 : image = 5
   if upkey()=1 then pacd=3 : image = 9
   if downkey()=1 then pacd=4 : image = 13

   old_xpos = xpos
   old_ypos = ypos

   if pacd = 1 then gosub moveright
   if pacd = 2 then gosub moveleft
   if pacd = 3 then gosub moveup
   if pacd = 4 then gosub movedown

   sprite 1,xpos,ypos,image
   p_collide=SPRITE COLLISION(1,0)

   if p_collide>2 AND p_collide<41
      xpos = old_xpos
      ypos = old_ypos
      sprite 1,xpos,ypos,image
   endif

   if p_collide>40
      delete sprite p_collide
   endif

   gosub update_pinky
   sprite 2,p_xpos,p_ypos,p_image

   IF SPRITE COLLISION(1,2)=1 THEN gosub resetpac

   SYNC
LOOP

update_pinky:
   if pinkyd = 1
      p_xpos = p_xpos + 6
      if p_xpos>640 then p_xpos = -64
      p_image = 18
   endif

   if pinkyd = 2
      p_xpos = p_xpos - 6
      if p_xpos<-64 then p_xpos = 640
      p_image = 17
   endif

   if pinkyd = 3
      p_ypos = p_ypos - 6
      if p_ypos<-64 then p_ypos = 480
      p_image = 19
   endif

   if pinkyd = 4
      p_ypos = p_ypos + 6
      if p_ypos>480 then p_ypos = -64
      p_image = 20
   endif

   pinkysteps = pinkysteps + 1
   if pinkysteps = pinkychange
      pinkyd = RND(4)
      if pinkyd = 0 then pinkyd = 1
      pinkysteps = 0
   endif
return

moveright:
      xpos=xpos+4
      IF xpos>640 THEN xpos=-64
      image=image+1
      IF image>4 THEN image=1
return

moveleft:
      xpos=xpos-4
      IF xpos<-64 THEN xpos=640
      image=image+1
      IF image>8 THEN image=5
return

moveup:
      ypos=ypos-4
      IF ypos<-64 THEN ypos=480
      image=image+1
      IF image>12 THEN image=9
return

movedown:
      ypos=ypos+4
      IF ypos>480 THEN ypos=-64
      image=image+1
      IF image>16 THEN image=13
return

resetpac:
   xpos=64
   ypos=352
   image=1
   pacd = 1
return