python pygame 中如何让角色移动到地图中间 在按下 方向键 向右后 地图向左移动

python pygame 中如何让角色移动到地图中间 在按下 方向键 向右后 地图向左移动,第1张

pygameSurfaceget_rect()方法返回值是一个Rect对象,该对象有一个move()方法可以用于移动矩形。move(x, y)函数有两个参数,第一个参数是 X 轴移动的距离,第二个参数是 Y 轴移动的距离。窗口的左上角是(0, 0),如果是move(100, 50)就是左移100下移50。

在Python310中使用Pygame模块添加背景,可以按照以下步骤进行:

首先,导入pygame模块,并初始化Pygame:

pythonCopy codeimport pygame

pygameinit()

加载背景。可以使用pygameimageload()函数加载,然后使用pygametransformscale()函数缩放到窗口大小。例如:

pythonCopy codebackground_image = pygameimageload("backgroundjpg")

background_image = pygametransformscale(background_image, (800, 600))

在上述代码中,我们加载名为backgroundjpg的,并将其缩放到窗口大小,即800x600像素。

创建窗口并显示背景。可以使用pygamedisplayset_mode()函数创建窗口,然后使用blit()函数将背景绘制到窗口上。例如:

pythonCopy codewindow = pygamedisplayset_mode((800, 600))

windowblit(background_image, (0, 0))

pygamedisplayflip()

在上述代码中,我们创建了一个大小为800x600像素的窗口,并将背景绘制到窗口上。

进入游戏循环。在Pygame中,游戏循环通常使用while语句实现。在循环中,我们可以监听用户输入事件,并根据需要更新窗口内容。例如:

pythonCopy codewhile True:    for event in pygameeventget():        if eventtype == pygameQUIT:

pygamequit()

sysexit()    # 在这里添加需要更新的代码

pygamedisplayflip()

在上述代码中,我们使用pygameeventget()函数获取用户输入事件,如果检测到用户关闭窗口的事件,则调用pygamequit()函数退出Pygame。在循环中,我们可以根据需要更新窗口内容,在最后调用pygamedisplayflip()函数更新窗口内容。

完整的代码如下所示:

pythonCopy codeimport pygameimport sys

pygameinit()

background_image = pygameimageload("backgroundjpg")

background_image = pygametransformscale(background_image, (800, 600))

window = pygamedisplayset_mode((800, 600))

windowblit(background_image, (0, 0))

pygamedisplayflip()while True:    for event in pygameeventget():        if eventtype == pygameQUIT:

           pygamequit()

           sysexit()    # 在这里添加需要更新的代码

   pygamedisplayflip()

在上述代码中,我们加载了名为backgroundjpg的作为背景,并将其缩放到窗口大小。然后,我们创建了一个大小为800x600像素的窗口,并将背景绘制到窗口上。最后,我们进入游戏循环,监听用户输入事件并更新窗口内容。你可以根据实际需要修改这个代码,例如添加游戏元素、事件处理等。

要设置好它们的位置,也就是俗称的布局。

========================================

import pygame, sys, random # 所需要加载的模块

skier_images = ["skier_downpng","skier_right1png", #加载所需要的人物图像

"skier_right2png","skier_left2png",

"skier_left1png"]

class SkierClass(pygamespriteSprite):

def __init__(self):

pygamespriteSprite__init__(self)

selfimage = pygameimageload("skier_downpng") # 获取人物图像

selfrect = selfimageget_rect() # 获取人物形象

selfrectcenter = [320,100] # 人物的起始位置

selfangle = 0

def turn(self, direction): # 方向

selfangle = selfangle + direction # 角度+ 方向

if selfangle < -2: selfangle = -2 # 向左右只允许转2次

if selfangle > 2: selfangle = 2

center = selfrectcenter

selfimage = pygameimageload(skier_images[selfangle])

selfrect = selfimageget_rect()

selfrectcenter = center

speed = [selfangle, 10 - abs(selfangle) 2] #左右移动后的速度

return speed

def move(self, speed): # 移动 左右移动

selfrectcenterx = selfrectcenterx + speed[0]

if selfrectcenterx < 20: selfrectcenterx = 20 #向左移动至 起始位置20 或向右移动至终止位置620

if selfrectcenterx > 620: selfrectcenterx = 620

class ObstacleClass (pygamespriteSprite): #创建树和小旗

def __init__(self, image_file, location, type):

pygamespriteSprite__init__(self)

selfimage_file = image_file

selfimage = pygameimageload(image_file)

selflocation = location

selfrect = selfimageget_rect()

selfrectcenter = location

selftype = type

selfpassed = False

def scroll(self, terrainPos):

selfrectcentery = selflocation[1] - terrainPos # 让场景向上移动

def create_map(start, end): # 创建一个“画面”地形:640×640使用的64×64像素的“块”,这样的对象不是靠得太近

obstacles = pygamespriteGroup()

locations = []

gates = pygamespriteGroup()

for i in range(10): # 每屏10障碍

row = randomrandint(start, end)

col = randomrandint(0, 9)

location = [col 64+20, row 64+20]# 中心的x,y的障碍

if not (location in locations): # 避免在同一个地方2的障碍

locationsappend(location)

type = randomchoice(["tree", "flag"])

if type == "tree": img = "skier_treepng" # 定义调用树的图

elif type == "flag": img = "skier_flagpng" # 定义调用旗的图

obstacle = ObstacleClass(img, location, type)

obstaclesadd(obstacle)

return obstacles

def animate(): # 重绘屏幕,包括所有的元素

screenfill([255, 255, 255]) #屏幕填充色

pygamedisplayupdate(obstaclesdraw(screen)) # 显示更新障碍

screenblit(skierimage, skierrect) #滑雪者图像

screenblit(score_text, [10, 10]) # 比例

pygamedisplayflip() #显示屏转动

def updateObstacleGroup(map0, map1):

obstacles = pygamespriteGroup()

for ob in map0: obstaclesadd(ob) #添加障碍

for ob in map1: obstaclesadd(ob) #添加障碍

return obstacles

pygameinit() # 初始化示例

screen = pygamedisplayset_mode([640,640]) # 初始化显示状态

clock = pygametimeClock() # 初始化时间

skier = SkierClass() # 初始化类型

speed = [0, 6] #初始化速度

map_position = 0

points = 0

map0 = create_map(20, 29) # 创建地图1

map1 = create_map(10, 19) # 创建地图2

activeMap = 0 # 激活地图

obstacles = updateObstacleGroup(map0, map1) #地图分数

font = pygamefontFont(None, 50) # 所有障碍做碰撞检测

while True: # 开始地图循环

clocktick(30) # 每秒更新地图的次数

for event in pygameeventget():

if eventtype == pygameQUIT: sysexit()

if eventtype == pygameKEYDOWN: # 检查按键

if eventkey == pygameK_LEFT: # 左箭头向左转

speed = skierturn(-1)

elif eventkey == pygameK_RIGHT: # 右箭头向右转

speed = skierturn(1)

skiermove(speed) # 移动滑雪者

map_position += speed[1] # 滚动场景

# 管理地图之间进行切换,并在底部创建新的地形

if map_position >=640 and activeMap == 0:

activeMap = 1

map0 = create_map(20, 29) # 创建地图

obstacles = updateObstacleGroup(map0, map1) # 更新地图障碍

if map_position >=1280 and activeMap == 1:

activeMap = 0

for ob in map0:

oblocation[1] = oblocation[1] - 1280 # 环绕顶部

map_position = map_position - 1280 # 地图位置

map1 = create_map(10, 19) # 创建地图

obstacles = updateObstacleGroup(map0, map1)

for obstacle in obstacles:

obstaclescroll(map_position)

# 检查是否碰到数或小旗

hit = pygamespritespritecollide(skier, obstacles, False)

if hit:

if hit[0]type == "tree" and not hit[0]passed: #撞到树

points = points - 100 # 撞树后扣掉100分

skierimage = pygameimageload("skier_crashpng") # 创建跌倒图

animate()

pygametimedelay(100)

skierimage = pygameimageload("skier_downpng") # 恢复滑雪图

skierangle = 0

speed = [0, 6]

hit[0]passed = True

elif hit[0]type == "flag" and not hit[0]passed: # 撞到旗子标志

points += 100 # 撞旗后加100分

obstaclesremove(hit[0]) # 删除旗子标志

score_text = fontrender("Score: " +str(points), 1, (0, 0, 0))

animate()

=====================================================

屏幕坐标系大概是这个样子的:

其中,screen 的那个矩形就是窗口了,screen 的左上角坐标是 (0 ,0)

selfrecttop = -selfrectheight

这句的意思是,将 rect 向上移动出屏幕边缘

结合上面的图,大概就是那个位置

selfrectcenterx = randrange(screen_size[0])

screen_size 是指屏幕的大小, screen_size[0] 就是屏幕的宽度啦

centerx 是指矩形中心的 X 坐标(就是宽度一半的位置)

randrange 是返回一个 0 到 参数 之间的随机数

综合起来,就是将矩形的横坐标设置成屏幕宽度范围内的随机位置

selfrecttop += 1

这句的意思是将矩形向下移动一个像素

因为在 update 函数中,所以综合意思就是,矩形以每帧1像素的速度向下移动

selfrecttop > screen_size[1]

这句的意思是,当矩形的上边缘在屏幕的下边缘之下的时候。

希望能帮到你啦~

在Pygame中,移动鼠标通常会执行pygameMOUSEMOTION事件,对应的下级代码通常会写在事件循环中的for循环中,例如:

for event in pygameeventget():

if eventtype == pygameMOUSEMOTION:

# 在这里编写鼠标移动时需要执行的代码

在这段代码中,pygameeventget()用于获取当前所有的事件,并将其放入一个列表中。然后,通过循环遍历该列表,判断每个事件的类型是否为pygameMOUSEMOTION,如果是,则执行# 在这里编写鼠标移动时需要执行的代码中的代码,即对鼠标移动做出相应的处理。

项目详细介绍

在这个系列中,将制作一个雷霆战机游戏。

现在,当玩家用完生命时,程序就会突然结束。这不是很友好。

所以将制作一个“Game Over”屏幕,并允许玩家再次玩。

“Game Over”屏幕在2种情况下显示:

游戏结束的原因是游戏循环由running变量控制,设置running为False玩家死亡时。现在想要跟踪游戏状态(显示游戏结束或玩游戏),将创建一个名为game_over的标志,并将其添加到游戏循环的顶部:

稍后会定义show_go_screen()。

目前还需要考虑别的事情。

当游戏结束,通过屏幕进入游戏时,如果玩家再次选择游戏,需要重置所有内容 - 得分,流星,玩家的生命等等。现在在游戏开始前设置这些东西,但现在要将它们移动到show_go_screen()之后,show_go_screen()函数运行结束后,它们会发生:

还设置game_over到False,因为正在开始一个新的游戏。然后,可以改变玩家用完生命时发生的事情--- game_over = True :

游戏结束屏幕

现在只需要定义什么show_go_screen。因为在这个例子中,只做一个“屏幕”,只是要使用游戏的标题,并提供一些很好的说明如何玩:

show_go_screen()函数里面运行一个死循环,直到用户按下任意键后,退出死循环,结束函数。

获取地址

1231 创建Pygame窗口以及响应用户输入

《Python编程: 从入门到实践》第12章武装飞船,开始学习管理包含多个文件的项目。我们将重构很多代码,以提高代码的效率,并管理文件的内容,以确保项目组织有序。本节介绍创建Pygame窗口以及响应用户输入。

123 开始游戏项目

现在来开始开发游戏《外星人入侵》。首先创建一个空的Pygame窗口,供后面用来绘制游戏元素,如飞船和外星人。我们还将让这个游戏响应用户输入、设置背景色以及加载飞船图像。

1231 创建Pygame窗口以及响应用户输入

首先,我们创建一个空的Pygame窗口。使用Pygame编写的游戏的基本结构如下:

alien_invasionpy

import sys

import pygame

def run_game():

# 初始化游戏并创建一个屏幕对象

 pygameinit()

 screen = pygamedisplayset_mode((1200, 800))

pygamedisplayset_caption("Alien Invasion")

# 开始游戏的主循环

 while True:

# 监视键盘和鼠标事件

 for event in pygameeventget():

 if eventtype == pygameQUIT:

sysexit()

# 让最近绘制的屏幕可见

 pygamedisplayflip()

run_game()

首先,我们导入了模块sys和pygame。模块pygame包含开发游戏所需的功能。玩家退出时,我们将使用模块sys来退出游戏。

游戏《外星人入侵》的开头是函数run_game()。u处的代码行pygameinit()初始化背景设置,让Pygame能够正确地工作。在v处,我们调用pygamedisplayset_mode()来创建一个名为screen的显示窗口,这个游戏的所有图形元素都将在其中绘制。实参(1200, 800)是一个元组,指定了游戏窗口的尺寸。通过将这些尺寸值传递给pygamedisplayset_mode(),我们创建了一个宽1200像素、高800像素的游戏窗口(你可以根据自己的显示器尺寸调整这些值)。

对象screen是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。在这个游戏中,每个元素(如外星人或飞船)都是一个surface。displayset_mode()返回的surface表示整个游戏窗口。我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。

这个游戏由一个while循环(见w)控制,其中包含一个事件循环以及管理屏幕更新的代码。事件是用户玩游戏时执行的 *** 作,如按键或移动鼠标。为让程序响应事件,我们编写一个事件循环,以侦听事件,并根据发生的事件执行相应的任务。x处的for循环就是一个事件循环。

为访问Pygame检测到的事件,我们使用方法pygameeventget()。所有键盘和鼠标事件都将促使for循环运行。在这个循环中,我们将编写一系列的if语句来检测并响应特定的事件。例如,玩家单击游戏窗口的关闭按钮时,将检测到pygameQUIT事件,而我们调用sysexit()来退出游戏(见y)。

z处调用了pygamedisplayflip(),命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。在我们移动游戏元素时,pygamedisplayflip()将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。

在这个基本的游戏结构中,最后一行调用run_game(),这将初始化游戏并开始主循环。

如果此时运行这些代码,你将看到一个空的Pygame窗口。

在我的 这系列的第一篇文章 中, 我已经讲解如何使用 Python 创建一个简单的、基于文本的骰子 游戏 。这次,我将展示如何使用 Python 模块 Pygame 来创建一个图形化 游戏 。它将需要几篇文章才能来得到一个确实做成一些东西的 游戏 ,但是到这系列的结尾,你将更好地理解如何查找和学习新的 Python 模块和如何从其基础上构建一个应用程序。

在开始前,你必须安装 Pygame 。

有几种方法来安装 Python 模块,但是最通用的两个是:

两个方法都工作的很好,并且每一个都有它自己的一套优势。如果你是在 Linux 或 BSD 上开发,可以利用你的发行版的软件存储库来自动和及时地更新。

然而,使用 Python 的内置软件包管理器可以给予你控制更新模块时间的能力。而且,它不是特定于 *** 作系统的,这意味着,即使当你不是在你常用的开发机器上时,你也可以使用它。pip 的其它的优势是允许本地安装模块,如果你没有正在使用的计算机的管理权限,这是有用的。

如果 Python 和 Python3 都安装在你的系统上,你想使用的命令很可能是 pip3,它用来区分 Python 2x 的 pip 的命令。如果你不确定,先尝试 pip3。

pip 命令有些像大多数 Linux 软件包管理器一样工作。你可以使用 search 搜索 Python 模块,然后使用 install 安装它们。如果你没有你正在使用的计算机的管理权限来安装软件,你可以使用 --user 选项来仅仅安装模块到你的家目录。

Pygame 是一个 Python 模块,这意味着它仅仅是一套可以使用在你的 Python 程序中的库。换句话说,它不是一个像 IDLE 或 Ninja-IDE 一样可以让你启动的程序。

一个电子 游戏 需要一个背景设定:故事发生的地点。在 Python 中,有两种不同的方法来创建你的故事背景:

你的背景仅是一张或一种颜色。你的电子 游戏 人物不能与在背景中的东西相互作用,因此,不要在后面放置一些太重要的东西。它仅仅是设置装饰。

要开始一个新的 Pygame 工程,先在计算机上创建一个文件夹。 游戏 的全部文件被放在这个目录中。在你的工程文件夹内部保持所需要的所有的文件来运行 游戏 是极其重要的。

一个 Python 脚本以文件类型、你的姓名,和你想使用的许可证开始。使用一个开放源码许可证,以便你的朋友可以改善你的 游戏 并与你一起分享他们的更改:

然后,你告诉 Python 你想使用的模块。一些模块是常见的 Python 库,当然,你想包括一个你刚刚安装的 Pygame 模块。

由于你将用这个脚本文件做很多工作,在文件中分成段落是有帮助的,以便你知道在哪里放代码。你可以使用块注释来做这些,这些注释仅在看你的源文件代码时是可见的。在你的代码中创建三个块。

接下来,为你的 游戏 设置窗口大小。注意,不是每一个人都有大计算机屏幕,所以,最好使用一个适合大多数人的计算机的屏幕大小。

这里有一个方法来切换全屏模式,很多现代电子 游戏 都会这样做,但是,由于你刚刚开始,简单起见仅设置一个大小即可。

在脚本中使用 Pygame 引擎前,你需要一些基本的设置。你必须设置帧频,启动它的内部时钟,然后开始 (init)Pygame 。

现在你可以设置你的背景。

在你继续前,打开一个图形应用程序,为你的 游戏 世界创建一个背景。在你的工程目录中的 images 文件夹内部保存它为 stagepng 。

这里有一些你可以使用的自由图形应用程序。

你的图像不必很复杂,你可以以后回去更改它。一旦有了它,在你文件的 Setup 部分添加这些代码:

如果你仅仅用一种颜色来填充你的 游戏 的背景,你需要做的就是:

你也必须定义颜色以使用。在你的 Setup 部分,使用红、绿、蓝 (RGB) 的值来创建一些颜色的定义。

至此,你理论上可以启动你的 游戏 了。问题是,它可能仅持续了一毫秒。

为证明这一点,保存你的文件为 your-name_gamepy(用你真实的名称替换 your-name)。然后启动你的 游戏 。

如果你正在使用 IDLE,通过选择来自 “Run” 菜单的 “Run Module” 来运行你的 游戏 。

如果你正在使用 Ninja,在左侧按钮条中单击 “Run file” 按钮。

你也可以直接从一个 Unix 终端或一个 Windows 命令提示符中运行一个 Python 脚本。

如果你正在使用 Windows,使用这命令:

启动它,不过不要期望很多,因为你的 游戏 现在仅仅持续几毫秒。你可以在下一部分中修复它。

除非另有说明,一个 Python 脚本运行一次并仅一次。近来计算机的运行速度是非常快的,所以你的 Python 脚本运行时间会少于 1 秒钟。

为强制你的 游戏 来处于足够长的打开和活跃状态来让人看到它(更不要说玩它),使用一个 while 循环。为使你的 游戏 保存打开,你可以设置一个变量为一些值,然后告诉一个 while 循环只要变量保持未更改则一直保存循环。

这经常被称为一个“主循环”,你可以使用术语 main 作为你的变量。在你的 Setup 部分的任意位置添加代码:

在主循环期间,使用 Pygame 关键字来检查键盘上的按键是否已经被按下或释放。添加这些代码到你的主循环部分:

也是在你的循环中,刷新你世界的背景。

如果你使用一个作为背景:

如果你使用一种颜色作为背景:

最后,告诉 Pygame 来重新刷新屏幕上的所有内容,并推进 游戏 的内部时钟。

保存你的文件,再次运行它来查看你曾经创建的最无趣的 游戏 。

退出 游戏 ,在你的键盘上按 q 键。

在这系列的 下一篇文章 中,我将向你演示,如何加强你当前空空如也的 游戏 世界,所以,继续学习并创建一些将要使用的图形!

via: >

以上就是关于python pygame 中如何让角色移动到地图中间 在按下 方向键 向右后 地图向左移动全部的内容,包括:python pygame 中如何让角色移动到地图中间 在按下 方向键 向右后 地图向左移动、Python3.10中Pygame模块怎么添加背景图片、python-skier游戏,树和小旗只出现在窗口左边等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9316403.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存