前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【pygame系列 第五课 弹球游戏重构 面向对象-上 】

【pygame系列 第五课 弹球游戏重构 面向对象-上 】

作者头像
叶子陪你玩
发布2020-03-12 14:52:28
5400
发布2020-03-12 14:52:28
举报
文章被收录于专栏:叶子陪你玩编程
实现思路:

第一步:创建游戏窗口

第二步:绘制一个弹球

第三步:让球动起来

球动起来的原理实际上就是球的位置发生了改变,位置是由球的x,y坐标决定的,所以只要不断改变球的坐标就可以实现动起来的效果了。

第四步:边界检测

怎样知道球出了边界呢?通过比较球的x,y坐标值与边界的坐标值,从而判断是否出了边界。

1.创建游戏窗口

代码:

代码语言:javascript
复制
import pygame
import sys

# 背景白色
bg = (255,255,255)
# 屏幕宽度和高度
size =width,height=400,300

def main():
  pygame.init()
  screen = pygame.display.set_mode(size)
  pygame.display.set_caption("弹球游戏")
  while True:
      for event in pygame.event.get():
          if event.type == pygame.QUIT:
              sys.exit()
      screen.fill(bg)
      pygame.display.flip()
main()

效果图:

解释:

创建一个main()主函数,将我们之前的初始化,创建窗口,事件检测,渲染游戏界面,更新等全部放到这个函数里面;固定不变的常量放在最前面,最后调用main()函数即可。

2.绘制一个弹球

代码:

代码语言:javascript
复制
import pygame
import sys
import random

# 背景白色
bg = (255,255,255)
# 屏幕宽度和高度
size =width,height=400,300
# 球的颜色 红色
ball_color = (255,0,0)
# 球的大小 半径
ball_size = 20
# 球的初始位置 设置在窗口中心位置
pos_x,pos_y = width//2-ball_size,height//2-ball_size
# 设置球的 初始速度
speed_x=random.randint(1,5)
speed_y=random.randint(1,5)

class Ball:
  def __init__(self,ball_color,pos,ball_size):
    self.color=ball_color
    self.pos=pos
    self.size=ball_size

class Game:
  def __init__(self):
    self.ball=Ball(ball_color,[pos_x,pos_y],ball_size)

  def process_event(self):
      for event in pygame.event.get():
          if event.type == pygame.QUIT:
              sys.exit()

  def display_frame(self,screen):
    screen.fill(bg)
pygame.draw.circle(screen,self.ball.color,self.ball.pos,self.ball.size)
    pygame.display.flip()

def main():
  pygame.init()
  screen = pygame.display.set_mode(size)
  pygame.display.set_caption("弹球游戏")
  game=Game()
  while True:
    game.process_event()
    game.display_frame(screen)
main()

效果:

解释:

新创建一个Ball和一个Game对象,ball初始化需要传入球的颜色,大小,位置;在Game类中初始化,并且将之前的main中的事件判断和渲染更新分别移动到Game类中的process_event和display_frame方法中;在main()初始化创建一个game类,并在循环中调用game的process_event和display_frame方法。

3.让球动起来

代码:

代码语言:javascript
复制
import pygame
import sys
import random

# 背景白色
bg = (255,255,255)
# 屏幕宽度和高度
size =width,height=400,300
# 球的颜色 红色
ball_color = (255,0,0)
# 球的大小 半径
ball_size = 20
# 球的初始位置 设置在窗口中心位置
pos_x,pos_y = width//2-ball_size,height//2-ball_size
# 设置球的 初始速度
speed_x=random.randint(1,5)
speed_y=random.randint(1,5)
class Ball:
  def __init__(self,ball_color,pos,ball_size,ball_speed):
    self.color=ball_color
    self.pos=pos
    self.size=ball_size
    self.speed=ball_speed

class Game:
  def __init__(self):
    self.ball=Ball(ball_color,[pos_x,pos_y],ball_size,[speed_x,speed_y])

  def process_event(self):
      for event in pygame.event.get():
          if event.type == pygame.QUIT:
              sys.exit()

  def run_logic(self):
    # 更改位置
      self.ball.pos[0] += self.ball.speed[0]
      self.ball.pos[1] += self.ball.speed[1]

  def display_frame(self,screen):
    screen.fill(bg)  pygame.draw.circle(screen,self.ball.color,self.ball.pos,self.ball.size)
    pygame.display.flip()

def main():
  pygame.init()
  screen = pygame.display.set_mode(size)
  pygame.display.set_caption("弹球游戏")
  game=Game()

  while True:
    game.process_event()
    game.run_logic()
    game.display_frame(screen)
    pygame.time.wait(100)
main()

效果:

解释:

给Ball类新添加一个属性speed,在Game类中初始化ball类对象时也需要增加一个speed参数,接着在Game类中新添加一个run_logic方法,专门用来处理游戏的逻辑,这里将球的位置参数pos增加速度,但是由于程序运行过快,在main()主函数中添加一个pygame.time.wait(100)让小球运动慢一些。

4.边界检测

代码:

代码语言:javascript
复制
  def run_logic(self):
    if self.ball.pos[0] <self.ball.size or self.ball.pos[0] > width-self.ball.size:
      self.ball.speed[0] = -self.ball.speed[0]
    if self.ball.pos[1] <self.ball.size or self.ball.pos[1] > height-self.ball.size:
      self.ball.speed[1] = -self.ball.speed[1]
    # 更改位置
    self.ball.pos[0] += self.ball.speed[0]
    self.ball.pos[1] += self.ball.speed[1]

解释:

将Game类中的run_logic处理是否碰到边界,方法没变,主要时变量名改成对应的类名了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档