Hi Adam, > What is the easiest way of detecting the collision between enemy and > player? > > TIA > > My whole code is visible at: > https://github.com/kabads/zoomr/blob/master/zoomr.py
I went through your code and found it to be a bit strange. I guess you started using PyGame without sprites and have kept some bad habits. In particular, this means: * A sprite having an iamge attribute, but then using some other atribute (your il) for drawing it with your own draw method makes no sense. * Always update sprites with their update method * Always keep the sprite's rect in sync with the sprite's position * Always have all sprites in some group (also your player in a player group) * Draw groups as a whole, not every single sprite Also, please take a look at RenderClear and how to use the clear() method for clearing the screen surface more efficiently than drawing a solid background. Find attached your code, amended with the things I said, but leaving its structure intact. There are also some things about your general Python that come to mind - if you care, I can send you a completely cleand-up version. Cheers, Nik
# /bin/bash python2 # Zoomr - a pygame platform # (c) 2014 A Cripps # See README and LICENSE for more information import pygame, random, sys from pygame.locals import * # set up some constant variables FPS = 15 WINWIDTH = 680 WINHEIGHT = 480 BLACK = (0,0,0) WHITE = (255,255,255) RED = (255, 0, 0) GREEN = (50,155,0) BLUE = (0,0,255) movex, movey=0,0 all_sprite_list = pygame.sprite.Group() class Player(pygame.sprite.Sprite): """This represents the moving player""" def __init__(self, x,y): """Constructor""" pygame.sprite.Sprite.__init__(self) self.health = 100 self.image = pygame.image.load("blue.jpg") self.rect = self.image.get_rect() self.rect.topleft = [x, y] def checkBounds(self): if self.x >= 670: self.x = 670 elif self.x <=0: self.x = 0 if self.y >= 470: self.y = 470 elif self.y<=0: self.y=0 def update(self): self.rect.move_ip([movex, movey]) def damage(self): self.health -= 10 #"you're hit" #if self.health <=0: #print "you died" #terminate() class Enemy(pygame.sprite.Sprite): """This is a static block that I will try to avoid""" def __init__(self): """Constructor""" x = random.randint(0,680-10) y = random.randint(0,480-10) pygame.sprite.Sprite.__init__(self) self.health = random.randint(0,100) self.image = pygame.image.load("red.jpg") self.rect = self.image.get_rect() self.rect.topleft = [x, y] enemy_list = pygame.sprite.Group() player_list = pygame.sprite.Group() def main(): global FPSCLOCK, DISPLAYSURF, BASICFONT, movex, movey, enemy, player, enemy_list pygame.init() FPSCLOCK = pygame.time.Clock() DISPLAYSURF = pygame.display.set_mode((WINWIDTH, WINHEIGHT)) BASICFONT = pygame.font.Font('freesansbold.ttf', 20) pygame.display.set_caption('Zoomr - where can you go today?') # Let's make the background green for now, and then draw everything afterwards. DISPLAYSURF.fill(GREEN) # Here is the player - protagonist player = Player(680/2, 480/2) player_list.add(player) all_sprite_list.add(player) # And here are some enemies - -don't touch them (still to come) for x in range (20): o = Enemy() enemy_list.add(o) all_sprite_list.add(o) pygame.display.flip() while True: runGame() hits = [] def runGame(): global movex, movey, enemy, player, enemy_list, hits for event in pygame.event.get(): if event.type == QUIT: terminate() if event.type == KEYDOWN: if event.key== K_ESCAPE: terminate() if event.key ==K_a: movex = -1 #playerStartx- if event.key==K_d: movex = 1 #playerStartx+ if event.key==K_w: movey = -1 #playerStarty- if event.key==K_s: movey = 1 #playerStarty+ if (event.type==KEYUP): if (event.key==K_a): movex = 0 if (event.key==K_d): movex =0 if (event.key==K_w): movey = 0 if (event.key==K_s): movey=0 # Let's start to draw everything back on the screen - always starting with the background DISPLAYSURF.fill(GREEN) enemy_list.update() player_list.update() enemy_list.draw(DISPLAYSURF) player_list.draw(DISPLAYSURF) # Draw the enemies and check for a collision # However, I'm so stupid, because these should never live above the DISPLAYSURF.fill for o in enemy_list: if pygame.sprite.groupcollide(player_list, enemy_list, False, False): print "careful " + str(player.health) player.damage() #hits = pygame.sprite.spritecollide(player, enemy_list, True) #print "collision" #for i in hits: # player.damage() #hits = pygame.sprite.spritecollide(player, enemy_list, True) #print "hits is this long: " + str(len(hits)) #for i in hits: # player.damage() # update the whole shebang pygame.display.flip() def getRandomCoords(): x = random.randint(0,680) y = random.randint(0,480) return x, y def terminate(): pygame.quit() sys.exit() if __name__ == '__main__': main()
signature.asc
Description: This is a digitally signed message part.