I
Isis
Hi all,
I am writing a snake game, but all is not going well...
Two problems here. First of all, the little circles I use for my sprite
images only show up as quadrants.
Second of all, only the Head sprite for my snake shows up at all. Why?
Here are the class definitions:
! /usr/bin/python
import pygame as PG
seg_size = 20
class SnakeSegment(PG.sprite.Sprite):
def __init__(self, pos):
PG.sprite.Sprite.__init__(self)
self.image = PG.Surface([seg_size,seg_size])
self.rect = self.image.get_rect()
self.rect.topleft = pos
# self.direction = 0
class SnakeHead(SnakeSegment):
def __init__(self,pos,spd = 10):
PG.sprite.Sprite.__init__(self)
SnakeSegment.__init__(self,pos)
PG.draw.circle(self.image,(255,0,0),self.rect.center,4)
self.speed = spd # governs speed of whole snake
def update(self):
self.rect.left += self.speed
class SnakeBody(SnakeSegment):
def __init__(self,pos,prev):
PG.sprite.Sprite.__init__(self)
SnakeSegment.__init__(self,pos)
PG.draw.circle(self.image,(0,255,0),self.rect.center,4)
self.previous=prev
def update(self):
self.rect.center = self.previous.rect.center
class SnakeTail(SnakeSegment):
def __init__(self,pos,prev):
PG.sprite.Sprite.__init__(self)
SnakeSegment.__init__(self,pos)
PG.draw.circle(self.image,(0,0,255),self.rect.center,4)
self.previous=prev
def update(self):
self.rect.center = self.previous.rect.center
class Snake(PG.sprite.OrderedUpdates):
def __init__(self, pos, length = 6):
PG.sprite.OrderedUpdates.__init__(self)
self.head = SnakeHead(pos)
self.segs = length - 2
self.position = pos
self.add(self.head)
prev = self.head
posx, posy = pos
for x in range(self.segs):
posx += seg_size
prev = (SnakeBody((posx,posy),prev))
self.add(prev)
# print prev.rect.center
posx += seg_size
self.add(SnakeTail((posx, posy),prev))
self._spritelist.reverse() # we need tail first, head last
Whew!
And here is my little test program.
#!/usr/bin/python
from snake import *
#import pygame as PG
DBUF = PG.DOUBLEBUF
FSCR = PG.FULLSCREEN
screenx = 640
screeny = 480
def main():
PG.init()
screen = PG.display.set_mode((screenx, screeny)) #python likes to make
pointers.
q = Snake((100,100))
q.draw(screen)
q.update()
PG.display.flip()
while 1:
PG.event.pump()
keyinput = PG.key.get_pressed()
if keyinput[PG.K_ESCAPE] or PG.event.peek(PG.QUIT):
break
if __name__ == '__main__':
main()
Whoop, there it is. What have I done wrong?
I am writing a snake game, but all is not going well...
Two problems here. First of all, the little circles I use for my sprite
images only show up as quadrants.
Second of all, only the Head sprite for my snake shows up at all. Why?
Here are the class definitions:
! /usr/bin/python
import pygame as PG
seg_size = 20
class SnakeSegment(PG.sprite.Sprite):
def __init__(self, pos):
PG.sprite.Sprite.__init__(self)
self.image = PG.Surface([seg_size,seg_size])
self.rect = self.image.get_rect()
self.rect.topleft = pos
# self.direction = 0
class SnakeHead(SnakeSegment):
def __init__(self,pos,spd = 10):
PG.sprite.Sprite.__init__(self)
SnakeSegment.__init__(self,pos)
PG.draw.circle(self.image,(255,0,0),self.rect.center,4)
self.speed = spd # governs speed of whole snake
def update(self):
self.rect.left += self.speed
class SnakeBody(SnakeSegment):
def __init__(self,pos,prev):
PG.sprite.Sprite.__init__(self)
SnakeSegment.__init__(self,pos)
PG.draw.circle(self.image,(0,255,0),self.rect.center,4)
self.previous=prev
def update(self):
self.rect.center = self.previous.rect.center
class SnakeTail(SnakeSegment):
def __init__(self,pos,prev):
PG.sprite.Sprite.__init__(self)
SnakeSegment.__init__(self,pos)
PG.draw.circle(self.image,(0,0,255),self.rect.center,4)
self.previous=prev
def update(self):
self.rect.center = self.previous.rect.center
class Snake(PG.sprite.OrderedUpdates):
def __init__(self, pos, length = 6):
PG.sprite.OrderedUpdates.__init__(self)
self.head = SnakeHead(pos)
self.segs = length - 2
self.position = pos
self.add(self.head)
prev = self.head
posx, posy = pos
for x in range(self.segs):
posx += seg_size
prev = (SnakeBody((posx,posy),prev))
self.add(prev)
# print prev.rect.center
posx += seg_size
self.add(SnakeTail((posx, posy),prev))
self._spritelist.reverse() # we need tail first, head last
Whew!
And here is my little test program.
#!/usr/bin/python
from snake import *
#import pygame as PG
DBUF = PG.DOUBLEBUF
FSCR = PG.FULLSCREEN
screenx = 640
screeny = 480
def main():
PG.init()
screen = PG.display.set_mode((screenx, screeny)) #python likes to make
pointers.
q = Snake((100,100))
q.draw(screen)
q.update()
PG.display.flip()
while 1:
PG.event.pump()
keyinput = PG.key.get_pressed()
if keyinput[PG.K_ESCAPE] or PG.event.peek(PG.QUIT):
break
if __name__ == '__main__':
main()
Whoop, there it is. What have I done wrong?