小言_互联网的博客

python 写游戏好简单啊,我用键盘可以随意控制角色了【python 游戏实战 04】

302人阅读  评论(0)

前言

本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将会逐步更新。

若有想学习的内容可以在评论区留言,根据大家的要求持续更新。点赞过十万就算化成灰我也更新下一篇。(肯定不到,也会更的。)

有问题也可以在评论区留言,也可以私聊我加我好友共同交流一起进步~

我的其它教程

教程点击进去将会有目录

《看聊天记录都学不会C语言?太菜了吧(1)我在大佬群里问基础问题没人理?——学习建议

《大学生C语言作业、习题100例白话详解》

目录

《看聊天记录都学不会Python到游戏实战?太菜了吧》python 写游戏好简单啊,我用键盘可以随意控制角色了【python 游戏实战 04】—— 键盘控制角色移动

《看聊天记录都学不会Python到游戏实战?太菜了吧》游戏角色开始动起来了,真帅!【python 游戏实战 03】—— 角色移动

《看聊天记录都学不会Python到游戏实战?太菜了吧》这是我第一次使用代码创建出一个窗口【python 游戏实战 02】—— 创建游戏场景

《看聊天记录都学不会Python到游戏实战?太菜了吧》这是我第一次使用代码创建出一个窗口【python 游戏实战 01】—— 创建窗口

《看聊天记录都学不会Python到游戏实战?太菜了吧》(12)python 的列表我从没想过会那么好用—— 列表

《看聊天记录都学不会Python到游戏实战?太菜了吧》(11)python里面while到底有多少知识点—— break continue

《看聊天记录都学不会Python到游戏实战?太菜了吧》(10)无底洞的循环—— 循环初窥

《看聊天记录都学不会Python到游戏实战?太菜了吧》(9)集万家之长不死 python—— 导包

《看聊天记录都学不会Python到游戏实战?太菜了吧》(8)我们开始做一个数字小游戏吧—— 数字游戏开始做 导包

《看聊天记录都学不会Python到游戏实战?太菜了吧》(7)我用函数写了个特洛伊木马—— 自定义函数

《看聊天记录都学不会Python到游戏实战?太菜了吧》(6)不会这个知识点代码越写越难—— and or 逻辑运算

《看聊天记录都学不会Python到游戏实战?太菜了吧》(5)用前朝的剑斩今朝的官——if…else

《看聊天记录都学不会Python到游戏实战?太菜了吧》(4)小白不知道这个知识点将会错漏百出——if 与 层级

《看聊天记录都学不会Python到游戏实战?太菜了吧》(3)都说123是字符不是数字——输入与类型

《看聊天记录都学不会Python到游戏实战?太菜了吧》(2)在python中加号竟然如此善变——变量与运算

《看聊天记录都学不会Python到游戏实战?太菜了吧》(1)装载Python神器!亮剑!——helloworld


作者简介

作者名:1_bit

简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。

博客地址:https://i1bit.blog.csdn.net


🐰小C:小媛,上一节我们绘制了一个场景,移动了角色,那么这一节我们就开始控制主角并且让他进行移动吧?

👸小媛:我怎么感觉你突然变得好心了,以前每一节就讲一点内容,然后就开始跟我拌嘴水字数,这一节怎么直奔主题?😂

🐰小C:有嘛?是你跟我拌嘴的好嘛?你不信去看聊天记录。

👸小媛:真的吗?那还不是你在水字数。

🐰小C:哈哈哈,这一节不水了,开始玩真的吧。

👸小媛:赶紧的,你又水了 224 个md字数了。😂

🐰小C:行,我们先看一下我们上一节的代码。

import pygame

pygame.init()
screen=pygame.display.set_mode((600,800))
pygame.display.set_caption("这是一个飞机游戏")
icon=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
bg=pygame.image.load(r'E:\2dsrc\src\img\bg.png')
hero=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
pygame.display.set_icon(icon)
heroX=250 #x坐标
#游戏主循环
while True:
    #事件遍历
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit()
    heroX=heroX-3
    screen.blit(bg,(0,0))
    screen.blit(hero,(heroX,680))
    pygame.display.update()

🐰小C:上一节我们只是使用了代码对主角进行移动,那么现在我们改一下,我们按上,主角就往上走、按下主角就往下走,其它按键依次类推如何?

👸小媛:行,你说啥就是啥,终于不废话了。 😰

🐰小C:不不不,还是需要点情节来让整个氛围轻松的。

👸小媛:赶紧吧,别废话,真是禁不起夸。

🐰小C:哈哈哈,其实我们刚刚已经获取到了这个游戏中发生的所有事件 pygame.event.get(),我们只是从获取的事件中判断是否做了退出事件,那么在这里我们只需要再判断是否按下了特定的键,那么就可以对特定的键做出反应了。

👸小媛:然后根据上一节所学,我们只需要根据不同按键控制这个主角下一次绘制所在的位置就可以了吧?

🐰小C:是的,我们首先判断按下什么键吧。

import pygame

pygame.init()
screen=pygame.display.set_mode((600,800))
pygame.display.set_caption("这是一个飞机游戏")
icon=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
hero=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
bg=pygame.image.load(r'E:\2dsrc\src\img\bg.png')
pygame.display.set_icon(icon)
#游戏主循环
while True:
    #事件遍历
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit()
        if event.type==pygame.KEYDOWN:
	        if event.key == pygame.K_RIGHT:
	            print('→')
	        elif event.key == pygame.K_LEFT:
	            print('←')
	        elif event.key == pygame.K_UP:
	            print('↑')
	        elif event.key == pygame.K_DOWN:
	            print('↓')
	screen.blit(bg,(0,0))
	screen.blit(hero,(heroX,680))
	pygame.display.update()

👸小媛:if event.key == pygame.K_RIGHT 就是判断是否按下的键吗?

🐰小C:是的,event.key 表示具体按下了什么键,如果 event.key 等于 pygame.K_RIGHT 那么就表示按下了右键头,那么就运行 print('→') 输出打印出 → 箭头。

👸小媛:明白了。然后 pygame.K_LEFT 是按下了左键、pygame.K_UP 表示按下上键、pygame.K_DOWN 表示按下了下键? 😶

🐰小C:是的,但是我们需要注意,必须是按下键后这个时间才会有 event.key 中的 key 这个类型,如果你没按下是判断不出来按下了什么键,所以前面 if event.type==pygame.KEYDOWN: 这句代码至关重要,表示了你按下键后才进行判断。你可以运行程序感受一下。

👸小媛:哈哈哈,好好玩,我按下什么就显示什么。 😎

🐰小C:都正确响应了吧?

👸小媛:是的。

🐰小C:那么我们接下来就需要控制角色进行移动了。

👸小媛:我觉得有点会了,但是还需要你写出来看一下,我总感觉我会出错。

🐰小C:我们先控制角色左右移动吧?

👸小媛:可以呀,没问题。 😎

🐰小C:我们知道,在这个屏幕中左右是控制 X 坐标,X越大那么越靠右,X越小那么就越靠左,我们按下左键的时候 X 轴的值就应该变小,如果按下右键那么 X 轴的值就应该越大。我们只需要在按下左右键的时候给一个变量赋予一个正值或者负值,正值表示往右负值表示往左,并且每次 hero 主句的 X 轴的值加上这个值就可以了。

import pygame

pygame.init()
screen=pygame.display.set_mode((600,800))
pygame.display.set_caption("这是一个飞机游戏")
icon=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
hero=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
bg=pygame.image.load(r'E:\2dsrc\src\img\bg.png')
pygame.display.set_icon(icon)
heroX=250
heroY=680
stepX=0
#游戏主循环
while True:
    #事件遍历
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit()
        if event.type==pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                stepX=5
            elif event.key == pygame.K_LEFT:
                stepX=-5
            elif event.key == pygame.K_UP:
                print('↑')
            elif event.key == pygame.K_DOWN:
                print('↓')
    heroX+=stepX
    screen.blit(bg,(0,0))
    screen.blit(hero,(heroX,heroY))
    pygame.display.update()

👸小媛:你在按下右键的时候给予了 stepX 变量正值,按下左键给予了 stepX 键负值,然后每次循环 heroX 就加上这个 stepX 值,这样按下左就可以一直往左?按下右就可以一直往右?

🐰小C:是的。

👸小媛:所以你把 hero 的 Y 值使用了变量 heroY,这样也是为了方便操作吧?

🐰小C:是的,观察挺仔细,注意,我在循环前是创建了这几个变量的。

heroX=250
heroY=680
stepX=0

👸小媛:明白。

🐰小C:那我给你一个完整的代码吧。

import pygame

pygame.init()
screen=pygame.display.set_mode((600,800))
pygame.display.set_caption("这是一个飞机游戏")
icon=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
hero=pygame.image.load(r'E:\2dsrc\src\img\hero1.png')
bg=pygame.image.load(r'E:\2dsrc\src\img\bg.png')
pygame.display.set_icon(icon)
heroX=250
heroY=680
stepX=0
stepY=0
#游戏主循环
while True:
    #事件遍历
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit()
        if event.type==pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                stepX=5
            elif event.key == pygame.K_LEFT:
                stepX=-5
            elif event.key == pygame.K_UP:
                stepY=-5
            elif event.key == pygame.K_DOWN:
                stepY=5
    heroX+=stepX
    heroY+=stepY
    screen.blit(bg,(0,0))
    screen.blit(hero,(heroX,heroY))
    pygame.display.update()

👸小媛:上面的 stepY 就是新创建的变量用来判断是按上还是按下?

🐰小C:是的,跟 stepX 一样。

👸小媛:哈哈哈,可以移动了。 😎


转载:https://blog.csdn.net/A757291228/article/details/116467649
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场