GVKun编程网logo

pygame 中的弹跳功能(pygame跳跃)

21

如果您想了解pygame中的弹跳功能和pygame跳跃的知识,那么本篇文章将是您的不二之选。我们将深入剖析pygame中的弹跳功能的各个方面,并为您解答pygame跳跃的疑在这篇文章中,我们将为您介绍

如果您想了解pygame 中的弹跳功能pygame跳跃的知识,那么本篇文章将是您的不二之选。我们将深入剖析pygame 中的弹跳功能的各个方面,并为您解答pygame跳跃的疑在这篇文章中,我们将为您介绍pygame 中的弹跳功能的相关知识,同时也会详细的解释pygame跳跃的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

pygame 中的弹跳功能(pygame跳跃)

pygame 中的弹跳功能(pygame跳跃)

如何解决pygame 中的弹跳功能?

def bounce(self):
        self.veLocity[0] = -self.veLocity[0]
        self.veLocity[1] = randint(-10,10)

嘿,我想重新编码这个反弹功能,但我不知道,我该怎么做?

解决方法

根据物理学,最好和最自然的结果是不改变self.velocity[1]。假设 self.velocity[0] 在 X 轴上,self.velocity[1] 在 Y 轴上,那么如果您在 X 轴(左或右)上弹跳到任何墙壁,{{1}不应该改变,只是 X 轴上的速度应该反转。如果您想对 Y 轴上的碰撞做同样的事情,您应该做同样的事情,但使用 self.velocity[1] 而不是 self.velocity[1]

保持相同角度的球反弹示意图:

Diagram of ball bounce

另一方面,如果你想要让它在随机方向反弹(这看起来不自然),你当前的功能很棒(尽管如果你使用的是pygame,你可以转换{{ 1}} 到 self.velocity[0] 对象中以使其更干净)。

Clock.schedule_interval()在pygame中有效还是仅在pygame中为零?

Clock.schedule_interval()在pygame中有效还是仅在pygame中为零?

Current Working Directory在pygame中不存在。请参阅pygame.time模块。 const time = ['00:00','00:30','01:00','01:30']; const nums = [1.99,5.11,2.99,3.45 ]; const newArray = []; time.forEach((element,index) => { newArray.push({ time: element,cost: nums[index] }) }) console.log(newArray) 是pygame零中类schedule_interval的一种方法。参见Pygame Zero - Built-in Objects。

在pygame中,您可以创建一个计时器事件。请参阅问题Python 3.8 pygame timer?或Countdown timer in Pygame的答案。

Make Game with Python & Pygame (3)

Make Game with Python & Pygame (3)

接着来介绍Pygame一些基础的东西。

Drawing Images with pygame.image.load() and blit()

很多游戏都不只是用简单的画图函数就可以完成的,还需要各种各样的图片(也被称作精灵)pygame可以加载到surface对象上的图片格式有PNG, JPG, GIF和BMP。关于格式的不同地方可以上网搜索。

接着对上篇最后的一段代码里面的东西做些介绍。

pygame.image.load()函数返回一个surface对象用于显示图片。这个surface对象和显示窗口对象是分离的,所以我们必须把图片显示对象复制到显示窗口对象通过blit()方法。

方法使用如下:

DISPLAYSURF.blit(catImg, (catx, caty))

第一个参数是要加载的图片对象,第二个参数是有两个整数的元组分别表示图片将要显示的左上角X和Y的坐标值。

字体

游戏都需要显示文字,pygame为字体和创建文本提供了一些简单的函数。下面就是一个使用pygame字体的程序。

import pygame, sys
from pygame.locals import *

pygame.init()
DISPLAYSURF = pygame.display.set_mode((400,300))
pygame.display.set_caption("Hello World")

WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE = (0, 0 ,128)

fontObj = pygame.font.Font(''freesansbold.ttf'', 32)
textSurfaceObj = fontObj.render(''Hello World!'', True, GREEN, BLUE)
textRectObj = textSurfaceObj.get_rect()
textRectObj.center = (200, 150)

while True:
    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(textSurfaceObj, textRectObj)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

执行后的效果如图:


将字体显示在屏幕上有六个步骤:

  1. 创建一个pygame.font.Font对象
  2. 创建一个surface对象用于存放字体显示,这需要通过调用字体对象的render()方法
  3. 创建一个矩形对象通过调用surface对象的get_rect()方法。这个矩形对象将拥有字体的宽度与高度。但是top和left属性值为0
  4. 设置矩形对象的位置通过改变它的一个属性值。在这里我们设置了矩形对象的中心在200,150
  5. 将存放字体的显示对象复制到显示窗口对象(来自pygame.display.set_mode()方法返回的对象)
  6. 调用pygame.display.update()让显示窗口对象显示在屏幕上
pygame.font.Font()的构造函数的参数是一个字体文件和一个表示字体大小的整数。我们传递了"freesansbold.ttf"(这个字体来自pygame)和整数32.
render()方法的参数是一个要显示的字符串,一个BOOL类型的值决定是否需要抗锯齿,文字的颜色,文字的背景颜色。如果想要个透明的背景颜色,那么只需要在调用该方法是不传递最后一个背景颜色参数。

抗锯齿,这个是概念的东西。(略)

播放声音
播放声音甚至比显示图片更简单。首先,需要创建一个pygame.mixer.Sound对象通过调用pygame.mixer.Sound()构造函数。它需要一个字符串参数,也就是声音文件名。pygame可以加载wav, mp3,或者oog的声音格式文件。
播放声音需要调用声音对象的play()方法。如果想立即停止声音则调用stop()方法。stop()方法没有参数。下面一段加载声音的简单代码:
soundObj = pygame.mixer.Sound(''beeps.wav'')
soundObj.play()
import time
time.sleep(1)
soundObj.stop()

声音对象可以造成很好的声音效果当游戏者具体做了某件事时,比如受到伤害,拾起一个硬币等。游戏最好也能有背景音乐无论游戏进行到何时。Pygame只能加载一个音乐文件用作背景音乐在一个时刻。为了加载一个背景音乐文件,调用pygame.mixer.music.load()函数传递一个关于音乐文件名的字符串。音乐文件格式可以是WAV,MPS,MIDI.

开始播放背景音乐,需要调用pygame.mixer.music.play(-1,0.0)函数,-1这个参数使背景音乐永远播放直到音乐文件末尾。如果设置为0或者比0大的整数,那么音乐就只循环传递的整数代表的那么多次,而不是永远循环。0.0表示从音乐文件开始处播放音乐。传递多少值就从多少值开始播放音乐。为了停止背景音乐,需要调用pygame.mixer.music.stop()函数,此函数没有参数。
下面的代码是关于音乐文件处理的一些方法:
pygame.mixer.music.load(''backgroundmusic.mp3'')
pygame.mixer.music.play(-1,0.0)
#....some more of your code goes here..
pygame.mixer.music.stop()
上面差不多就是pygame的一些基础的东西了,然后作者就以每章一个游戏来继续pygame的介绍,而且注释解释说明写的都很详细,实在是本好书啊。

Make Games with Python & Pygame (1)

Make Games with Python & Pygame (1)


看见这本书很有意思,利用Python和Pygame模块进行游戏开发,边学习边翻译边写心得。

 

http://download.csdn.net/detail/abclixu123/4582805 这是真本书的下载地址。


第二章介绍Pygame的一些基础知识。开始也是以经典的Hello World开始。所用的开发环境就是安装Python后自带的IDLE。

HelloWorld程序如下:

import pygame, sys
from pygame.locals import *

pygame.init()
DISPLAYSURF = pygame.display.set_mode((400,300))
pygame.display.set_caption(''Hello World'')
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

 

这个程序运行后就是一个简单的黑色窗口。

对这个程序有几点说明

  • 需要包含Pygame模块,即import  pygame
  • 在进行任何具体的Pygame的操作之前,都要进行Pygame的初始化,即pygame.init()
  • DISPLAYSURF = pygame.display.set_mode((400,300)) 这句创建pygame显示的主窗口,400宽,300高,如上图显示所示。
    而且要注意的传递是个含有两个整数的元组变量,不是分开的两个整数。
  • pygame.display.set_caption(''Hello World'') 这句就是设置窗体的名字
  • 在一个循环中,我们处理事件消息,pygame.event.get()得到我们与之交互的事件
  • 最后更新窗口(根据事件处理)

其实这个循环就很能说明一个游戏的处理机制了,在这个循环里要做三件事情

  • 处理事件
  • 更新游戏状态
  • 将更新的游戏状态显示到屏幕上

文章接着简单介绍了像素坐标系,这个比较简单。(略)

接着提醒了下函数,方法,构造函数和模块中的函数的区别,牵涉到语言了(略)

Surface对象和窗口

Surface对象其实就代表了矩形的2D图像,Surface对象的像素可以通过调用Pygame的画图函数改变。窗口边框,标题栏,按钮这些都不是Surface对象的一部分。Surface对象是通过pygame.display.set_mode()函数返回的,被称作显示窗口。任何在这个对象里面画的东西都会被显示在窗口中当调用pygame.display.update()函数。

帧:通常游戏跑1秒30帧就足够了。

Colors

任何颜色都可以由颜色有红,绿,蓝三原色组合构成。在Pygame中,用含有三个整数的元组来代表颜色。如(R,G,B),比如这个元组的第一个值代表红色。0表示一点也没有红色,255表示这个颜色里面红色有最大值。通常称这个元组为RGB值。

可以这样定义一个颜色:

BLACK = (0,0,0)

下表是常见颜色值:

透明颜色

 在每个颜色的最后可以跟一个值,被称做a值。它代表这个颜色的不透明程度。一般当你啊把一个像素点画进surface对象中,新的颜色会完全的替代先前的颜色。但是如果颜色有a值的话,你就是把这个颜色添加到先前的那个颜色值。比如绿色(0,255,0)现在如果我们添加了第四个整数a值,我们可以让其绿色看起来一半透明(0,255,0,128)。a值为255时表示完全不透明。也就是(0,255,0)与(0,255,0,255)看起来是一样的。a值为0说明颜色完全透明,此时是没有意义的,因为这个颜色完全透明而不可见。

为了作画时能用到透明颜色你必须创建一个surface对象通过convert_alpha()方法。下面的例子代码就是创建了一个surface对象使其透明色可以被显示

anotherSurface = DISPLAYSURFconvert_alpha()

anotherSurface这个对象可以被复制到DISPLAYSURF。重要的一点是不能使用透明颜色到不是通过调用convert_apha方法返回的Surface对象上,包括来自pygame.display.set_mode()返回的显示窗口对象。

pygame.Color对象

表示颜色有两种方法,一个使用三个整数或四个整数的元组,另外一个就是使用pygame.Color对象。可以通过调用pygame.Color()构造函数和传递3个或4个整数值来创建一个Color对象,然后用一个变量储存这个对象。就像下面这样。

myColor = pygame.Color(255,0,255,128)

在pygame里面任何画图函数都会让传递一个颜色参数值,可以通过元组或者Color对象来传递。所以我们有两种方法来创建一个颜色。

 

Rect对象

Pygame有两种方法表示矩形,就像表示颜色一样。第一种方法是使用4个整数值的元组。

这四个整数分别是:

左上角X坐标值

左上角Y坐标值

矩形的宽度(以像素点为单位)

矩形的高度(以像素点为单位)

第二种方法就是使用pygame.Rect对象。下面就是创建一个Rect对象的例子

myRect = pygame.Rect(10,20,200,300)

很方便的是,当我们创建好Rect对象后,关于这个矩形的其它一些参数就自动被计算好了。比如我们现在一个矩形X左上角坐标为10,而且有200像素宽度,那么我们可以通过Rect对象的right属性来获取X右上角坐标值,如myRect.right

下图是pygame.Rect对象提供的所有属性,这里假如Rect对象由myRect变量储存。

Make Games with Python & Pygame (2)

Make Games with Python & Pygame (2)

接着上次的继续。

 

简单的画图函数

Pygame给我们提供了几个简单的画图函数,比如画矩形,圆,椭圆,线,独立的像素点。

下面这个程序就实现了一些简单画图的操作

import pygame, sys
from pygame.locals import *

pygame.init()

DISPLAYSURF = pygame.display.set_mode((500,400),0,32)

BLACK = (0, 0 , 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

DISPLAYSURF.fill(WHITE)
pygame.draw.polygon(DISPLAYSURF, GREEN, ((146,0),(291,106),(236,277),(56,277),(0,106)))
pygame.draw.line(DISPLAYSURF, BLUE, (60, 60), (120,60), 4)
pygame.draw.line(DISPLAYSURF, BLUE, (20, 60), (60,20))
pygame.draw.line(DISPLAYSURF, BLUE, (60, 120), (120,120), 4)
pygame.draw.circle(DISPLAYSURF,BLUE, (300,50), 20, 0)
pygame.draw.ellipse(DISPLAYSURF,RED,(300,250,40,80),1)
pygame.draw.rect(DISPLAYSURF,RED,(200,150,100,50))

pixObj = pygame.PixelArray(DISPLAYSURF)
pixObj[480][380] = BLACK
pixObj[482][382] = BLACK
pixObj[484][384] = BLACK
pixObj[486][386] = BLACK
pixObj[488][388] = BLACK

del pixObj

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

执行后的效果如图


这里面有多一些新的Pygame的东西

fill(color)是Surface对象的一种方法,将surface对象的窗口全部填充一种颜色,就是背景色。

pygame.draw.polygon(surface, color, pointlist, width)画个多边形,其中surface和color参数告诉画在哪个对象里和使用的颜色,pointlist参数是由多个点构成的元组或列表,然后就会从第一个点开始,依次连接后面的点从而构成多边形,width参数是可选的,如果没有,则多边形会被color参数的颜色填充,如果有,而不会填充,多边形轮廓宽度就由width参数决定。传递0给width参数跟没有width参数是一样的。

需要注意的是,所有pygame.draw画图函数都有一个选择项参数width在最后,它们和pygame.draw,polygon函数中的width参数工作方式相同。

pygame.draw.line(surface, color, start_point, end_point, width) 画线函数

pygame.draw.lines(surface, color, closed, pointlist, width) 画多个相连的线,从起点到终点,与pygame.draw.polygon类似,唯一不同的是,如果closed参数为False,终点不会与起点相连接,传递True的话,终点会与起点想连接。

pygame.draw.circle(surface, color, center_point, radius, width) 画圆

pygame.draw.ellipse(surface, color, bounding_rectange, width) 画椭圆

pygame.draw.rect(surface, color, rectangle_tuple, width) 画矩形


pygame,PixelArray对象

pygame没有单独的画点函数。而方法就是创建pygame.PixelArray对象然后设置独立的像素点。创建一个关于Surface的PixelArray对象会‘锁住’Surface对象。一旦Surface对象被锁住,画图函数仍然可以使用,但是类似PNG或JPG的图片就不能作用在Surface对象上了,如果你想查看一个Surface对象是否锁住了,可以调用Surface对象get_locked()方法,如果锁住了会返回True,反之False。

设置这些独立像素点的方法是用两个索引值访问,比如pixObj[480][380] = BLACK ,这样就会将X坐标值的480和Y坐标的380这两个点设为黑色。

为了告诉pygame你完成了画完独立像素点,你需要通过一个del语句删除PixArray对象。删除PixArray对象会‘解锁’Surface对象,那样你就可以继续在上面加载图片了。如果忘了删除,则下次你想在Surface对象上加载图片的话就会报错。

pygame.display.update()函数

当你完成所有画图函数后,你必须调用pygame.display.update()函数让起显示在显示器上。

需要记住的一点是pygame.display.update()函数只会让显示对象(即通过调用pygame.display.set_mode()返回的对象)显示在屏幕上。如果你想让图片显示在屏幕上,你必须“blit”它们(复制它们的意思)到显示对象上通过blit()方法。

Animation

让图像动起来其实很简单,就是将图像从一个地方移动到另一个地方,就是清除掉图像原来所在地方的图像,然后在另一个地方加载这个图像,这样看上去图像就像动起来了一样。在计算机看来,其实就是一群像素的移动。下图就是一个例子


下面是一段示例代码

import pygame, sys
from pygame.locals import *

pygame.init()

FPS = 30 # frames per second setting
fpsClock = pygame.time.Clock()

# set up the window
DISPLAYSURF = pygame.display.set_mode((400, 300), 0, 32)
pygame.display.set_caption(''Animation'')

WHITE = (255, 255, 255)
catImg = pygame.image.load(''cat.png'')
catx = 10
caty = 10
direction = ''right''

while True: # the main game loop
    DISPLAYSURF.fill(WHITE)

    if direction == ''right'':
        catx += 5
        if catx == 280:
            direction = ''down''
    elif direction == ''down'':
        caty += 5
        if caty == 220:
            direction = ''left''
    elif direction == ''left'':
        catx -= 5
        if catx == 10:
            direction = ''up''
    elif direction == ''up'':
        caty -= 5
        if caty == 10:
            direction = ''right''

    DISPLAYSURF.blit(catImg, (catx, caty))

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    pygame.display.update()
    fpsClock.tick(FPS)

其中cat.png的下载地址PDF上面已经给出了。下载后必须与源文件放在一个文件夹里面。执行效果就是一只猫儿在一个窗口里面移动。先右,再下,再左,再上,如此循环。

上面这段代码里面又出现了一些新的东西。

帧率和pygame.time.Clock对象

帧率与刷新率指的是程序一秒钟能显示图片的数目,用FPS和帧每秒来表示。(在其它电脑显示器上,FPS有个大众名字叫做赫兹,许多显示器都有60赫兹的帧速率,或者叫做每秒60帧)低的帧率出现在一些图像游戏里就会导致游戏看起来是跳跃和抖动的,如果程序有太多的代码而经常刷新屏幕的话,就会导致FPS下降。但是在这本书里面的游戏因为足够简单所以即使在一些老的电脑上也不会出现问题。

pygame.time.Clock对象能够帮助我们确认程序能跑到的一个最大的确定的FPS值。Clock对象将在游戏主循环中插入小小的暂停以确保我们的游戏程序不会跑的太快。如果我们没有这些暂停的话,我们的游戏就会跑得跟电脑一样快。对玩游戏的人来说它确实太快了。在游戏循环中调用Clock对象的tick()方法能保证我们的游戏跑到一个确定的速度不管电脑跑得有多么快。创建Clock对象如下语句

fpsClock = pygame.time.Clock()

tick方法应该在游戏循环的最末尾调用,也就是在pygame.display.update之后,调用语句如下

fpsClock.tick(FPS)

今天的关于pygame 中的弹跳功能pygame跳跃的分享已经结束,谢谢您的关注,如果想了解更多关于Clock.schedule_interval()在pygame中有效还是仅在pygame中为零?、Make Game with Python & Pygame (3)、Make Games with Python & Pygame (1)、Make Games with Python & Pygame (2)的相关知识,请在本站进行查询。

本文标签: