还有就是听到移动类这节课,也是,我觉得好像是同一个问题,这步
.direction == :
.rect.left + .rect.height < MainGame.SCREEN_WIDTH:
.rect.left += .speed
和向下边界优化失败。。。。。原因未知啊?
import pygame
_display = pygame.display#简化了pygame.display的写法
# 8.设置窗口的颜色,定义全局参数变量,随时可以用
COLOR_BLACK = pygame.Color(0, 0, 0)
COLOR_RED = pygame.Color(255, 0, 0)
version="V1.08"#添加的全局变量,方便修改版本数字
class MainGame():#主逻辑类
window = None#2.游戏主窗口,属性性质
#变量窗口的高度和宽度
SCREEN_HEIGHT = 1000#宽度
SCREEN_WIDTH = 100#高度
#创建我方坦克
TANK_P1 = None
def __init__(self):
pass
def startgame(self):#开始游戏,1.创建窗口
pygame.display.init()#3.(创建初始化窗口,借鉴官方文档))
# 4.展示窗口,参数用类名调用,最后要存储起来存储在window里
MainGame.window = _display.set_mode([MainGame.SCREEN_HEIGHT,MainGame.SCREEN_WIDTH])
MainGame.TANK_P1 = Tank(300,700)#将坦克展示在窗口中,创建我方坦克
#5.设置游戏标题
_display.set_caption("坦克大战"+version)
#6.持续刷新窗口界面
while True:
#7.给窗口完成一个填充颜色
MainGame.window.fill(COLOR_BLACK)
#在循环中持续完成事件的获取
self.getevent()
#将绘制文字得到的小画布粘贴在窗口中
MainGame.window.blit(self.gettextsurface("剩余敌方坦克 %d辆"%5),(5,5))
#将我方坦克加载到窗口中
MainGame.TANK_P1.displayTank()
# 窗口的刷新
_display.update()
def getevent(self):#获取程序进行中所有事件(鼠标事件,键盘事件)
#1.获取所有事件
eventlist = pygame.event.get()
#2.对事件进行判断处理(1.点击关闭按钮 2.按下键盘上的某个按键)event.type--事件的属性
for event in eventlist:#遍历列表
#判断event.type 是否为Quit ,如果是退出的话,直接调用程序退出方法
if event.type == pygame.QUIT:
self.endgame()#同一个类里调用其它成员的方法,要用self
#判断事件类型是否为按键按下,如果是,继续判断是哪一个按键,来进行对应处理
if event.type == pygame.KEYDOWN:
#具体是哪一个按键的处理
if event.key == pygame.K_LEFT:
print("坦克向左掉头,移动")
#修改坦克方向 第二步
MainGame.TANK_P1.direction = "L"
#完成移动操作(调用坦克移动的方法) 第三步
MainGame.TANK_P1.move()
elif event.key == pygame.K_RIGHT:
print("坦克向右掉头,移动")
# 修改坦克方向
MainGame.TANK_P1.direction = "R"
# 完成移动操作(调用坦克移动的方法)
MainGame.TANK_P1.move()
elif event.key == pygame.K_UP:
print("坦克向上掉头,移动")
# 修改坦克方向
MainGame.TANK_P1.direction = "U"
# 完成移动操作(调用坦克移动的方法)
MainGame.TANK_P1.move()
elif event.key == pygame.K_DOWN:
print("坦克向下掉头,移动")
# 修改坦克方向
MainGame.TANK_P1.direction = "D"
# 完成移动操作(调用坦克移动的方法)
MainGame.TANK_P1.move()
elif event.key == pygame.K_SPACE:
print("坦克发射子弹")
#添加一个绘制的方法,左上角文字绘制的功能
def gettextsurface(self,text):
#初始化字体模块
pygame.font.init()
#查看系统支持的所有字体
#fontList = pygame.font.get_fonts()
#print(fontList)
#得到一个合适的字体
font = pygame.font.SysFont("kaiti",18)
#使用对应的字符完成完成相关内容的操作
textsurface = font.render(text,True,COLOR_RED)
return textsurface
def endgame(self):#结束游戏
print("谢谢使用,我们会再接再厉")
exit()#结束python解释器
class Tank():#定义一个坦克类
def __init__(self,left,top):#定义x和y参数,指定坦克的位置
self.images = {
"U":pygame.image.load("C:/Users/王同学/Documents/temp/1553563124474147/img/p1tankU.gif"),#从磁盘加载图片
"D":pygame.image.load("C:/Users/王同学/Documents/temp/1553563124474147/img/p1tankD.gif"),
"L":pygame.image.load("C:/Users/王同学/Documents/temp/1553563124474147/img/p1tankL.gif"),
"R":pygame.image.load("C:/Users/王同学/Documents/temp/1553563124474147/img/p1tankR.gif")
}#图片的四个方向
self.direction = "U"#坦克的方向
self.image = self.images[self.direction]#坦克当前的位置方向
#坦克的区域 rect---返回rect类型
self.rect = self.image.get_rect()
#指定坦克初始化位置,分别距x,y,轴的位置
self.rect.left = left
self.rect.right = top
#新增速度属性,第一步
self.speed = 15
def move(self):#移动类,改方向值
#第 四 步,
if self.direction == "L":
if self.rect.left > 0:
self.rect.left -= self.speed
elif self.direction == "R":
if self.rect.left + self.rect.height < MainGame.SCREEN_WIDTH:
self.rect.left += self.speed
elif self.direction == "U":
if self.rect.top > 0:
self.rect.top -= self.speed
elif self.direction == "D":
if self.rect.top + self.rect.height < MainGame.SCREEN_HEIGHT:
self.rect.top += self.speed
def shot(self):#射击类
pass
def displayTank(self):#展示坦克(将坦克这个小的表面展示到窗口中,用 blit(粘贴方法))
#1.重新设置坦克图片
self.image = self.images[self.direction]
#2.将坦克加载到窗口中
MainGame.window.blit(self.image,self.rect)
class MyTank(Tank):#我方坦克继承父类坦克
def __init__(self):
pass
class EnemyTank(Tank):#敌方坦克继承父类坦克
def __init__(self):
pass
class Bullet():#子弹类
def __init__(self):
pass
def move(self):#子弹移动方法
pass
def displayBullet(self):#子弹展示方法
pass
class Explode():#爆炸类
def __init__(self):
pass
def displayExplode(self):#展示爆炸效果方法
pass
class Wall():#墙壁类
def __init__(self):
pass
def displayWall(self):#展示墙壁方法
pass
class Music():
def __init__(self):
pass
def play(self):#开始播放音乐
pass
MainGame().startgame()