diff options
-rw-r--r-- | MAFH2/BattleEngine.py | 27 | ||||
-rw-r--r-- | MAFH2/Enemy.py | 5 | ||||
-rw-r--r-- | MAFH2/Spritesheet.py | 31 | ||||
-rw-r--r-- | MAFH2/fortuneengine/DrawableObject.py | 156 | ||||
-rw-r--r-- | MAFH2/fortuneengine/DynamicDrawableObject.py | 106 | ||||
-rw-r--r-- | MAFH2/fortuneengine/GameEngine.py | 40 | ||||
-rw-r--r-- | MAFH2/fortuneengine/Scene.py | 167 |
7 files changed, 496 insertions, 36 deletions
diff --git a/MAFH2/BattleEngine.py b/MAFH2/BattleEngine.py index 709a1f5..5bc9261 100644 --- a/MAFH2/BattleEngine.py +++ b/MAFH2/BattleEngine.py @@ -42,14 +42,16 @@ class BattleEngine(GameEngineElement): if e_index != '0': self.enemy_list.append( get_enemy( e_index ) ) + self.get_engine.get_scene().addObjects([get_enemy(e_index)]) # Preload images - self.__images = {} + self.__drawableObjects = {} for i in ['arrow_select']: - self.__images[i] = pygame.image.load( HUD_PATH + i + ".gif" ) #----------------------------------------------------------------------------- + self.__drawableObjects[i] = DrawableObject([pygame.image.load( HUD_PATH + i + ".gif" )],'') - self.__images['hp'] = Spritesheet( HUD_PATH + "hp.gif" ).img_extract(11,1,100,100) #------------------------------------------------------------ - self.__images['bt'] = Spritesheet( HUD_PATH + "bt.gif" ).img_extract(1,11,100,25) #------------------------------------------------------------- + self.__drawableObjects['hp'] = DrawableObject(Spritesheet( HUD_PATH + "hp.gif" ).img_extract(11,1,100,100), '') + self.__drawableObjects['bt'] = DrawableObject(Spritesheet( HUD_PATH + "bt.gif" ).img_extract(1,11,100,25), '') + self.get_engine.get_scene().addObjects(self.__drawableObjects) self.add_to_engine() self.game_engine.add_object('battlemenu', BattleMenuHolder( self.menu_callback ) ) @@ -385,11 +387,10 @@ class BattleEngine(GameEngineElement): # Draw Enemy and Item Selection for enemy in self.enemy_list: if enemy.alive and self.active_target == i: -# screen.blit(self.__images['arrow_select'], (x+(i*200),y-25)) #1 orig - _dirtyList.append(self.__images['arrow_select'].get_rect().move((x+(i*200),y-25))) #1 new - enemy.sprite.updateAnim( tick_time ) #2 orig -# screen.blit(enemy.sprite.image, (x+(i*200),y) ) #3 orig - _dirtyList.append(enemy.sprite.image.get_rect().move( (x+(i*200),y) )) #3 new + self.__drawableObjects['arrow_select'].setPosition(x+(i*200),y-25) #1 orig + #enemy.sprite.updateAnim( tick_time ) #DO SOMETHING + enemy.get_sprite().setPosition(x+(i*200),y) + #screen.blit(enemy.sprite.image, (x+(i*200),y) ) #DO SOMETHING i = i+1 # Draw Hud @@ -398,8 +399,10 @@ class BattleEngine(GameEngineElement): # Player Health health = 10 - profile.hero.healthLevel() # screen.blit(self.__images['hp'][health], (25,25)) #4 orig - _dirtyList.append( self.__images['hp'][health].get_rect().move((25,25)) ) #4 new - enemy.sprite.updateAnim( tick_time ) #2 new + self.__drawableObjects['hp'].goToAnim(heatlh) #4 new + self.__drawableObjects['hp'].setPosition(25,25) + #enemy.sprite.updateAnim( tick_time ) #2 new #what the hell does ^^ do?? # pygame.display.update(_dirtyList) #5 new - return _dirtyList + + self.get_engine.get_scene().update(clock.get_time()) diff --git a/MAFH2/Enemy.py b/MAFH2/Enemy.py index 8250800..31f8384 100644 --- a/MAFH2/Enemy.py +++ b/MAFH2/Enemy.py @@ -1,7 +1,7 @@ from gettext import gettext as _ from constants import CHAR_PATH #from drawableobject.DrawableObject import DrawableObject -from drawableobject.DynamicDrawableObject import DynamicDrawableObject +from fortunengine.DynamicDrawableObject import DynamicDrawableObject class InvalidEnemyException(Exception): pass import pygame @@ -59,4 +59,7 @@ def get_enemy(key): return Enemy( key ) else: raise InvalidEnemyException() + +def get_sprite(self): + return self.sprite
\ No newline at end of file diff --git a/MAFH2/Spritesheet.py b/MAFH2/Spritesheet.py new file mode 100644 index 0000000..ddb18a8 --- /dev/null +++ b/MAFH2/Spritesheet.py @@ -0,0 +1,31 @@ +import pygame
+
+class Spritesheet:
+ """
+ Class from http://www.scriptedfun.com/transcript-2-using-sprite-sheets-and-drawing-the-background/
+
+ This class can be used to seporate images from the sprite sheet
+ """
+ def __init__(self, filename):
+ self.sheet = pygame.image.load(filename).convert()
+
+ def imgat(self, rect, myColorKey = None):
+ rect = pygame.Rect(rect)
+ image = pygame.Surface(rect.size).convert()
+ if myColorKey == None: myColorKey = image.get_at((0,0))
+ image.set_colorkey(myColorKey)
+ image.blit(self.sheet, (0, 0), rect)
+ return image
+
+ def imgsat(self, rects, myColorKey = None):
+ imgs = []
+ for rect in rects:
+ imgs.append(self.imgat(rect, myColorKey))
+ return imgs
+
+ def img_extract( self, cols, rows, width, height, myColorKey = None):
+ rect_list = []
+ for y in range(0, rows):
+ for x in range(0, cols):
+ rect_list.append( (width*x, height*y, width, height,) )
+ return self.imgsat( rect_list, myColorKey)
\ No newline at end of file diff --git a/MAFH2/fortuneengine/DrawableObject.py b/MAFH2/fortuneengine/DrawableObject.py new file mode 100644 index 0000000..ce7389f --- /dev/null +++ b/MAFH2/fortuneengine/DrawableObject.py @@ -0,0 +1,156 @@ +import pygame
+
+class DrawableObject(pygame.sprite.Sprite):
+
+ def __init__(self,images,textfileName,fps = 10, x = 0, y = 0, xVelocity = 0, yVelocity = 0):
+ pygame.sprite.Sprite.__init__(self)
+ cnt = 0
+
+ #self._originals = images
+ #self._images = images
+ self._images = []
+ self._origImages = []
+ while cnt < len(images):
+ self._images.append(images[cnt].convert())
+ self._origImages.append(images[cnt].convert())
+ cnt += 1
+ self._start = pygame.time.get_ticks()
+ self.image = self._images[0]
+ self._delay = 1000 / fps
+ self._last_update = 0
+ self._frame = 0
+ self.animations = {}
+ self._current_anim = ""
+ self.rect = self.image.get_rect()
+ self.xPos = x
+ self.yPos = y
+ self.xSpeed = xVelocity
+ self.ySpeed = yVelocity
+ self.myAngle = 0
+ self.xSize = 40
+ self.ySize = 40
+ self.rect.topleft = (x,y)
+
+ if textfileName != '':
+
+ f = open(textfileName, 'r')
+ currentLine = f.readline()
+ while currentLine != '':
+
+ animValues = currentLine.split(",")
+ self.animations[animValues[0]] = [int(animValues[1]), int(animValues[2])]
+ currentLine = f.readline()
+
+
+ def addImages(self, images):
+
+ self._images.extend(images)
+ #self._originals.extend(images)
+
+ def goToAnim(self, animName):
+
+ if self.animations.get(animName, 0) != 0:
+ self._current_anim = animName
+ self._frame = self.animations[animName][0]
+ self.image = self._images[self._frame]
+
+ def move(self):
+
+ self.xPos += self.xSpeed
+ self.yPos += self.ySpeed
+
+ self.rect.right += self.xSpeed
+ self.rect.top += self.ySpeed
+
+ def nudge(self, xNudge = 0, yNudge = 0):
+
+ self.xPos += xNudge
+ self.yPos += yNudge
+
+ self.rect.right += xNudge
+ self.rect.top += yNudge
+
+ def scale(self, newXSize = None, newYSize = None):
+
+ if newXSize != None: self.xSize = newXSize
+ if newYSize != None: self.ySize = newYSize
+
+ cnt = 0
+ while cnt < len(self._images):
+ self._origImages[cnt] = pygame.transform.scale(self._origImages[cnt], (self.xSize, self.ySize))
+ self._images[cnt] = self._origImages[cnt]
+ cnt += 1
+
+ def getXSize(self):
+
+ return self.xSize
+
+ def getYSize(self):
+
+ return self.ySize
+
+ def rotate(self,angle):
+
+ cnt = 0
+
+ self.myAngle += angle
+ while cnt < len(self._images):
+
+ self._images[cnt] = pygame.transform.rotate(self._origImages[cnt], self.myAngle)
+ cnt += 1
+
+ def getRotation(self):
+
+ return self.myAngle
+
+ def setPosition(self, x = None, y = None):
+
+ if x != None and x >= 0: self.xPos = x
+ if y != None and y >= 0: self.yPos = y
+
+ self.rect.topleft = (self.xPos, self.yPos)
+
+ def getXPos(self):
+
+ return self.xPos
+
+ def getYPos(self):
+
+ return self.yPos
+
+ def setSpeed(self, xVelocity = None, yVelocity = None):
+
+ if xVelocity != None: self.xSpeed = xVelocity
+ if yVelocity != None: self.ySpeed = yVelocity
+
+ def getXSpeed(self):
+
+ return self.xSpeed
+
+ def getYSpeed(self):
+
+ return self.ySpeed
+
+ def calcColorKey(self):
+
+ myColorKey = images[0].get_at((0,0))
+ setColorKey(myColorKey)
+
+ def setColorKey(self, aColor):
+
+ cnt = 0
+ while cnt < len(self._images):
+ self._images[cnt].set_colorkey(aColor)
+ cnt += 1
+
+ def update(self, t):
+ pass
+
+ def updateCurrnetAnimation(self, t):
+ pass
+
+ def nextFrame(self):
+ pass
+
+ def nextCurrentAnimFrame(self):
+ pass
diff --git a/MAFH2/fortuneengine/DynamicDrawableObject.py b/MAFH2/fortuneengine/DynamicDrawableObject.py new file mode 100644 index 0000000..e46ef04 --- /dev/null +++ b/MAFH2/fortuneengine/DynamicDrawableObject.py @@ -0,0 +1,106 @@ +import pygame
+from DrawableObject import DrawableObject
+
+class DynamicDrawableObject(DrawableObject, pygame.sprite.Sprite):
+
+ def __init__(self,images,textfileName,fps = 10, x = 0, y = 0, xVelocity = 0, yVelocity = 0):
+
+ DrawableObject.__init__(self, images, textfileName, fps, x, y, xVelocity, yVelocity)
+
+ def addImages(self, images):
+
+ self._images.extend(images)
+
+ # def update(self, t):
+#
+# timePassed = t + self._last_update
+# if timePassed > self._delay:
+#
+# self._frame += timePassed/self._delay
+# while self._frame >= len(self._images):
+#
+# framesPast = self._frame - len(self._images)
+# self._frame = framesPast - 1
+#
+# self.image = self._images[self._frame]
+# self._last_update = timePassed%self._delay
+# self._last_update = timePassed
+
+ def updateWithMovement(self, right, bottom): # causes objects to move and collide with walls
+
+ # If we're at the top or bottom of the screen, switch directions.
+ if (self.yPos + self.ySize) >= bottom or self.yPos < 0: self.ySpeed = self.ySpeed * -1
+ if (self.yPos + self.ySize) >= bottom and self.ySpeed > 0: self.ySpeed = self.ySpeed * -1
+ if self.yPos < 0 and self.ySpeed < 0: self.ySpeed = self.ySpeed * -1
+
+ # If we're at the right or left of the screen, switch directions.
+ if (self.xPos + self.xSize) >= right or self.xPos < 0: self.xSpeed = self.xSpeed * -1
+ if (self.xPos + self.xSize) >= right and self.xSpeed > 0: self.xSpeed = self.xSpeed * -1
+ if self.xPos < 0 and self.xSpeed < 0: self.xSpeed = self.xSpeed * -1
+
+ self.move()
+
+ if self._frame < len(self._images) - 1:
+ self._frame += 1
+ else:
+ self._frame = 0
+
+ self.image = self._images[self._frame]
+
+ def update(self, t): # just updates the frame / object
+
+ #if self.animations[cnt] == self._current_anim:
+
+ print "last update ", self._last_update
+ timePassed = t + self._last_update#getting the time since the last time I updated my frame and adding it to the time that I last updated my frame
+ print "time passed ", timePassed
+ if (timePassed) > self._delay:
+ if self._frame < self.animations.get(self._current_anim)[0] or self._frame > self.animations.get(self._current_anim)[1]: #checking if I am in the animation and putting me there if I am not
+ self._frame = self.animations.get(self._current_anim)[0]
+
+ self._frame += timePassed/self._delay
+ print "frame ", self._frame
+
+ while self._frame >= self.animations.get(self._current_anim)[1]:
+ framesPast = self._frame - self.animations.get(self._current_anim)[1]
+ self._frame = framesPast - 1 + self.animations.get(self._current_anim)[0]
+
+ self.image = self._images[self._frame]
+ self._last_update = timePassed%self._delay
+ else:
+
+ self._last_update = timePassed
+
+ def nextFrame(self): # push to next frame
+
+ self._frame += 1
+ if self._frame >= len(self._images):
+
+ framesPast = self._frame - len(self._images)
+ self._frame = framesPast
+
+ self.image = self._images[self._frame]
+
+ def nextCurrentAnimFrame(self): # push to the next frame of curr animation
+
+ cnt = 0
+ while cnt < len(animations):
+
+ if animations[cnt] == self._current_anim:
+
+ if self._frame < self.animations[self._current_anim][0] or self._frame > self.animations[self._current_anim][1]:
+
+ self._frame = self.animations[self._current_anim][0]
+ else:
+ self._frame += 1
+
+ if self._frame > self.animations[self._current_anim][1]:
+
+ framesPast = self._frame - self.animations[self._current_anim][1]
+ self._frame = framesPast - 1 + self.animations[self._current_anim][0]
+
+ self.image = self._images[self._frame]
+
+ cnt = len(anmiations)
+
+ cnt += 1
diff --git a/MAFH2/fortuneengine/GameEngine.py b/MAFH2/fortuneengine/GameEngine.py index 6c2cf72..dbecbd1 100644 --- a/MAFH2/fortuneengine/GameEngine.py +++ b/MAFH2/fortuneengine/GameEngine.py @@ -17,6 +17,9 @@ import pygame from time import time from GameEngineConsole import GameEngineConsole from GameInspect import GameInspect +from DrawableObject import DrawableObject +from DynamicDrawableObject import DynamicDrawableObject +from Scene import Scene class GameEngine(object): @@ -49,6 +52,7 @@ class GameEngine(object): self.height = height size = width, height self.screen = pygame.display.set_mode(size) + self.__scene = Scene(DrawableObject([pygame.Surface((size))],'')) # Engine Internal Variables self.__fps_cap = fps_cap @@ -96,6 +100,10 @@ class GameEngine(object): it enters the draw flag. """ self.__dirty = True + + def get_scene(self): + + return self.__scene def start_event_timer(self, function_cb, time): """ @@ -201,34 +209,20 @@ class GameEngine(object): pygame.display.flip() else: - __dirtyList=[] - for fnc in self.__draw_lst: - start = time() - __dirtyList.append(fnc(screen, tick_time)) - self.__draw_time[str(fnc)] += time() - start - self.__draw_calls[str(fnc)] += 1 - - cnt = 0 - while cnt < len(__dirty_lst): - cntTwo = 0 - while cntTwo < len(__dirty_lst): - if cnt != cntTwo - if __dirty_lst[cnt].colliderect(__dirty_lst[cntTwo]) - __dirty_lst[cnt] = __dirty_lst[cnt].union(__dirty_lst[cntTwo]) - del __dirty_lst[cntTwo] - cnt = cnt -1 - cntTwo = len(__dirty_lst) + 1 - cntTwo += 1 - cnt += 1 - + # __dirtyList=[] + for fnc in self.__draw_lst: + start = time() + fnc(screen, tick_time) + self.__draw_time[str(fnc)] += time() - start + self.__draw_calls[str(fnc)] += 1 + self.__scene.update(tick_time) # Print Frame Rate if self.__showfps: text = self.__font.render('FPS: %d' % self.clock.get_fps(), False, (255, 255, 255), (159, 182, 205)) -# screen.blit(text, (0, 0)) - __dirtyList.append(text.get_rect()) + screen.blit(text, (0, 0)) + pygame.display.flip() - pygame.display.update(__dirtyList) def _event_loop(self): """ diff --git a/MAFH2/fortuneengine/Scene.py b/MAFH2/fortuneengine/Scene.py new file mode 100644 index 0000000..9727177 --- /dev/null +++ b/MAFH2/fortuneengine/Scene.py @@ -0,0 +1,167 @@ +import pygame
+from pygame.sprite import RenderUpdates
+
+class Scene(pygame.sprite.RenderUpdates):
+
+ def __init__(self, sprites):
+
+ self._spritelist = []
+ self._spritelist.append([sprites, sprites.getXPos(), sprites.getYPos()])
+ RenderUpdates.__init__(self, sprites)
+
+ self.xPos = 0
+ self.yPos = 0
+ self.xSize = 0
+ self.ySize = 0
+
+ self.calcPosition()
+ self.calcSize()
+ self.setRelativePositions()
+
+ def calcPosition(self):
+
+ lowestX = 9000
+ lowestY = 9000
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+ if self._spritelist[cnt][0].getXPos() < lowestX: lowestX = self._spritelist[cnt][0].getXPos()
+ if self._spritelist[cnt][0].getYPos() < lowestY: lowestY = self._spritelist[cnt][0].getYPos()
+ cnt += 1
+
+ self.xPos = lowestX
+ self.yPos = lowestY
+
+ def calcSize(self):
+
+ highestX = 0
+ highestY = 0
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+ if (self._spritelist[cnt][0].getXPos() + self._spritelist[cnt][0].getXSize()) > highestX: highestX = self._spritelist[cnt][0].getXPos() + self._spritelist[cnt][0].getXSize()
+ if (self._spritelist[cnt][0].getYPos() + self._spritelist[cnt][0].getYSize()) > highestY: highestY = self._spritelist[cnt][0].getYPos() + self._spritelist[cnt][0].getYSize()
+ cnt += 1
+
+ self.xSize = highestX - self.xPos
+ self.ySize = highestY - self.yPos
+
+ def addObjects(self, newDrawableObjects):
+ for sprite in newDrawableObjects:
+ RenderUpdates.add_internal(self, sprite)
+ self._spritelist.append([sprite, sprite.getXPos(), sprite.getYPos()])
+
+ def setRelativePositions(self):
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+ self._spritelist[cnt][1] = self._spritelist[cnt][0].getXPos() - self.xPos
+ self._spritelist[cnt][2] = self._spritelist[cnt][0].getYPos() - self.yPos
+ cnt += 1
+
+ def removeObject(self, sprite):
+ RenderUpdates.remove_internal(self, sprite)
+ self._spritelist.remove(sprite)
+
+ def getObject(self, index):
+
+ if index < len(self._spritelist):
+ return self._spritelist[index][0]
+
+ def getListSize(self):
+
+ return len(self._spritelist)
+
+ def getList(self):
+
+ return list(self._spritelist)
+
+ def moveObjects(self):
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+
+ self._spritelist[cnt][0].move()
+ cnt += 1
+
+ self.calcPosition()
+ self.calcSize()
+ self.setRelativePositions()
+
+ def moveScene(self, xNudge = 0, yNudge = 0):
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+
+ self._spritelist[cnt][0].nudge(xNudge, yNudge)
+ cnt += 1
+
+ self.calcPosition()
+
+ def setPosition(self, newXPos = None, newYPos = None):
+
+ if newXPos != None: self.xPos = newXPos
+ if newYPos != None: self.yPos = newYPos
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+
+ self._spritelist[cnt][0].setPosition(self.xPos + self._spritelist[cnt][1], self.yPos + self._spritelist[cnt][2])
+ cnt += 1
+
+ def getXPos(self):
+ return self.xPos
+
+ def getYPos(self):
+ return self.yPos
+
+ def getXSize(self):
+ return self.xSize
+
+ def getYSize(self):
+ return self.ySize
+
+ def scaleObjects(self, newXSize = None, newYSize = None):
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+ self._spritelist[cnt][0].scale(newXSize, newYSize)
+ cnt += 1
+
+ def scaleScene(self, newXSize = None, newYSize = None):
+
+ self.calcPosition()
+ self.calcSize()
+
+ xScale = 1
+ yScale = 1
+
+ if newXSize != None: xScale = (newXSize * 1.0)/self.xSize
+ if newYSize != None: yScale = (newYSize * 1.0)/self.ySize
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+ self._spritelist[cnt][0].scale(xScale * self._spritelist[cnt][0].getXSize(), yScale * self._spritelist[cnt][0].getYSize())
+ self._spritelist[cnt][1] = xScale * self._spritelist[cnt][1]
+ self._spritelist[cnt][2] = yScale * self._spritelist[cnt][2]
+ cnt += 1
+
+ self.calcPosition()
+ self.calcSize()
+ self.setPosition()
+
+ def updateAnimations(self, t):
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+
+ self._spritelist[cnt][0].updateCurrentAnimation(t)
+ cnt += 1
+
+ def nextFrame(self):
+
+ cnt = 0
+ while cnt < len(self._spritelist):
+
+ self._spritelist[cnt][0].nextFrame()
+ cnt += 1
|