Crossin的编程教室

标题: 【Pygame 第3课】 游戏中的事件 [打印本页]

作者: crossin先生    时间: 2013-8-21 19:15
标题: 【Pygame 第3课】 游戏中的事件
有人问,为什么突然讲游戏了?有人问,为什么不继续讲python的基础?有人问,为什么不讲爬虫?有人问,为什么不讲算法?……

因为有很多内容,每一块都有想听的人。因为同时不可能推送很多内容。因为我喜欢游戏开发,制作一款游戏的过程很有趣。我会尽量在论坛上补充更多方面的内容。微信上的推送有天生的限制,不能让所有人满足,大家见谅。

上次课讲了游戏最根本的框架,说到在每次循环中会接收玩家的操作。这是游戏中很重要的一个环节--事件响应。

玩家的操作会触发程序中的事件,常见的事件包括:关闭程序、按下键盘、移动鼠标、按下鼠标等等。今天我们挑其中一个来举例说明:“鼠标按下”事件(MOUSEBUTTONDOWN)。

还记得上次课中的这段代码吗:
  1. for event in pygame.event.get():
  2.     if event.type == pygame.QUIT:
  3.         #接收到退出事件后退出程序
  4.         pygame.quit()
  5.         exit()
复制代码
它就是一段事件响应的处理代码。pygame.event.get()会接收所有程序中的事件。当判断这个事件是一个关闭程序(QUIT)的事件时,就将程序关闭。

现在,我们要增加一个事件响应:当玩家点击了鼠标之后,就换一张背景图。

在for循环中新增一段if语句:
  1. if event.type == pygame.MOUSEBUTTONDOWN:
  2.     #接收到鼠标按下事件后更换背景
  3.     background = pygame.image.load('bg2.jpg').convert()
复制代码
pygame.image.load().convert()是将图片文件读入程序,后面的.convert()可以省略。

运行程序,在窗口上点击鼠标,背景会变成bg2.jpg的图案。为了显示效果,最好使用和bg.jpg长宽一样的图片。

3.png


不过点击了一次之后,背景就不会再变了。而实际上,在你每次点击的时候,程序都会去读取一遍bg2.jpg,这是没有必要。把这个程序的改进留给你们:点击鼠标的时候,背景可以在2张甚至多张图片间切换,另外最好不要每次都去读文件。

#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:312723402

面向零基础初学者的编程课
每天5分钟,轻松学编程




作者: eep    时间: 2013-8-22 10:38
我觉得可以同时讲游戏跟基础,毕竟没有基本游戏也做不了
作者: jpjlqone    时间: 2013-8-22 13:45
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. from sys import exit
  4. from pygame import *

  5. pygame.init()
  6. screen = pygame.display.set_mode((630, 300), 0, 32)
  7. pygame.display.set_caption("hello world")
  8. bg1 = image.load('bg.png').convert()
  9. bg2 = image.load('bg2.jpg').convert()
  10. target = True
  11. bg = bg1
  12. while 1:
  13.     for event in pygame.event.get():
  14.         if event.type == QUIT:
  15.             pygame.quit()
  16.             exit()
  17.         if event.type == MOUSEBUTTONDOWN:
  18.             if target:
  19.                 target = not target
  20.                 bg = bg2
  21.             else:
  22.                 target = not target
  23.                 bg = bg1
  24.     screen.blit(bg, (0,0))
  25.     pygame.display.update()
复制代码

作者: jpjlqone    时间: 2013-8-22 13:53
多张图片随机切换:
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. from sys import exit
  4. from pygame import *
  5. import random

  6. pygame.init()
  7. screen = pygame.display.set_mode((630, 300), 0, 32)
  8. pygame.display.set_caption("hello world")
  9. bg1 = image.load('bg.png').convert()
  10. bg2 = image.load('bg2.jpg').convert()
  11. bg3 = image.load('bg3.jpg').convert()
  12. bgcolor = [bg1, bg2, bg3]
  13. target = True
  14. bg = bg1
  15. while 1:
  16.     for event in pygame.event.get():
  17.         if event.type == QUIT:
  18.             pygame.quit()
  19.             exit()
  20.         if event.type == MOUSEBUTTONDOWN:
  21.             bg = random.choice(bgcolor)
  22.     screen.blit(bg, (0,0))
  23.     pygame.display.update()
复制代码

作者: Myk_cc    时间: 2013-8-22 23:08
点击鼠标在两个背景之间来回变换。。

# !/usr/bin/python

import pygame
from sys import exit

pygame.init()
screen = pygame.display.set_mode((600, 178), 0, 32)
pygame.display.set_caption("Hello, World!")

backgroud = pygame.image.load('pygame_back.png').convert()
backgroud1 = pygame.image.load('pygame_back1.png').convert()
temple = 0
backgroud_down = pygame.image.load('pygame_logo_bot.gif').convert()
backgroud_up = pygame.image.load('pygame_logo_top.gif').convert()

running = True

while running:
  for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            temple = backgroud
          backgroud = backgroud1
          backgroud1 = temple
     if event.type == pygame.QUIT:
           pygame.quit()
           exit()
  screen.blit(backgroud, (0, 0))
  screen.blit(backgroud_down, (0, 50))
    screen.blit(backgroud_up, (485, 0))
pygame.display.update()
作者: aresli    时间: 2013-9-5 11:34
为什么一模一样的代码,我的程序出来点击不能切换图片呢?
难道这就是pygame版本不同导致的?
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. from sys import exit  #向sys模块借一个exit函数用来退出程序
  4. pygame.init() #初始化pygame,为使用硬件做准备
  5. screen = pygame.display.set_mode((500, 700), 0, 32) #创建了一个窗口,窗口大小和背景图片大小一样
  6. pygame.display.set_caption('hello paruru')  #设置窗口标题
  7. background = pygame.image.load('/Users/ares/Sites/Dropbox/file/pygame/bg1.jpg').convert() #加载并转换图像


  8. while True:
  9. #游戏主循环
  10.    for event in pygame.event.get():
  11.         if event.type == pygame.QUIT: #接收到退出事件后退出程序
  12.          pygame.quit()
  13.            exit()
  14.       if event.type == pygame.MOUSEBUTTONDOWN: #接收到鼠标按下事件后更换背景
  15.             backgournd = pygame.image.load('/Users/ares/Sites/Dropbox/file/pygame/bg2.jpg').convert()
  16.     screen.blit(background, (0,0)) #将背景图画上去
  17. pygame.display.update() #刷新一下画面
复制代码

作者: crossin先生    时间: 2013-9-5 21:05
aresli 发表于 2013-9-5 11:34
为什么一模一样的代码,我的程序出来点击不能切换图片呢?
难道这就是pygame版本不同导致的? ...

在if event.type == pygame.MOUSEBUTTONDOWN:这个if里面增加一些输出,比如
print ‘button down’
看看控制台下有没有输出,以确定程序是不是运行到了这里。然后再分析原因,为什么会有这样的现象。


不过你这里的问题我已经看出来了。。。background拼错了
作者: aresli    时间: 2013-9-5 22:55
aresli 发表于 2013-9-5 11:34
为什么一模一样的代码,我的程序出来点击不能切换图片呢?
难道这就是pygame版本不同导致的? ...

拼写错误真可怕!!!!!
作者: aresli    时间: 2013-9-5 22:57
crossin先生 发表于 2013-9-5 21:05
在if event.type == pygame.MOUSEBUTTONDOWN:这个if里面增加一些输出,比如
print ‘button down’
看看 ...

面壁ing
作者: test777    时间: 2013-9-11 00:32
两张图片轮流切换
  1. # -*- coding: utf-8 -*-
  2. import pygame, sys
  3. pygame.init()
  4. screen = pygame.display.set_mode((679,347),0,32)
  5. pygame.display.set_caption('Hello, World!')
  6. bg1 = pygame.image.load('bg.jpg').convert()
  7. bg2 = pygame.image.load('bg2.jpg').convert()
  8. list = [bg1,bg2]
  9. index = 2
  10. background = list[index%2]

  11. while True:
  12.     for event in pygame.event.get():
  13.         if event.type == pygame.QUIT:
  14.             pygame.quit()
  15.             sys.exit()
  16.         if event.type == pygame.MOUSEBUTTONDOWN:
  17.             index += 1
  18.             background = list[index%2]
  19.     screen.blit(background,(0,0))
  20.     pygame.display.update()

复制代码

作者: TongShan    时间: 2013-10-13 14:53
请问为什么pygame.image.load().convert()后面的convet()是可以省略的呢?
作者: crossin先生    时间: 2013-10-13 16:32
TongShan 发表于 2013-10-13 14:53
请问为什么pygame.image.load().convert()后面的convet()是可以省略的呢?

convert是将读进来的图片做一些像素转换,比如颜色深度、遮罩等,如果不加任何参数,这个转换是可以省略的。但如果我们要用到一张带透明部分的图片,就必须用另一个类似的方法convert_alpha,这时候就不能省略了
作者: shallecker    时间: 2013-10-18 18:37
两张图根据图片尺寸自动设置尺寸大小显示
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. #导入pygame库
  4. from sys import exit
  5. #向sys模块借一个exit函数用来退出程序
  6. pygame.init()
  7. #初始化pygame,为使用硬件做准备

  8. pygame.display.set_caption("Hello, World!")
  9. #设置窗口标题
  10. background = pygame.image.load('bg.jpg')
  11. #加载并转换图像
  12. while True:
  13. #游戏主循环

  14.     for event in pygame.event.get():
  15.         if event.type == pygame.QUIT:
  16.             #接收到退出事件后退出程序
  17.             pygame.quit()
  18.             exit()
  19.         if event.type == pygame.MOUSEBUTTONDOWN:
  20.     #接收到鼠标按下事件后更换背景
  21.             background = pygame.image.load('bg2.jpg').convert()
  22.     width = background.get_width()
  23.     height = background.get_height()
  24.     screen = pygame.display.set_mode((width, height), 0, 32)
  25. #创建了一个窗口,窗口大小和背景图片大小一样
  26.     screen.blit(background, (0,0))
  27.     #将背景图画上去
  28.     pygame.display.update()
  29.     #刷新一下画面
复制代码

作者: 浮生湮灭了美好    时间: 2013-10-19 16:25
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. #导入pygame库
  4. from sys import exit
  5. #向sys模块借一个exit函数用来退出程序

  6. from pygame import *

  7. pygame.init()
  8. #初始化pygame,为使用硬件做准备
  9. screen = pygame.display.set_mode((400, 602), 0, 32)
  10. #创建了一个窗口,窗口大小和背景图片大小一样
  11. pygame.display.set_caption("Hello, World!")
  12. #设置窗口标题
  13. background1 = pygame.image.load('1.jpg').convert()
  14. background2 = pygame.image.load('2.jpg').convert()
  15. bg = background1
  16. #加载并转换图像
  17. while True:
  18. #游戏主循环
  19.     for event in pygame.event.get():
  20.         if event.type == QUIT:
  21.             #接收到退出事件后退出程序
  22.             pygame.quit()
  23.             exit()
  24.         if event.type == MOUSEBUTTONDOWN:
  25.             if bg == background2:
  26.                  bg = background1
  27.             else:
  28.                  bg = background2
  29.     screen.blit(bg, (0,0))
  30.     #将背景图画上去
  31.     pygame.display.update()
  32.     #刷新一下画面
复制代码

作者: jane    时间: 2013-11-21 20:18
  1. import pygame

  2. from sys import exit

  3. pygame.init()

  4. screen = pygame.display.set_mode((700, 170), 0, 32)

  5. pygame.display.set_caption("Hello, World!")

  6. bg1 = pygame.image.load('bg.jpg').convert()
  7. bg2 = pygame.image.load('bg2.jpg').convert()
  8. bg3 = pygame.image.load('bg3.jpg').convert()
  9. i=1
  10. bglist=[bg1,bg2,bg3]
  11. num=len(bglist)
  12. background=bglist[0]


  13. while True:

  14.     for event in pygame.event.get():
  15.         if event.type == pygame.QUIT:
  16.             pygame.quit()
  17.             exit()
  18.         if event.type == pygame.MOUSEBUTTONDOWN:
  19.             background=bglist[i]
  20.             i=i+1
  21.             if i>num-1 :
  22.                 i=0
  23.         screen.blit(background,(0,0))
  24.         pygame.display.update()
复制代码

作者: 今天手气不错啊    时间: 2014-3-8 09:52

作者: 从南到北    时间: 2015-10-15 20:12
  1. # coding = utf-8
  2. import pygame
  3. from sys import exit
  4. pygame.init()
  5. screen = pygame.display.set_mode((595,834),0,32)
  6. pygame.display.set_caption("Hello, Rain")
  7. back = ['datababy01.jpg','datababy02.jpg','datababy03.jpg','datababy04.jpg']

  8. background = pygame.image.load(back[0]).convert()

  9. i = 0
  10. while True:
  11.     for event in pygame.event.get():
  12.         if event.type == pygame.QUIT:
  13.             pygame.quit()
  14.             exit()
  15.         if event.type == pygame.MOUSEBUTTONDOWN:
  16.             i += 1
  17.             background = pygame.image.load(back[i % 4]).convert()
  18.     screen.blit(background,(0,0))
  19.     pygame.display.update()
复制代码

作者: 周末晒被子    时间: 2015-12-24 00:24
本帖最后由 周末晒被子 于 2015-12-24 00:34 编辑

本来不知道怎么解决“4张图片列表循环”这个问题的,感觉很简单,尝试过用 for...in... 放在 while 循环的下一层,原本在 while 循环内的代码块全部丢进 for...in... 里面,失败,后来知道真相的我哭笑不得,听老师的没错,不知道哪里出错时,多print一下。

后来看到第一页一哥们的代码,受启发在 if event.type == pygame.MOUSEBUTTONDOWN: 之后用 if 条件。

借鉴了把窗口尺寸自动匹配图片尺寸的哥们的想法。

剩下的就是自己想出来的,基本上跟楼上各位的代码有重合之处。还学了一个 len() 的用法。

# -*- coding: utf-8 -*-
import pygame
from sys import exit
pygame.init()
pygame.display.set_caption('Hello world')
bglist = ['F:\some\d1.jpg','F:\some\d2.jpg','F:\some\d3.jpg','F:\some\d4.jpg']

background = pygame.image.load(bglist[0])

i = len(bglist)

num = 1
while True:
   
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
               
            if event.type == pygame.MOUSEBUTTONDOWN:
                background = pygame.image.load(bglist[num]).convert()
                num += 1
                if num == i:
                    num = 0
                    
        width = background.get_width()
        height = background.get_height()
        screen = pygame.display.set_mode((width,height),0,32)
        
        screen.blit(background,(0,0))
        pygame.display.update()
        

作者: 周末晒被子    时间: 2015-12-24 00:26
就是不知道为什么我的图片路径一定要用绝对路径,不能像楼上各位一样简单得用"bg.jpg"...
作者: crossin先生    时间: 2015-12-24 11:42
周末晒被子 发表于 2015-12-24 00:26
就是不知道为什么我的图片路径一定要用绝对路径,不能像楼上各位一样简单得用"bg.jpg"... ...

你是不是通过编辑器直接运行的?这样有时候路径会比较奇怪。试试在命令行下运行
作者: 周末晒被子    时间: 2015-12-24 23:54
crossin先生 发表于 2015-12-24 11:42
你是不是通过编辑器直接运行的?这样有时候路径会比较奇怪。试试在命令行下运行 ...

是在编辑器运行的。试了下在白色背景的命令行(Python 2.75 Shell)运行,没反应,就跟什么都不输入,直接按回车一样。
但是在黑色背景的命令行是可以运行的,跟编辑器运行效果一样。
作者: crossin先生    时间: 2015-12-25 10:51
周末晒被子 发表于 2015-12-24 23:54
是在编辑器运行的。试了下在白色背景的命令行(Python 2.75 Shell)运行,没反应,就跟什么都不输入,直接 ...

在系统命令行下运行
python xxx.py
这时候相对路径的当前目录,就是你执行这个命令的所在目录
作者: 周末晒被子    时间: 2015-12-25 13:58
本帖最后由 周末晒被子 于 2015-12-26 01:10 编辑
crossin先生 发表于 2015-12-25 10:51
在系统命令行下运行
python xxx.py
这时候相对路径的当前目录,就是你执行这个命令的所在目录 ...

在系统命令行运行”python Firstpygame.py“,能看到一个黑色命令行窗口一闪而过。
先生这是为什么呢?
明明我把代码放上python命令行(黑色背景的)能运行,但由系统打开python命令行运行,就不可以了,一闪而退。
作者: crossin先生    时间: 2015-12-26 18:24
周末晒被子 发表于 2015-12-25 13:58
在系统命令行运行”python Firstpygame.py“,能看到一个黑色命令行窗口一闪而过。
先生这是为什么呢?
明 ...

是因为执行完,窗口就关闭了。非要用这种方式运行的话,在结尾加一个input,让程序停下来等待输入
作者: 周末晒被子    时间: 2015-12-27 06:20
crossin先生 发表于 2015-12-26 18:24
是因为执行完,窗口就关闭了。非要用这种方式运行的话,在结尾加一个input,让程序停下来等待输入 ...

谢谢先生
作者: hermit0308    时间: 2016-1-28 10:01
请问可不可以让不同尺寸的图片自适应固定的窗口大小?
作者: crossin先生    时间: 2016-1-28 13:18
hermit0308 发表于 2016-1-28 10:01
请问可不可以让不同尺寸的图片自适应固定的窗口大小?

获取窗口的大小,然后缩放图片
作者: crossin先生    时间: 2016-1-28 13:18
hermit0308 发表于 2016-1-28 10:01
请问可不可以让不同尺寸的图片自适应固定的窗口大小?

获取窗口的大小,然后缩放图片
作者: catherinemic    时间: 2016-1-30 11:59
在两张图之间切换并调整窗口大小
  1. # -*- coding:utf-8 -*-
  2. import pygame  #导入pygame库
  3. from pygame.locals import *
  4. from sys import exit  #向sys模块借一个exit函数用来退出程序
  5. pygame.init()  #初始化pygame,为使用硬件做准备
  6. pygame.display.set_caption('Hello, World!') #设置窗口标题
  7. screen=pygame.display.set_mode((960,640)) #创建了一个窗口,窗口大小和背景图片大小一样
  8. background1=pygame.image.load('.\data file\pypic2.jpg').convert() #加载并转换图像
  9. background2=pygame.image.load('.\data file\pypic.jpg').convert()
  10. background=background1
  11. while True: #游戏主循环
  12.     for event in pygame.event.get():
  13.         if event.type == pygame.QUIT: #接收到退出事件后退出程序
  14.             pygame.quit()
  15.             exit()
  16.         if event.type==pygame.MOUSEBUTTONDOWN: #接收到鼠标按下事件后更换背景
  17.             background=background2
  18.             background2=background1
  19.             background1=background
  20.     width=background.get_width()
  21.     height=background.get_height()
  22.     screen_size=(width,height)
  23.     screen=pygame.display.set_mode(screen_size,0,32)
  24.     screen.blit(background,(0,0)) #将背景图画上去
  25.     pygame.display.update() #刷新一下画面
复制代码

作者: dekun    时间: 2016-6-13 18:21
# -*- coding: utf-8 -*-
import pygame
#导入pygame库
from sys import exit
#向sys模块借一个exit函数用来退出程序
pygame.init()
#初始化pygame,为使用硬件做准备
screen = pygame.display.set_mode((456, 132), 0, 32)
#创建了一个窗口,窗口大小和背景图片大小一样
pygame.display.set_caption("Hello, World!")
#设置窗口标题
background = pygame.image.load('bg.jpg').convert()
#加载并转换图像
while True:
#游戏主循环
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            #接收到退出事件后退出程序
            pygame.quit()
            exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            #接收到鼠标按下事件后更换背景
            background = pygame.image.load('bg2.jpg').convert()
    screen.blit(background, (0,0))
    #将背景图画上去
    pygame.display.update()
    #刷新一下画面
作者: LC0919    时间: 2016-7-7 19:32
四张图片循环切换,窗口适应图片大小。
# -*- coding: utf-8 -*-
import pygame
from sys import exit
pygame.init()
pygame.display.set_caption("Hello,World!")
screen = pygame.display.set_mode((600,300),0,32)
p1 = pygame.image.load('0706.jpg').convert()
p2 = pygame.image.load('070602.png').convert()
p3 = pygame.image.load('0707.jpg').convert()
p4 = pygame.image.load('070702.png').convert()

list = [p1,p2,p3,p4]

background = p1
i = 0
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            if i > 2:
                i = 0
            else:
                i += 1
        background = list[i]
        width = background.get_width()
        height = background.get_height()
        screen_size = (width,height)
        screen = pygame.display.set_mode((screen_size),0,32)
    screen.blit(background,(0,0))
    pygame.display.update()
作者: lulu    时间: 2016-8-26 16:03
为什么我这样就切换不了图片呢:
if bg==pygame.image.load('D:\\Python27\\workspaces\\1.jpg').convert():
                bg=pygame.image.load('D:\\Python27\\workspaces\\0.jpg').convert()
                print 1
else:
                bg=pygame.image.load('D:\\Python27\\workspaces\\1.jpg').convert()
                print 3
这样就可以切换:
if bg==bg1:
                bg=bg2
                print 1
else:
                bg=bg1
                print 3
难道必须是赋给变量才行?求解答
作者: crossin先生    时间: 2016-8-26 16:13
lulu 发表于 2016-8-26 16:03
为什么我这样就切换不了图片呢:
if bg==pygame.image.load('D:\\Python27\\workspaces\\1.jpg').convert() ...

每次调用load会生成新对象,前一种写法本身也不对
作者: lulu    时间: 2016-8-29 09:27
crossin先生 发表于 2016-8-26 16:13
每次调用load会生成新对象,前一种写法本身也不对

谢谢!还是对方法不了解啊……
作者: Phoestia    时间: 2016-9-7 12:58
学了这一课之后,想在几张照片随机的基础上,加上从网站上扒下来图,储存,再随机切换。。。

然而,写了两天,发现能拔下URL,但还不会储存图片。 卡在下载图片的步骤
  1. #-*-coding:utf-8-*-

  2. import urllib2
  3. import re
  4. import os
  5. import time
  6. url='https://movie.douban.com/'
  7. response=urllib2.urlopen(url)
  8. html=response.read()#.decode('utf-8')
  9. #print html 从豆瓣抓取网页

  10. #提取图片链接
  11. pics=re.findall(r"http.*?jpg",html)
  12. #if pics:
  13. #    print pics
  14. #else:
  15. #    print 'no pics'

  16. #下载图片
  17. def download(pics,picNo):



  18. #用PYGAME点击播放图片
  19. '''import pygame
  20. from sys import exit
  21. import random

  22. pygame.init()
  23. screen=pygame.display.set_mode((300,424),0,32)
  24. pygame.display.set_caption("Hello,World!")
  25. bg1=pygame.image.load('1.jpg').convert()
  26. bg2=pygame.image.load('2.jpg').convert()
  27. bg3=pygame.image.load('3.jpg').convert()
  28. bg4=pygame.image.load('4.jpg').convert()
  29. bgs=[bg1, bg2, bg3, bg4]
  30. background=bg1
  31. while True:
  32.     for event in pygame.event.get():
  33.         if event.type==pygame.QUIT:
  34.             pygame.quit()
  35.             exit()
  36.         if event.type==pygame.MOUSEBUTTONDOWN:
  37.             background=random.choice(bgs)
  38.     width=background.get_width()
  39.     height=background.get_height()
  40.     screen_size=(width,height)
  41.     screen=pygame.display.set_mode(screen_size,0,32)
  42.     screen.blit(background,(0,0))
  43.     pygame.display.update()
  44. '''
复制代码

作者: crossin先生    时间: 2016-9-7 15:41
Phoestia 发表于 2016-9-7 12:58
学了这一课之后,想在几张照片随机的基础上,加上从网站上扒下来图,储存,再随机切换。。。

然而,写了两 ...

保存图片就是把图片内容以二进制形式保存到文件里。你搜下 “python 下载图片”之类的,应该会找到很多例子
作者: Tony    时间: 2016-10-21 11:46
crossin 先生你好:
请问:
在第一个:
background = pygame.image.load(r'C:\Users\Tony\Desktop\Demo\1.jpg').convert()
这里,我在其后面加上了:
screen.blit(background, (0,0))
pygame.display.update()
结果图片是显示出来了,但是很卡。
而对于这段代码:

  1. for event in pygame.event.get():
  2.         if event.type == pygame.QUIT:
  3.             #接收到退出事件后退出程序
  4.             pygame.quit()
  5.             exit()
  6.         if event.type == pygame.MOUSEBUTTONDOWN:
  7.     #接收到鼠标按下事件后更换背景
  8.             background = pygame.image.load(r'C:\Users\Tony\Desktop\Demo\2.jpg').convert()
  9.     screen.blit(background, (0,0))
  10.     #将背景图画上去
  11.     pygame.display.update()
复制代码
我理解的是,在没有事件的情况下(比如:打开什么都不做),会直接执行:

  1. screen.blit(background, (0,0))
  2. pygame.display.update()
复制代码
这两行
而有事件发生(比如:点击鼠标):
则会执行:
  1. if event.type == pygame.MOUSEBUTTONDOWN:
  2.     #接收到鼠标按下事件后更换背景
  3.             background = pygame.image.load(r'C:\Users\Tony\Desktop\Demo\2.jpg').convert()
复制代码
然后再次更改背景,刷新图片。
不知道我的理解正确不?
作者: crossin先生    时间: 2016-10-21 13:24
Tony 发表于 2016-10-21 11:46
crossin 先生你好:
请问:
在第一个:

我不知道是你贴上来时候弄错了,还是本来就这样。

screen.blit(background, (0,0))
pygame.display.update()
这两个代码不应该放在时间循环里,他们每帧执行,跟事件无关。你放在循环里,那有几个事件,它们就会执行几次

这可能是你很卡的原因吧
作者: qtjason    时间: 2017-8-9 22:42
请问,在linux下运行,发现把.convert()全删除,程序也可以正常运行,load之后的转换convert()是不必要的吗?还是linux可以识别载入的图片或者自动转换了?
作者: crossin先生    时间: 2017-8-10 11:54
qtjason 发表于 2017-8-9 22:42
请问,在linux下运行,发现把.convert()全删除,程序也可以正常运行,load之后的转换convert()是不必要的吗 ...

有可能是自动转换了,这个和图片格式也有关
作者: z850672062    时间: 2017-11-9 10:01
test777 发表于 2013-9-11 00:32
两张图片轮流切换

强!
作者: 少年与猫.    时间: 2018-5-16 15:59
jpjlqone 发表于 2013-8-22 13:45

请问一下 target 在代码里面的作用具体是什么
作者: crossin先生    时间: 2018-5-17 22:48
少年与猫. 发表于 2018-5-16 15:59
请问一下 target 在代码里面的作用具体是什么

用来做个标记,每次点击就切换一下
作者: 少年与猫.    时间: 2018-5-18 22:02
crossin先生 发表于 2018-5-17 22:48
用来做个标记,每次点击就切换一下

已经搞懂了  谢谢先生
作者: 宝丁    时间: 2018-6-3 19:24
#-*- coding:utf-8 -*-
import pygame
from sys import exit
pygame.init()
screen=pygame.display.set_mode((520,520),0,32)#创建一个窗口,大小和背景图片一样大
pygame.display.set_caption('hello,World!')#设置窗口标题
background1 = pygame.image.load('pic1.jpg').convert()#加载并转换图像
background2 = pygame.image.load('pic2.jpg').convert()
background = background1
n=0
while True:
#游戏主循环
    for event in pygame.event.get():
      
        if event.type == pygame.QUIT:
        #接收到退出事件后退出程序
            pygame.quit()
            exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            #接收到鼠标按下事件后更换背景
            n+=1
            if n%2==0:
                background = background1
                #print('a')
            if n%2==1:
                background = background2
                #print('b')
            
    screen.blit(background,(0,0))#将背景图画上去
    pygame.display.update()#刷新一下画面


完成,虽然有点笨!
作者: 东东哥    时间: 2018-11-10 16:22
jpjlqone 发表于 2013-8-22 13:45

你好,请问第四句是什意思
作者: 东东哥    时间: 2018-11-10 16:48
test777 发表于 2013-9-11 00:32
两张图片轮流切换

index=2是什么意思
作者: 东东哥    时间: 2018-11-10 17:07
((630, 300), 0, 32)老师这个(0,32)是什么意思
作者: crossin先生    时间: 2018-11-11 17:22
东东哥 发表于 2018-11-10 17:07
((630, 300), 0, 32)老师这个(0,32)是什么意思

set_mode 的参数,一共三个,前面第一个是一个坐标原则,0和32是后面两个参数。具体含义我忘了,一般不用改,似乎默认不给也可以,可以查文档,32好像是图片像素是32位
作者: PMCoding    时间: 2019-12-16 14:06
周末晒被子 发表于 2015-12-24 00:24
本来不知道怎么解决“4张图片列表循环”这个问题的,感觉很简单,尝试过用 for...in... 放在 while 循环的 ...

hahaha , 我觉得%的用法比len还好用呢




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5