pygame学习教程(三) 编写第一个类

前一篇
在这里我会通过一个例子介绍pygame以及让大家学习python的类和面向对象的思想。对象的本质就是将很多共有的数据和方法归纳起来继承。抽象:提取现实世界中某事物的关键特性。编写一个具体的类再去理解是非常好的办法。
为什么说用pygame学习类非常形象?考虑下面场景。一个英雄,有名字,属性(魔法值,或体力),以及道具,技能,移动等等。我们可以定义很多函数管理他。一个英雄没有问题,假设我们定义函数管理属性类似name,property,move,还需要定义一些函数管理行为。这没有
问题。可是我需要多个英雄。每一个都去定义,这是很麻烦的工作。
第一.命名的不规范很可能引起混乱,尤其类似于Jon_move(),Jion_mov()命名,还有就是变量的管理,在英雄没有退出游戏前,关于它的变量是需要一直保存的,应该是私有的(private)。仅仅这两个因素就值得你使用类啦,他会让你的思路很清晰,不必去思考我究竟是定义了Jon_move(),Jion_mov()问题,可以然你的代码可读性更易于维护
我们的目标是完成一个可以移动的图像,在这个过程里。我会把我建立类,事件,响应,消息的实现思路和大家共享。首先考虑建立基类。我们需要获得鼠标点击事件,可能 需要移动,所以获得图像位置,显示图像显然是必须的。
第一步,让图像显示出来。
类的定义

import pygame
#导入pygame库
from pygame.locals import *
#导入一些常用的函数和常量
from sys import exit
import  pickle
from PIL import Image

class Jbutton():
    def __init__(self,vertex,mouse_image_filename):
        self.vertex=vertex                         #设置按钮顶点 set button vertex
        img = Image.open(mouse_image_filename)     #获得宽度,高度
        self.width,self.height=img.size
        self.mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()

    def SetPo(self):  #设置位置 set position  #
        screen.blit(self.mouse_cursor,self.vertex)

在这个类里我们定义了类的变量self.vertex,self.width,self.height, self.mouse_cursor 。和两个方法__init__ SetPo
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。
screen.blit(self.mouse_cursor,self.vertex)
Screen没有定义,引入外部的变量,实际上这种方法是不推荐的。后面会改掉。这里只是展示一下
完整代码
在这里插入图片描述

# coding: utf8
import pygame
#导入pygame库
from pygame.locals import *
#导入一些常用的函数和常量
from sys import exit
import  pickle
from PIL import Image

class Jbutton():
    def __init__(self,vertex,mouse_image_filename):
        self.vertex=vertex                         #设置按钮顶点 set button vertex
        img = Image.open(mouse_image_filename)     #获得宽度,高度
        self.width,self.height=img.size
        self.mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()

    def SetPo(self):  #设置位置 set position  #
        screen.blit(self.mouse_cursor,self.vertex)

if __name__ == "__main__":
    background_image_filename = 'sushiplate.jpg'
    mouse_image_filename = 'feid1.png'
    # 指定图像文件名称
    pygame.init()
    # 初始化pygame,为使用硬件做准备

    screen = pygame.display.set_mode((640, 480), 0, 32)
    # 创建了一个窗口
    pygame.display.set_caption("Hello, World!")
    # 设置窗口标题

    background = pygame.image.load(background_image_filename).convert()
    mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
    butto1 = Jbutton((12,13),mouse_image_filename)#tleft,top
    #mouse_cursor.get_height(),self.mouse_cursor.get_width()
    butto2 = Jbutton((12+mouse_cursor.get_width(),13+mouse_cursor.get_height()), mouse_image_filename)#测试范围
    print(butto1.__dict__)
    # 加载并转换图像
    while True:
        # 游戏主循环
        for event in pygame.event.get():
            if event.type == QUIT:
                # 接收到退出事件后退出程序
                exit()

        screen.blit(background, (0, 0))
        # 将背景图画上去

        x, y = pygame.mouse.get_pos()
        # 获得鼠标位置
        x -= mouse_cursor.get_width()+2
        y -= mouse_cursor.get_height()+2
        # 计算光标的左上角位置

        #screen.blit(mouse_cursor, (x, y))
        # 把光标画上去
        butto1.SetPo()
        butto2.SetPo()
        #screen.blit(mouse_cursor, butto1.vertex)
        pygame.display.update()
        # 刷新一下画面

后一篇

你可能感兴趣的:(pygame)