Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--MAFH2/BattleEngine.py27
-rw-r--r--MAFH2/Enemy.py5
-rw-r--r--MAFH2/Spritesheet.py31
-rw-r--r--MAFH2/fortuneengine/DrawableObject.py156
-rw-r--r--MAFH2/fortuneengine/DynamicDrawableObject.py106
-rw-r--r--MAFH2/fortuneengine/GameEngine.py40
-rw-r--r--MAFH2/fortuneengine/Scene.py167
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