请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 46445|回复: 49

【Pygame 第3课】 游戏中的事件

[复制链接]

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-8-21 19:15:17 |显示全部楼层
有人问,为什么突然讲游戏了?有人问,为什么不继续讲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分钟,轻松学编程



#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

25

积分

新手上路

Rank: 1

发表于 2013-8-22 10:38:41 |显示全部楼层

回帖奖励 +1

我觉得可以同时讲游戏跟基础,毕竟没有基本游戏也做不了
回复

使用道具 举报

3

主题

0

好友

243

积分

中级会员

Rank: 3Rank: 3

发表于 2013-8-22 13:45:04 |显示全部楼层

回帖奖励 +1

  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()
复制代码
回复

使用道具 举报

3

主题

0

好友

243

积分

中级会员

Rank: 3Rank: 3

发表于 2013-8-22 13:53:28 |显示全部楼层
多张图片随机切换:
  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()
复制代码
回复

使用道具 举报

0

主题

0

好友

84

积分

注册会员

Rank: 2

发表于 2013-8-22 23:08:53 |显示全部楼层

回帖奖励 +1

点击鼠标在两个背景之间来回变换。。

# !/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()
回复

使用道具 举报

0

主题

1

好友

132

积分

注册会员

Rank: 2

发表于 2013-9-5 11:34:20 |显示全部楼层
为什么一模一样的代码,我的程序出来点击不能切换图片呢?
难道这就是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() #刷新一下画面
复制代码
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-9-5 21:05:47 |显示全部楼层
aresli 发表于 2013-9-5 11:34
为什么一模一样的代码,我的程序出来点击不能切换图片呢?
难道这就是pygame版本不同导致的? ...

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


不过你这里的问题我已经看出来了。。。background拼错了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

132

积分

注册会员

Rank: 2

发表于 2013-9-5 22:55:37 |显示全部楼层
aresli 发表于 2013-9-5 11:34
为什么一模一样的代码,我的程序出来点击不能切换图片呢?
难道这就是pygame版本不同导致的? ...

拼写错误真可怕!!!!!
回复

使用道具 举报

0

主题

1

好友

132

积分

注册会员

Rank: 2

发表于 2013-9-5 22:57:52 |显示全部楼层
crossin先生 发表于 2013-9-5 21:05
在if event.type == pygame.MOUSEBUTTONDOWN:这个if里面增加一些输出,比如
print ‘button down’
看看 ...

面壁ing
回复

使用道具 举报

0

主题

0

好友

63

积分

注册会员

Rank: 2

发表于 2013-9-11 00:32:42 |显示全部楼层
两张图片轮流切换
  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()

复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-18 15:16 , Processed in 0.031473 second(s), 27 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部