近来想用pygame做做游戏,在 xishui 大神的目光博客中学了学这东西,就上一段自己写的飞机大战的代码,主要是对键盘控制飞机的移动做了相关的优化

# -*- coding: utf-8 -*-

import pygame
from pygame.locals import *
import sys
import time pygame.init()
screen_width = 640
screen_height = 480
# 设置游戏窗口的大小
screen = pygame.display.set_mode((screen_width,screen_height), 0, 32)
pygame.display.set_caption('飞机大战')
image = 'feiji.png'
mv_image = pygame.image.load(image) # 获取飞机的长度
mv_image_width = mv_image.get_width() # 获取飞机的宽度
mv_image_height = mv_image.get_height() # 飞机的起始位置,应该在下面的正中间
x, y = screen_width/2-mv_image_width/2, screen_height-mv_image_height # 标记1
# 飞机的移动偏移量,每个方向设置一个
move_a, move_d, move_w, move_s = 0, 0, 0, 0 while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_a or event.key == K_LEFT:
move_a = 1
elif event.key == K_d or event.key == K_RIGHT:
move_d = 1
elif event.key == K_UP or event.key == K_w:
move_w = 1
elif event.key == K_DOWN or event.key == K_s:
move_s = 1
elif event.type == KEYUP:
# 某一个方向的键盘被松开,这个方向的偏移量赋为0
if event.key == K_a or event.key == K_LEFT:
move_a = 0
elif event.key == K_d or event.key == K_RIGHT:
move_d = 0
elif event.key == K_UP or event.key == K_w:
move_w = 0
elif event.key == K_DOWN or event.key == K_s:
move_s = 0 # 按下键盘时,飞机对应的移动偏移量会变成1,飞机的位置进行相应的加减操作,刷新显示来控制飞机的移动
# 如果一直按住键盘不动,飞机对应的移动偏移量就会一直为1,飞机的位置就会随着while的不断循环而改变 # 飞机移动后的位置
x = x + move_d - move_a
y = y + move_s - move_w
  # 标记2
# 控制飞机的范围,不能超出屏幕,还要考虑到子弹应该能够发射到任意一个地方
# 左右边界飞机应该可以进入一半
if x > screen_width-mv_image_width/2:
x = screen_width-mv_image_width/2
elif x < 0-mv_image_width/2:
x = 0-mv_image_width/2
# 下边界的话能够看到飞机头部就行
if y > screen_height-mv_image_height/5:
y = screen_height-mv_image_height/5
# 上边界不允许飞机进入
elif y < 0:
y = 0 # 填充背景颜色以RGB形式
screen.fill((255, 255, 255))
# 在新的位置上画图
screen.blit(mv_image, (x, y))
pygame.display.update()
# 减少CPU负担,测试后感觉这个数值最恰当
time.sleep(0.001)

在这里,飞机的偏移量之所以设置四个而不是两个,是因为如果设置的是两个,即控制x和y轴,那么飞机控制的方向只能是x轴或y轴,

就比如说,当按住a键的时候,飞机往左移动,此时不松开a键而继续按住d键,飞机就会停止往左移动转而向右移动,这里明显是不对的,我们目标应该是同时按住a键和d键时飞机停止移动,

紧接着,松开d键,此时飞机却不动了,但我们的a键此时还按着呢,他不是应该向左边移动吗?

所以用四个偏移量控制飞机的移动,各个方向互不影响,才能让飞机顺利的移动。

下面是飞机用两个偏移量时的代码


# 标记1
move_x, move_y = 0, 0
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
if event.type == KEYDOWN:
if event.key == K_a or event.key == K_LEFT:
move_x = -1
elif event.key == K_d or event.key == K_RIGHT:
move_x = 1
elif event.key == K_UP or event.key == K_w:
move_y = -1
elif event.key == K_DOWN or event.key == K_s:
move_y = 1
elif event.type == KEYUP:
# 如果用户放开了键盘,图就不要动了
move_x = 0
move_y = 0
# 计算出新的坐标
x += move_x
y += move_y
# 标记2

需要的图片feiji.png,纯手工绘,不好看莫怪

如果还想做一个更酷的效果(其实也不怎么酷啦),比如游戏开始时飞机不是直接出现在屏幕上,而是缓缓的从下方移动到开始位置。

代码如下:

# 使游戏开始时飞机缓缓到达战场
y1 = screen_height
while True:
if y1 <= y:
break
screen.fill((255, 255, 255))
screen.blit(mv_image, (x, y1))
pygame.display.update()
y1 -= 1
# 每0.01秒前进一步
time.sleep(0.01)

这段代码插入到#标记1的前面

pygame事件之——控制物体(飞机)的移动的更多相关文章

  1. iOS_2_button控制物体形变

    终于效果图: BeyondViewController.h // // BeyondViewController.h // 02_button控制物体形变 // // Created by beyon ...

  2. [Silverlight 2.0 控制物体绕圆弧运行(C#初探篇)]

    我自己写的第一个 Silverlight 2.0 程序    [Silverlight 2.0 控制物体绕圆弧运行(C#初探篇)]            程序运行时:小地球将绕着圆形轨迹做圆周运动. ...

  3. Android_(游戏)打飞机03:控制玩家飞机

    (游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹, ...

  4. js键盘事件全面控制详解

      js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件 ...

  5. Maya 脚本控制物体自转

    在Maya中,我们可以用脚本来控制物体的自转方向,速度等等,步骤如下: 选择需要操作的物体object,打开通道盒Channel Box,点击编辑Edit,打开表达式Expressions面板 选择需 ...

  6. 【python游戏编程之旅】第三篇---pygame事件与设备轮询

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame中的IO.数据http://www.cnblogs.com/msxh/ ...

  7. Unity3D 几个基本动画(控制物体移动、旋转、缩放)

    Transform基本移动函数: 1.指定方向移动: //移动速度 float TranslateSpeed = 10f; //Vector3.forward 表示"向前" tra ...

  8. js键盘事件全面控制

    js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...

  9. js键盘事件全面控制详解【转】

    js键盘事件全面控制 主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型 ...

随机推荐

  1. linux 记录用户操作日志

    将以下加入到/etc/profile 最后 history USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]/ ...

  2. vue项目架构

    一.工程说明: 1.代码git仓库地址:git@gitlab.*****.git. 2.目录结构: 1>.index.html 为build打包发布网页入口: 2>.lieda文件夹代码项 ...

  3. 修改WordPress后台登录地址,提高安全性

    大家都知道,WordPress默认的后台登陆地址是http://[你的域名]/wp-admin,今天就来讲讲怎么修改WordPress后台登录地址,首先要知道为什么要修改WordPress后台登录地址 ...

  4. 基于python语言的签名算法

    在wiki上看完接口文档根据传入的参数来查看返回的测试结果,测试结果提示缺少参数,找开发小伙伴沟通,原来发现缺少公共参数.找开发拿到公共参数的接口文档,发现里面传入的参数包含时间戳和签名. 时间戳:姑 ...

  5. Mycat 分片规则详解--单月小时分片

    实现方式:单月内按照小时拆分,最小粒度是小时,一天最多可以有24个分片,最少1个分片,下个月从头开始循环 优点:使数据按照小时来进行分时存储,颗粒度比日期(天)分片要小,适用于数据采集类存储分片 缺点 ...

  6. 【数据库】mysql深入理解乐观锁与悲观锁

    转载:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时 ...

  7. 理解python的元类

    看了一篇文档,借鉴一下!写下自己对python元类的理解,欢迎各位大神给出意见. 我的理解就是 type用来创建元类,元类用来创建类,类用来创建实例 这样一想,是不是可以认为元类创建类的过程等同于类创 ...

  8. 大数据 --> 安装Hadoop-单机模式(1)

    安装Hadoop-单机模式(1) 一.在Ubuntu下创建hadoop组和hadoop用户 1)创建hadoop用户组 sudo addgroup hadoop //添加用户组 2)创建hadoop用 ...

  9. linux --> 获取进程执行时间

    获取进程执行时间 一.时间概念 在linux下进行编程时,可能会涉及度量进程的执行时间.linux下进程的时间值分三种: 时钟时间(real time):指进程从开始执行到结束,实际执行的时间. 用户 ...

  10. [css 实践篇] 解决悬浮的<header> <footer>遮挡内容的处理技巧

    我写的实践篇 都是自己在实践项目所遇到的 "拦路虎" 还是很有借鉴的意义的.(实践才是检验真理的唯一标准呀),废话不多说,进去正题 position: fixed 绝对固定底部后会 ...