Python 游戏开发

需要用到pygame模块

常用语句

1.pygame.init()

初始化,使用前都加一句

2.pygame.display.set_mode(size)

设置游戏屏幕宽高

3.pygame.display.set_caption('game')

设置屏幕标题

4.pygame.image.load('a.jpg')

加载图片,加载后如果要控制其,需要先用get_rect()获取其位置,然后用move(x,y)移动,举例:

picture = pygame.image.load('a.jpg') #添加个图片在里面
position = picture.get_rect() #获取图像的位置矩形
position = position.move(1,1) #移动图像,这里是同时向右下移动1px
5.pygame.transform.flip(picture, True, True)

设置图像翻转,第一个代表翻转的图像,第二个代表是否水平翻转,第三个代表是否垂直翻转

6.screen.fill((255,255,255))

设置填充背景,如果不设置,原来的内容就会一直在,其实就相当于每次更新界面时把界面clear了一下,并且clear成我们想要的背景,不过这句运行后不会直接填充,其只是写入到内存,真正填充需要在pygame.display.flip()这句运行后才会显示

7.screen.blit(picture, position)

更新图像,跟那面那句一样只是写入到内存,真正要看到更新需要运行下面那句才能够显示

8.pygame.display.flip()

更新整个界面,也就是将所有内容一起更新显示,如果没有这句,整个屏幕一片黑,什么都没有

9.pygame.time.delay(10)

设置时间延迟(ms)

10.设置频率

需要先实例化一个Clock()对象,然后再设置频率,举例:

clock = pygame.time.Clock()
clock.tick(200) #频率为1秒更新200次,假如设置一次移动2px,那么就会一秒移动200px
10.pygame.QUIT

退出游戏

常用方法

对图像

1.pygame.transform.flip(picture, True, False)
将图像翻转更新,第一个参数是要更新的东西,第二个代表是否水平翻转,第三个代表是否垂直翻转

2.pygame.transform.rotate(picture, angle)
将图像旋转(逆时针),第一个参数是图像,第二个是度数,比如逆时针转90度:

pygame.transform.rotate(picture, 90)

3.pygame.transform.smoothscale(picture, (x,y))
缩放图像,第一个参数是图像,后一个参数为元组,里面有两个元素,分别是其x、y方向大小,举例:

picture = pygame.transform.smoothscale(picture, (position.width*2,position.height*2))  #这里把长宽变为原来的两倍

4.surface.set_colorkey((r,g,b))
把想要变色的颜色弄透明,举例:

picture = pygame.imgae.load('a.jpg').convert()
#要弄透明,最好给图片弄个透明设置通道,也就是加个.convert()/.convert_alpha(),因为jpg不支持后者,所以这里用第一个
picture.set_colorkey((255,255,255)) #把白色弄透明

注:
jpg图片来说,透明度效果可能不太好,旁边偏白的阴影去不掉,而png图片一般就能处理的很好

5.surface.set_alpha(num)
也是设置透明度,将整个图片设置透明度,范围:0-255,举例:

picture = pygame.imgae.load('a.png').convert_alpha() #加个.convert_alpha,给图片弄个透明设置通道
picture.set_alpha(80)  #将透明度设置为80

注:
4、5两种透明度处理方法可以联合起来使用,比如把白色部分透明了,再把整体透明了

6.surface.get_at((x,y))
获得surface对象上某个坐标的颜色像素,举例:

picture = pygame.image.load('a.png')
position = picture.get_rect()
print(picture.get_at(position.center)) #输出图片最中间点的颜色
结果为:(136, 0, 21, 255)

说明红绿蓝对应配色,以及透明度(255代表不透明)

7.surface.set_at((x,y),num)
设置surface对象上某个坐标的透明度,举例:

picture = pygame.image.load('a.png')
for each in range(200,500):
    picture.set_at((300,each),0)    #将图片坐标(300,200-500)之间的点都弄空白
绘制图形

1.pygame.draw.rect(surface,(r,g,b),rect,width)
绘制一个矩形,第一个参数说明画在哪个surface上,比如可以是屏幕,也可以是图像上,第二个参数是一个颜色参数的元组,第三个矩形的区域,需要传入二层元组((x,y),(width,height)),x、y表示其左上角坐标,width、height表示其长宽,第四个是线条宽度(当为0的时候代表填充内部),举例:

screen = pygame.display.set_mode((200,200))
pygame.draw.rect(screen,(255,0,0),((100,100),(5,5)),1) #在屏幕上画一个红色矩形

2.pygame.draw.circle(Surface, color, pos, radius, width)
绘制一个圆形,第三个参数是圆心坐标,第四个是半径,举例:

pygame.draw.circle(picture, (255,0,0), (10,10), 10, 1)

3.pygame.draw.line(Surface, color, start_pos, end_pos, width)
绘制一条直线,第三、四个参数代表起点和终点,举例:

pygame.draw.line(screen, (255,0,0), (1,1), (50,50), 1)

注:
还有个aaline,和line差不多,但是抗锯齿,也就是看起来比line柔顺些,举例:

pygame.draw.aaline(screen, (255,0,0), (1,1), (50,50), 1)

4.pygame.draw.lines(Surface, color, closed, pointlist, width)
绘制一堆线段,第三个参数代表是否首尾两个点相连(0就不相连,1相连),第四个参数是一堆点坐标的列表,举例:

list_lines = ((1,1),(10,0),(200,3),(2,50),(3,6),(5,1))
pygame.draw.lines(screen, (255,0,0), 1, list_lines, 1)

注:
像线段这种东西是没有包着东西的,所以说width不能设置为0(否则没东西显示),因为填充不了(aaline除外,而且aaline如果设置为0,会比原来更深、粗一点)

5.pygame.draw.polygon(Surface, color, pointlist, width)
绘制一个多边形,第三个参数是坐标列表,代表多边形各个顶点,其实和上面那个一堆线段效果挺像的,但是这个是一个图形,有东西包着,所以可以width=0来填充,举例:

list_poly = ((1,1),(10,0),(200,3),(2,50),(3,6),(5,1))
pygame.draw.polygon(screen, (255,0,0), list_poly, 0)

6.pygame.draw.ellipse(Surface, color, rect, width)
绘制一个椭圆,其实质就是照着一个矩形里绘制一个最大的圆,所以第三个参数就是那个外面框这的矩形大小(假装有),举例:

pygame.draw.ellipse(screen, (255,0,0), (220,50,200,200), 0)
#这个比较圆
pygame.draw.ellipse(screen, (0,0,0), (100,100,400,100), 1)
#这个比较扁,这两个看起来是不是很像太阳系

7.pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width)
绘制一个弧线,最后两个参数是起始/结束角度(逆时针),其实质就像是描绘椭圆的外边多少度到多少度的那一段线,用这个前最好先:import math,这样就可以使用pi(3.1415926...)了,举例:

import math
pygame.draw.arc(screen, (0,0,0), (220,50,200,200), 0, math.pi, 1) #从0度到180的圆弧
更多pygame.draw参考

https://www.cnblogs.com/leonyoung/archive/2012/07/01/2572205.html

对其他

1.pygame.mouse.get_pos()
获得当前鼠标位置

常见事件

(在pygame下,比如:pygame.QUIT

QUIT:按下右上角
KEYDOWN/KEYUP:按下/松开某个键
MOUSEMOTION:移动鼠标
MOUSEBUTTONDOWN/MOUSEBUTTONUP:按下/松开鼠标(其对应的button中1为左键,2为中间的,3为右键,4为向上滚轮,5为向下滚轮)

注:
上面内容对应event.type,比如要判断为按下鼠标左键键时:

if event.type == MOUSEBUTTONDOWN:   #判断为鼠标按下
    if event.button == 1    #1为左键
        pass

键盘按键代码

(在pygame下,比如:pygame.K_0

K_0          0,对应的还有其他数字
K_a          a,对应的还有其他字母
K_KP         数字键盘上的0-9
K_UP         ↑,对应的还有DOWN/RIGHT/LEFT
K_F1         F1,对应的还有其他
K_BACKSPACE  回退键
K_TAB        TAB键
K_SPACE      空格键
K_RETURN     回车
K_RSHIFT     右边的shift,对应的还有LSHIFT
K_RALT       右边的alt,对应的还有LALT
K_RCTRL      右边的ctrl,对应的还有LCTRL

注:
上面的属性对应的是event.key,比如要判断是否为上键时:

if event.type == pygame.KEYDOWN:    #判断为键盘按下
    if event.key == pygame.K_UP:    #判断哪个key
        pass

动画精灵

其实就是指一个图片类,比如飞机游戏中的飞机,然后新建一个类,里面就存这个飞机的图片
类继承于pygame.sprite.Sprite
然后pygame使用精灵组来管理精灵的绘制和更新,精灵组是一个简单的容器。一般使用pygame.sprite.Group()函数来创建一个精灵组,当要添加时用group.add(sprite_one)

举例
class Ball(pygame.sprite.Sprite):  
    def __init__(self, image, position, speed):  
        pygame.sprite.Sprite.__init__(self)  
        
        self.image = pygame.image.load(image).convert_alpha()  
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = position    #确定左上角位置
        self.speed = speed

init()
screen = display.set_mode((600,400))
image = "a.jpg"
balls = []
for i in range(5):
    position = [random.randint(0,600), random.randint(0,400)]
    speed = [random.randint(0,10), random.randint(0,10)]
    ball = Ball(image, position, speed)
    balls.append(ball)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    for each in balls:
        screen.blit(each.image, each.rect)
    display.flip()
参考

https://www.cnblogs.com/msxh/p/5013555.html

碰撞检测

pygame.sprite.spritecollide(sprite, group, dokill, collied=None)
用于检测某个精灵是否和组中其他精灵相撞,第一个参数用于指定某个精灵,第二参数用于指定一个组(由sprite.Group()来生成),第三个用于设置是否从组中删除检测到碰撞的精灵,第四个参数指定一个回调函数,用于定制一个特殊的检测方法(默认情况下检测精灵之间的rect属性),举例:

pygame.sprite.spritecollide(picture, group, False, pygame.sprite.collide_circle)
实例1.移动图像小游戏,会自动移动,还可以通过键盘方向键移动

(自动移动、键盘事件)

import pygame
import sys

pygame.init()       #使用pygame前需要初始化一下
size = width, height = 600, 400
speed = [-2, 1]     #第一个参数代表x轴方向移动像素,这里就是向左移动2px,第二个就是向下移动1px
bg = (255, 255, 255)
fullscreen = False      #先不全屏
screen = pygame.display.set_mode(size)      #设置屏幕大小
pygame.display.set_caption('game')          #设置标题
picture = pygame.image.load('a.jpg')        #添加个图片在里面
position = picture.get_rect()               #获取图像的位置矩形
l_head = picture
r_head = pygame.transform.flip(picture, True, False)

while True:
    for event in pygame.event.get():        #获取事件
        if event.type == pygame.QUIT:       #当点击右上角×时,关闭
            sys.exit()
        if event.type == pygame.KEYDOWN:    #当点击键盘上的按键时
            if event.key == pygame.K_UP:    #当按上键时,移动方向变成正上方
                speed = [0, -1]
            if event.key == pygame.K_DOWN:
                speed = [0, 1]
            if event.key == pygame.K_LEFT:
                speed = [-1, 0]
                picture = l_head
            if event.key == pygame.K_RIGHT:
                speed = [1, 0]
                picture = r_head
            
            if event.key == pygame.K_F11:   #设置F11为全屏
                fullscreen = not fullscreen #点击后原来False和True就对调
                if fullscreen:
                    size = width, heigth = 1920, 1080   #屏幕大小改变了,边界也记得改变
                    screen = pygame.display.set_mode(size, pygame.FULLSCREEN | pygame.HWSURFACE)
                    #设置屏幕,第一个参数就是尺寸,第二个代表全屏,第三个是只有全屏才支持的硬件加速
                else:
                    size = width, heigth = 600, 400     #变回原来尺寸后边界尺寸也得变回来
                    screen = pygame.display.set_mode(size)

    position = position.move(speed)         #图像位置移动
    
    if position.left < 0 or position.right > width:     #当要超出左/右边界时
        picture = pygame.transform.flip(picture, True, False)
        #将图像翻转更新,第一个参数是要更新的东西,第二个代表是否水平翻转,第三个代表是否垂直翻转
        speed[0] = -speed[0]        #速度反过来,原来向左就变成向右
        
    if position.top < 0 or position.bottom > height:
        speed[1] = -speed[1]
        
    screen.fill(bg)     #设置填充背景
    screen.blit(picture, position)      #更新图像
    pygame.display.flip()       #更新界面
    pygame.time.delay(10)       #设置10毫秒延迟
实例2.设置图片,并可以用鼠标拖动(鼠标事件)
import pygame
import sys

pygame.init()  # 使用pygame前需要初始化一下

size = width, height = 600, 400
bg = (255, 255, 255)
screen = pygame.display.set_mode(size)  # 设置屏幕大小
pygame.display.set_caption('game')  # 设置标题
picture = pygame.image.load('a.jpg')  # 添加个图片在里面
position = picture.get_rect()  # 获取图像的位置矩形
moving = False      #后面鼠标事件用来判断使用

while True:
    for event in pygame.event.get():  # 获取事件
        if event.type == pygame.QUIT:  # 当点击右上角×时,关闭
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:    #当按下鼠标时
            if event.button == 1:   #按下的是鼠标左键
                moving = True
        if event.type == pygame.MOUSEBUTTONUP:      #当松开鼠标时
            if event.button == 1:
                moving = False
    if moving:
        position = pygame.mouse.get_pos()   #当moving为True时设置位置为鼠标当前的位置

    screen.fill(bg)  # 设置填充背景
    screen.blit(picture, position)  # 更新图像
    pygame.display.flip()  # 更新界面
    pygame.time.delay(10)  # 设置10毫秒延迟
实例3.将事件显示在屏幕
import pygame
import sys

pygame.init()

size = width, height = 600, 400
screen = pygame.display.set_mode(size)
pygame.display.set_caption('game')
bg = (0,0,0)    #背景设置为黑色
font = pygame.font.Font(None, 20)  #实例一个font对象,第一个参数是字体,这里选择默认,第二个是字体大小
line_height = font.get_linesize()  #将get_linesize()获取的行高赋值给行高
position = 0
screen.fill(bg)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
            
        screen.blit(font.render(str(event), True, (0,255,0)), (0, position))
        #font.render()用于渲染文字,第一个参数是要渲染的文本,这里将事件获取的内容渲染
        #第二个参数代表是否删除锯齿(去除模糊的马赛克)
        #第三个参数是渲染颜色
        position += line_height     #渲染一次后,位置移动到下一行
        
        if position > height:       #当内容写满(大于屏幕高度),清屏
            position = 0
            screen.fill(bg)
            
    pygame.display.flip()
实例4.自动贪食蛇
from pygame import *
import pygame
import sys
import random

init()
screen = display.set_mode((600,400))
cat = image.load("a.jpg")
position = cat.get_rect()
a = random.randint(100,600),random.randint(100,400)
speed = [0,0]

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()

    if position.center[0] < a[0]:      #通过判断图片和随机生成点的位置来进行移动
        speed[0] = 1
    if position.center[1] < a[1]:
        speed[1] = 1
    if position.center[0] > a[0]:
        speed[0] = -1
    if position.center[1] > a[1]:
        speed[1] = -1
    if position.center[0] == a[0]:
        speed[0] = 0
    if position.center[1] == a[1]:
        speed[1] = 0

    if (position.center[0] == a[0]) & (position.center[1] == a[1]):
        a = random.randint(100, 600), random.randint(100, 400)
    position = position.move(speed)

    screen.fill((255,255,255))
    draw.rect(screen, (255,0,0), ((a),(10,10)),0)
    screen.blit(cat, position)
    display.flip()
    time.delay(3)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容