今天想用pygame库写一个击打外星人飞船的python程序

这个游戏的效果是操纵一个位于屏幕底端的飞船,通过上下左右控制飞船移动方向,按空格发射子弹。游戏中击杀一批飞船后进入下一关卡。每一关卡击打飞船获得的得分递增。若外星飞船触碰飞船或屏幕底端则减一条命。最终计算总得分。

游戏中主要包括了:飞船对象,alien对象,子弹对象,游戏设置,游戏状态,游戏控制按钮,计分板。

1.飞船部分

由于pygame中已有sprite类,故飞船可直接继承sprite类
注意在继承类时class中标注继承了什么类,_ _init_ _函数中要使用super(Ship,self).__init__()来完成继承工作。同时init中也引入了ai—setting和screen(这些部分的代码会在后面写出)

然后为了构建这个飞船的形态,需要在当前文件夹中保存一个飞船的图像。初始化时设置飞船矩形(rect)的中心与游戏界面的中心位于同一垂直线上,飞船底部位于屏幕底端。初始化时定义四个位移变量(上下左右)并设置为false,以便后面按键时对其进行改变。
接下来定义了update函数,这个函数的作用是改变飞船的当前状态,如按下←键时使得飞船左移。同时需要注意:飞船的左侧不能超过屏幕的左端,否则会很影响游戏体验。其余同理。
然后是blitme函数,这个函数完成了将飞船状态及时更新在屏幕上的工作。
最后写了一个centership函数,是用来在需要的时刻将飞船重新放置到屏幕中央。

 import pygame
from pygame.sprite import Sprite class Ship(Sprite):#继承sprite类 def __init__(self,ai_settings,screen):
super(Ship,self).__init__()
self.screen=screen
self.ai_settings=ai_settings self.image=pygame.image.load('images/ship.bmp')
self.rect=self.image.get_rect()
self.screen_rect=screen.get_rect() self.rect.centerx=self.screen_rect.centerx
self.rect.bottom=self.screen_rect.bottom self.center=float(self.rect.centerx)
self.high=float(self.rect.bottom) self.moving_right=False
self.moving_left=False
self.moving_up=False
self.moving_down=False def update(self):
if self.moving_right and self.rect.right<self.screen_rect.right:
#self.rect.centerx+=1
self.center+=self.ai_settings.ship_speed_factor_horizen
if self.moving_left and self.rect.left>self.screen_rect.left:
#self.rect.centerx-=1
self.center-=self.ai_settings.ship_speed_factor_horizen
if self.moving_up and self.rect.top>self.screen_rect.top: self.high-=self.ai_settings.ship_speed_factor_height
if self.moving_down and self.rect.bottom<self.screen_rect.bottom: self.high+=self.ai_settings.ship_speed_factor_height self.rect.centerx=self.center
self.rect.bottom=self.high def blitme(self): self.screen.blit(self.image,self.rect)
def center_ship(self):
self.center=self.screen_rect.centerx

(ship)

给出alien部分:
alien部分生成了飞船群
然后为了产生初始的随机方向飞行,引入了random库。
同样的,这里的alien也继承了Sprite精灵。
注意,这里的飞船图像必须保存在当前文件夹下,然后用pygame.load来加载图片。
一个细节,由于alien移动距离是浮点型,所以要先计算移动的浮点类型,最后将其转换成整形以保证移动的连续性。同时由于alien图像必须保证一直处在screen内,所以这里定义了一个方法check_edges,通过self.screen.get_rect()来获取屏幕的位置,将alien与screen都视为矩形,比较两者的边界即可。

 import pygame
import random##########
from pygame.sprite import Sprite class Alien(Sprite): def __init__(self,ai_settings,screen):
super(Alien,self).__init__()
self.screen=screen
self.ai_settings=ai_settings self.image=pygame.image.load('images/alien.bmp')
self.rect=self.image.get_rect() self.rect.x=self.rect.width#-20
self.rect.y=self.rect.height#-20 self.direction=random.choice([1,-1]) self.x=float(self.rect.x) def check_edges(self):
screen_rect=self.screen.get_rect()
if self.rect.right>=screen_rect.right:
return True
elif self.rect.left<=screen_rect.left:
return True def blitme(self):
self.screen.blit(self.image,self.rect) def update(self):
#由于x可以精确到小数,故先更新x,再用x更新rect
self.x+=(self.ai_settings.alien_speed_factor*
self.direction)#*random.choice([1,-1])#####
self.rect.x=self.x

(alien)

给出bullet部分。
bullet同ship,alien一样,也继承了sprite。
注意,由于子弹是由飞船从飞船上部发出,故初始化子弹时要将其位置设置在飞船上部中央,子弹大小也不能过大。因为子弹大小较小,所以用pygame中的draw.rect(self.screen,self.color,self.rect)来画出一个小矩形即可,这种方法比较省事。如果想要使子弹的形状更加美观,可以用上面ship和alien中加载位图的方式。

 import pygame
from pygame.sprite import Sprite class Bullet(Sprite): def __init__(self,ai_settings,screen,ship): super(Bullet,self).__init__()
self.screen=screen self.rect=pygame.Rect(0,0,ai_settings.bullet_width,
ai_settings.bullet_height)
self.rect.centerx=ship.rect.centerx
self.rect.bottom=ship.rect.bottom self.y=float(self.rect.y) self.color=ai_settings.bullet_color
self.speed_factor=ai_settings.bullet_speed_factor def update(self):
self.y-=self.speed_factor
self.rect.y=self.y def draw_bullet(self):
pygame.draw.rect(self.screen,self.color,self.rect)

(bullet)

给出游戏设置部分。
我们把游戏中所有涉及数据的部分都放在这个文件中,包括了屏幕,速度,子弹,飞船,外星人,游戏节奏以及游戏关卡更新。

 class Settings():
"""存储所有设置的类"""
def __init__(self):
self.high_score=0 #屏幕设置
self.screen_width=1200
self.screen_height=650
self.bg_color=(230,230,230)
#速度设置
self.ship_speed_factor_horizen=1
self.ship_speed_factor_height=0.5
self.ship_limit=3 #子弹设置
self.bullet_speed_factor=1
self.bullet_width=3
self.bullet_height=15
self.bullet_color=60,60,60
self.bullets_allowed=3 #外星人设置
self.alien_speed_factor=1
self.fleet_drop_speed=10
#direction为1表示右移,-1表示左移
self.fleet_direction=1
self.alien_points=50 #游戏节奏设置
self.speedup_scale=1.1
self.score_scale=1.5 self.initialize_dynamic_settings() def initialize_dynamic_settings(self):
self.ship_speed_factor=1.5
self.bullet_speed_factor=3
self.alien_speed_factor=1 self.fleet_direction=1 def increase_speed(self):
self.ship_speed_factor*=self.speedup_scale
self.bullet_speed_factor*=self.speedup_scale
self.alien_speed_factor*=self.speedup_scale self.alien_points=int(self.alien_points*self.score_scale)

(settings)

给出游戏状态部分。
将游戏中的状态部分都放置在这个文件中。

 class GameStats():
def __init__(self,ai_settings):
self.ai_settings=ai_settings
self.reset_stats()
self.game_active=False self.high_score=0 def reset_stats(self): self.ships_left=self.ai_settings.ship_limit
self.score=0
self.level=1

(state)

由于游戏初始通常有一个START按钮用于开始游戏,所以这里需要定义一个按钮类。这里需要引入pygame.font用于其中的字体部分。
loading.......

 import pygame.font

 class Button():

 def __init__(self,ai_settings,screen,message):
'''初始化按钮的属性'''
self.screen=screen
self.screen_rect=screen.get_rect() self.width,self.height=200,50
self.button_color=(0,255,0)
self.text_color=(255,255,255)
self.font=pygame.font.SysFont(None,48) self.rect=pygame.Rect(0,0,self.width,self.height)
self.rect.center=self.screen_rect.center self.prep_message(message) def prep_message(self,message):
#图像渲染
self.message_image=self.font.render(message,True,self.text_color,
self.button_color)
self.message_image_rect=self.message_image.get_rect()
self.message_image_rect.center=self.rect.center def draw_button(self):
self.screen.fill(self.button_color,self.rect)
self.screen.blit(self.message_image,self.message_image_rect)

(button)

给出计分板部分:

 import pygame.font
from pygame.sprite import Group from ship import Ship class Scoreboard(): def __init__(self,ai_settings,screen,stats):
self.screen=screen
self.screen_rect=screen.get_rect()
self.ai_settings=ai_settings
self.stats=stats self.text_color=(30,30,30)
self.font=pygame.font.SysFont(None,48) self.prep_score()
self.prep_high_score()
self.prep_history_high_score()##########
self.prep_level()
self.prep_ships() def prep_score(self):
'''将得分渲染成图像'''
rounded_score=int(round(self.stats.score,-1))
score_str="score:"+"{:,}".format(rounded_score)
self.score_image=self.font.render(score_str,True,self.text_color,
self.ai_settings.bg_color) #将得分放在右上角
self.score_rect=self.score_image.get_rect()
self.score_rect.right=self.screen_rect.right-20
self.score_rect.top=20#存疑 def prep_high_score(self):
high_score=int(round(self.stats.high_score,-1))
high_score_str="High score:"+"{:,}".format(high_score)
self.high_score_image=self.font.render(high_score_str,True,
self.text_color,self.ai_settings.bg_color)
self.high_score_rect=self.high_score_image.get_rect()
self.high_score_rect.centerx=self.screen_rect.centerx-195
self.high_score_rect.top=self.score_rect.top def prep_history_high_score(self):###########
with open("highscore.txt") as file1:
lines=file1.readlines()
temp_string=''
for line in lines:
temp_string+=line.rstrip()
history_high_score=eval(temp_string)
history_high_score_str="Highest score:"+"{:,}".format(history_high_score)
self.history_high_score_image=self.font.render(history_high_score_str,
True,self.text_color,self.ai_settings.bg_color)
self.history_high_score_rect=self.history_high_score_image.get_rect()
self.history_high_score_rect.left=self.high_score_rect.right+45
self.history_high_score_rect.top=self.high_score_rect.top def prep_level(self):
self.level_image=self.font.render("Level:"+str(self.stats.level),True,
self.text_color,self.ai_settings.bg_color)
'''将等级放在得分下方'''
self.level_rect=self.level_image.get_rect()
self.level_rect.right=self.score_rect.right
self.level_rect.top=self.score_rect.bottom+10 def prep_ships(self):
self.ships=Group()
for ship_number in range(self.stats.ships_left):
ship=Ship(self.ai_settings,self.screen)
ship.rect.x=10+ship_number*ship.rect.width
ship.rect.y=10
self.ships.add(ship) def show_score(self):
self.screen.blit(self.score_image,self.score_rect)
self.screen.blit(self.high_score_image,self.high_score_rect)
self.screen.blit(self.history_high_score_image,
self.history_high_score_rect)####
self.screen.blit(self.level_image,self.level_rect)
self.ships.draw(self.screen)

(scoreboard)

给出游戏中用到的各种函数部分:

 import sys
import pygame
import random
import time
from bullet import Bullet
from alien import Alien
from time import sleep def check_keydown_events(event,ai_settings,stats,screen,ship,bullets):#stats
if event.key==pygame.K_RIGHT:
#向右移动一格
ship.moving_right=True
elif event.key==pygame.K_LEFT:
ship.moving_left=True
elif event.key==pygame.K_UP:
ship.moving_up=True
elif event.key==pygame.K_DOWN:
ship.moving_down=True
elif event.key==pygame.K_SPACE:
fire_bullets(ai_settings,screen,ship,bullets)
elif event.key==pygame.K_q:#按q键退出界面
renew_history_high_score(stats)###########
pygame.quit()
sys.exit() def check_keyup_events(event,ship):
if event.key==pygame.K_RIGHT:
ship.moving_right=False
elif event.key==pygame.K_LEFT:
ship.moving_left=False
elif event.key==pygame.K_UP:
ship.moving_up=False
elif event.key==pygame.K_DOWN:
ship.moving_down=False def fire_bullets(ai_settings,screen,ship,bullets):
if len(bullets)<ai_settings.bullets_allowed: new_bullet=Bullet(ai_settings,screen,ship)
bullets.add(new_bullet) def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,
bullets): for event in pygame.event.get(): if event.type==pygame.QUIT:
renew_history_high_score(stats)###########
pygame.quit()
sys.exit() elif event.type==pygame.KEYDOWN:
check_keydown_events(event,ai_settings,stats,screen,ship,bullets)
##########stats
elif event.type==pygame.KEYUP:
check_keyup_events(event,ship)
elif event.type==pygame.MOUSEBUTTONDOWN:
mouse_x,mouse_y=pygame.mouse.get_pos()
check_play_button(ai_settings,screen,stats,sb,play_button,ship,
aliens,bullets,mouse_x,mouse_y) def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,
bullets,mouse_x,mouse_y):
button_clicked=play_button.rect.collidepoint(mouse_x,mouse_y)
if button_clicked and not stats.game_active:
ai_settings.initialize_dynamic_settings()
#隐藏光标
pygame.mouse.set_visible(False)
#重置统计信息
stats.reset_stats()
stats.game_active=True
#重置记分牌图像
sb.prep_score()
sb.prep_high_score()
sb.prep_level()
sb.prep_ships() #清空外星人和子弹
aliens.empty()
bullets.empty() create_fleet(ai_settings,screen,ship,aliens)
ship.center_ship() def update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button): screen.fill(ai_settings.bg_color)
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
#alien.blitme
aliens.draw(screen)
sb.show_score()
#如果处于非活动状态,绘制Play按钮
if not stats.game_active:
play_button.draw_button()
pygame.display.flip() def check_bullet_alien_collisions(ai_settings,screen,stats,sb,
ship,aliens,bullets):
collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)
if collisions:
for aliens in collisions.values():
stats.score+=ai_settings.alien_points*len(aliens)
#每个值都是一个列表!!!
sb.prep_score()
check_high_score(stats,sb)
if len(aliens)==0: bullets.empty()
ai_settings.increase_speed()
stats.level+=1
sb.prep_level()
create_fleet(ai_settings,screen,ship,aliens) def update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):
bullets.update() for bullet in bullets.copy():
if bullet.rect.bottom<=0:
bullets.remove(bullet)
#碰撞后返回一个字典
check_bullet_alien_collisions(ai_settings,screen,stats,sb,
ship,aliens,bullets) def get_number_aliens_x(ai_settings,alien_width):
available_space_x=ai_settings.screen_width-2*alien_width
number_aliens_x=int(available_space_x/(2*alien_width))
return number_aliens_x def get_number_rows(ai_settings,ship_height,alien_height):
''''计算屏幕可容纳行数'''
available_space_y=(ai_settings.screen_height-
(3*alien_height)-ship_height)
number_rows=int(available_space_y/(2*alien_height))
return number_rows def create_alien(ai_settings,screen,aliens,alien_number,row_number):
alien=Alien(ai_settings,screen)
alien_width=alien.rect.width
alien.x=alien_width+2*alien_width*alien_number
alien.rect.x=alien.x
alien.rect.y=alien.rect.height+2*alien.rect.height*row_number
aliens.add(alien) def create_fleet(ai_settings,screen,ship,aliens):
'''创建外星人群'''
#外星人间距为外星人宽度
alien=Alien(ai_settings,screen)
number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)
total_alien_number=number_aliens_x*number_rows
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
#创建一个外星人并将其加入当前行
create_alien(ai_settings,screen,aliens,alien_number,
row_number) def change_fleet_direction(ai_settings,aliens):
for alien in aliens.sprites():
alien.rect.y+=ai_settings.fleet_drop_speed
ai_settings.fleet_direction*=-1######## def ship_hit(ai_settings,stats,sb,screen,ship,aliens,bullets):
if stats.ships_left>0: stats.ships_left-=1
sb.prep_ships()
aliens.empty()
bullets.empty() create_fleet(ai_settings,screen,ship,aliens)
ship.center_ship() sleep(0.5)
else:
stats.game_active=False
pygame.mouse.set_visible(True) def check_aliens_bottom(ai_settings,stats,sb,screen,ship,aliens,bullets):
screen_rect=screen.get_rect()
for alien in aliens.sprites():
if alien.rect.bottom>=screen_rect.bottom:
ship_hit(ai_settings,stats,sb,screen,ship,aliens,bullets)
break def check_fleet_edges(ai_settings,aliens):
for alien in aliens.sprites():
if alien.check_edges():
#change_fleet_direction(ai_settings,aliens)
#break
alien.direction*=-1#random.choice([1,-1])
alien.rect.y+=ai_settings.fleet_drop_speed #def change_alien_direction() def check_time(ai_settings,aliens):
now=time.time()
running_time=int(now-start)
if running_time==1:
for alien in aliens.sprites():
alien.direction*=-1#random.choice([1,-1])
alien.rect.y+=ai_settings.fleet_drop_speed def update_aliens(ai_settings,stats,sb,screen,ship,aliens,bullets):
#check_time(start,ai_settings,aliens)
check_fleet_edges(ai_settings,aliens)
#check_time(ai_settings,aliens)
aliens.update() if pygame.sprite.spritecollideany(ship,aliens):
ship_hit(ai_settings,stats,sb,screen,ship,aliens,bullets)
check_aliens_bottom(ai_settings,stats,sb,screen,ship,aliens,bullets) def check_high_score(stats,sb):
if stats.score>stats.high_score:
stats.high_score=stats.score
sb.prep_high_score() def renew_history_high_score(stats):##########
filename='highscore.txt'
with open(filename) as file_object:
lines=file_object.readlines()
temp_string=''
for line in lines:
temp_string+=line.rstrip()
if stats.high_score>eval(temp_string):
with open(filename,'w') as file:
file.write(str(stats.high_score))

最后给出程序的主要部分
主要部分中引入了pygame ,time以及Group
创建了 飞船对象,alien对象,子弹对象,游戏设置,游戏状态,游戏控制按钮,计分板。

 """
待加入项目:
1.引入历史最高分 ### 已完成
2.加入随机飞行系统 ### 基本完成/衰
""" import pygame
import time
from pygame.sprite import Group
from game_stats import GameStats from settings import Settings
from ship import Ship
from alien import Alien
from button import Button
from scoreboard import Scoreboard
import game_functions as gf def run_game():
#初始化对象并创建一个屏幕对象
pygame.init() #初始化
ai_settings=Settings()
screen=pygame.display.set_mode((
ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
#创建一个按钮
play_button=Button(ai_settings,screen,'Play')
ship=Ship(ai_settings,screen)#创建一个飞船 #创建一个子弹编组
bullets=Group()
aliens=Group()
bg_color=(230,230,230)
alien=Alien(ai_settings,screen)
gf.create_fleet(ai_settings,screen,ship,aliens)
#创建存储游戏统计信息的实例,并创建记分牌
stats=GameStats(ai_settings)
sb=Scoreboard(ai_settings,screen,stats)
#start=time.time()
while True: #监视键盘和鼠标事件
gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,
bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)
gf.update_aliens(ai_settings,stats,sb,screen,ship,aliens,bullets)
gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,
play_button) run_game()
chenk_events部分检测了鼠标以及键盘按键

Python pygame库的应用的更多相关文章

  1. python常用库

    本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:vinta.欢迎加入翻译组. Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 ...

  2. python+pygame游戏开发之使用Py2exe打包游戏

    最近在用python+pygame 开发游戏,写完以后在分享给朋友玩的时候遇到了很大的问题,只有搭建了环境才能运行python脚本. 这会吓退99%以上的人……所以把我们的游戏打包(注意是打包而不是编 ...

  3. Python标准库与第三方库详解(转载)

    转载地址: http://www.codeweblog.com/python%e6%a0%87%e5%87%86%e5%ba%93%e4%b8%8e%e7%ac%ac%e4%b8%89%e6%96%b ...

  4. 常用Python第三方库 简介

    如果说强大的标准库奠定了python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的发展一些稳定的第三库被加入到了标准库里面,这里有6000多个第三方库的介绍:点这里或者访 ...

  5. Python常用库大全

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  6. Python必备库

    Python必备库 --default-timeout=100避免网络延迟错误:-U给管理员权限. Python基础库 pip --default-timeout=100 install -U pyg ...

  7. python的库小全

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  8. 【Python基础】安装python第三方库

    pip命令行安装(推荐) 打开cmd命令行 安装需要的第三方库如:pip install numpy 在安装python的相关模块和库时,我们一般使用“pip install  模块名”或者“pyth ...

  9. python 三方库

    ---------------- 这又是一个 Awesome XXX 系列的资源整理,由 vinta 发起和维护.内容包括:Web框架.网络爬虫.网络内容提取.模板引擎.数据库.数据可视化.图片处理. ...

随机推荐

  1. Python Tricks(十九)—— switch 的实现

    python 原生语法不支持 switch,体现了 Python 大道至简的设计思路,有时为了避免啰嗦的 if elif等判断语句,我们可以用字典来代替 switch 的各分支,也即建立表达式和操作的 ...

  2. 【前端】JavaScript表达式-新手必看

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6145384.html 一.什么是表达式 表达式就是JavaScript里一个短句,JavaScript解释器会将 ...

  3. 洛谷 P1236 算24点

    题目描述 几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为"算24点".您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数 ...

  4. SPOJ OTOCI 动态树 LCT

    SPOJ OTOCI 裸的动态树问题. 回顾一下我们对树的认识. 最初,它是一个连通的无向的无环的图,然后我们发现由一个根出发进行BFS 会出现层次分明的树状图形. 然后根据树的递归和层次性质,我们得 ...

  5. 解决 2003 Can’t connect to MySQL server on ‘localhost’ (10048)

    2003 Can’t connect to MySQL server on ‘localhost’ (10048)一般见于使用mysql的windows 2003服务器.错误的出现的原因: 第一种原因 ...

  6. bzoj 1664: [Usaco2006 Open]County Fair Events 参加节日庆祝【dp+树状数组】

    把长度转成右端点,按右端点排升序,f[i]=max(f[j]&&r[j]<l[i]),因为r是有序的,所以可以直接二分出能转移的区间(1,w),然后用树状数组维护区间f的max, ...

  7. P4727 [HNOI2009]图的同构记数

    传送门 如果我们把选出子图看成选出边,进而看成对边黑白染色,那么就是上一题的弱化版了,直接复制过来然后令\(m=2\)即可 不过直接交上去会T,于是加了几发大力优化 不知为何华丽的被小号抢了rank2 ...

  8. java HashMap和LinkedHashMap区别

    我们用的最多的是HashMap,在Map 中插入.删除和定位元素,HashMap 是最好的选择.但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好.如果需要输出的顺序和输入的相同,那么用 ...

  9. 371 Sum of Two Integers 两整数之和

    不使用运算符 + 和-,计算两整数a .b之和.示例:若 a = 1 ,b = 2,返回 3. 详见:https://leetcode.com/problems/sum-of-two-integers ...

  10. sql剪切数据

    实际项目当中用到的案例,个人笔记. USE [CA-SM]GO/****** Object:  StoredProcedure [dbo].[PG_SM_AddSum]    Script Date: ...