屏幕坐标系大概是这个样子的:
其中,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]这句的意思是,当矩形的上边缘在屏幕的下边缘之下的时候。
希望能帮到你啦~
要设置好它们的位置,也就是俗称的布局。
========================================
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()
=====================================================
event英文翻译是事件 get 获取 type是样式,类型的意思,所以他这个都是有规律的,但是有顺序事件在前,后面跟属性
同时也有父子(层级)关系
eventget() 获取到的事件
eventtype() 事件类型
eventkey() 按键事件
一般都是写在while里面,因为这是个不断循环的过程,不然,只执行一便达不到实际要求,这是Pygame里面设定好的
这是贪吃蛇游戏的一段代码(一部分):
txt = fontrender('GAME OVER', True, (255, 0, 0))screenblit(txt, (size[0]/6, size[1]2/5-20)) # (0, 0) (size[0]/6, size[1]2/5)100号字中心位置
direction = 'right' # 初始方向,向右
changeDirection = direction # 定义一个改变方向的变量,按键
running = True
while Trunning:
for event in pygameeventget(): # 从队列中获取事件
if eventtype == QUIT: # 判断事件类型是否为退出事件
# pygamequit()
sysexit()
elif eventtype == KEYDOWN: # 如果按键被按下(事件)
if eventkey == K_RIGHT or eventkey == K_d: # 如果是右键头或者是d,蛇向右移动
changeDirection = 'right'
if eventkey == K_LEFT or eventkey == K_a: # 如果是左键头或者是a,蛇向左移动
changeDirection = 'left'
if eventkey == K_UP or eventkey == K_w:
changeDirection = 'up'
if eventkey == K_DOWN or eventkey == K_s:
changeDirection = 'down'
#这下面一行可以忽略,
if eventkey == K_ESCAPE: # 对应键盘上的Esc键,表示退出
pygameeventpost(pygameeventEvent(QUIT))
# 绘制文本,刷新显示
screenblit(txt, (20, 10))
screenfill(blackColor) #放在for语句一列,属于while的(子)层级,循环不断的刷新
填充是指将一个区域用固定的颜色或图案填满。在Pydroid 3中,您可以使用Pygame模块来进行填充。以下是一个简单的示例,可以将一个矩形填充为绿色:
```
import pygame
# 初始化Pygame
pygameinit()
# 定义颜色
GREEN = (0, 255, 0)
# 创建屏幕窗口
screen = pygamedisplayset_mode((800, 600))
# 创建一个矩形对象
rect = pygameRect(100, 100, 200, 100)
# 填充矩形为绿色
pygamedrawrect(screen, GREEN, rect)
# 刷新屏幕
pygamedisplayupdate()
# 等待退出
while True:
for event in pygameeventget():
if eventtype == pygameQUIT:
pygamequit()
exit()
```
在这个示例中,我们首先初始化Pygame,定义绿色的颜色,创建屏幕窗口,并创建一个矩形对象。然后,我们使用`pygamedrawrect()`函数将矩形填充为绿色,将其显示在屏幕上并刷新屏幕。最后,我们使用一个while循环来等待窗口的退出事件。
您可以根据您的需要修改矩形的大小,颜色和位置,并将其替换为其他形状(如圆形或多边形)。
updates=spritesdraw(screen) 这是只画了屏幕,就是白色的部分,虽然加载了,但是并没有blit到screen上,试下screenblit(weight_image,(0,0)),就会被添加到屏幕上了
在我的 这系列的第一篇文章 中, 我已经讲解如何使用 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: >
效果图:
效果图:
Surface: Surface对象
color: 线条颜色
rect:椭圆的外切矩形
width: 线粗(width=0 是实心椭圆)
备注:
当矩形是一个正方形的时候,画出来的椭圆其实是一个圆 _
效果图:
说明一下:
这里的椭圆是用矩形框起来的是矩形的内切椭圆因此,在实际使用的时候,要根据椭圆的中心位置以及椭圆的宽度与高度来计算具体的参数值
读者可以自行将其转化公式写一下,体会一下
Surface: Surface对象
color: 线条颜色
rect:弧所在的圆(椭圆)的外切矩形
width: 线粗(width=0时看不见)
start_angle:起始角度
end_angle:终止角度
备注:角度的问题
效果图:
画出如下图形:
set_mode((宽度,高度))
创建系统字体
italic:倾斜
创建自定义字体
antialias:-->是否平滑
image_size = imageget_size()
transform:形变包括缩放、平移、旋转
scale(缩放对象,新的大小) --->返回一个缩放后的新对象
rotate(旋转角度,旋转角度) --->角度是0-360对应的度数
rotozoom (旋转对象,旋转角度,缩放比例)
画矩形
rect(位置,颜色,(x,y,with,height))
画圆
circle(位置,颜色,圆心位置,半径,width=0)
画椭圆
ellipse(Surface,color,Rect,width = 0)
lines(画线的位置,颜色,closed,点的列表,width=1)
arc(Surface ,colors,start_pos,end_pos,width)
以上就是关于谁来告诉我python pygame的rect问题全部的内容,包括:谁来告诉我python pygame的rect问题、python-skier游戏,树和小旗只出现在窗口左边、用python的pygame,但每次程序一运行,pygame window窗口能出现,但是下图这种状态。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)