好吧,我刚开始使用pygame一周前,但我想我理解基础知识。我的游戏非常简单,左右移动气球以避开传入的螺丝。 我成功地让气球左右移动,但我对课程非常不熟悉,而且我不知道在屏幕上快速生成多个螺丝的任何其他方法。任何帮助将不胜感激。
继承我的代码:
import pygame
from pygame.locals import *
import sys
import time
pygame.init()
screen = pygame.display.set_mode((600,600))
pygame.display.set_caption('Baloon Pop')
baloon_size = (70,70)
white = (255,255,255)
cyan = (0,255,255)
red = (255,0,0)
screen.fill(cyan)
baloon = pygame.image.load('/users/Gaming/Desktop/rsz_baloon.png')
screw = pygame.image.load('/users/Gaming/Desktop/rsz_screw_png3029.png')
FPS = 30
fps_time = pygame.time.Clock()
baloonX = 280
baloonY = 500
import random
screwX = random.randint(0,600)
screwY = 20
LEFT = "left"
RIGHT = "right"
movement = "down"
while True:
screwY = screwY+10
screen.fill(cyan)
screen.blit(screw, (screwX,screwY))
screen.blit(baloon, (baloonX,baloonY))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_RIGHT:
baloonX = baloonX+30
if baloonX >= 580:
baloonX = baloonX -30
elif event.key == K_LEFT:
baloonX = baloonX -30
if baloonX <=-30:
baloonX = baloonX+30
pygame.display.update()
fps_time.tick(FPS)
答案 0 :(得分:1)
首先,我建议使用一个类来控制你的播放器。 这使得绘制和检测碰撞更容易。 一个简单的方法是:
class Player:
def __init__(self, x, speed):
self.x = x
self.speed = speed
self.moveright = 0
self.moveleft = 0
def update(self, time_passed):
if self.moveright:
self.x += self.speed * time_passed
if self.moveleft:
self.x -= self.speed * time_passed
然后,一个类似的类来控制你的敌人。
class Enemy:
def __init__(self, x, speed):
self.x = x
self.y = 0
self.speed = speed
def update(self, time_passed):
self.y += self.speed*time_passed
<强>这里, time_passed是您的Clock()对象的刻度值。 screen是你的pygame.display表面。
既然你的敌人被客观化了,你就可以创建一个列表来存储敌人类的实例。
正如我所建议的那样,使用这种机制可以让你的游戏顺利进行。 建议不要在每个KEYDOWN事件上使用增量。
创建一个列表来存储敌人实例并创建玩家实例:
Enemylist = []
Player1 = Player(<SomeXValue>,0.1)
继续创造随机敌人。 如果你需要每n个循环创建一个螺丝(也就是一个Enemy()), 您可以创建一个在该时间间隔内激活的标志。 您可以使用变量&#39; count来决定这一点。 初始值可以是0,然后在每个循环中将其增加1。 (例如:如果你想要每5个循环产生一个敌人,则将n替换为5。)
if count % n == 0:
Enemylist.append(Enemy(random.randint(0,<YourScreenSize>),0.1))
if count > 1000:
count = 0
也就是说,在屏幕上的随机位置产生敌人,让他们向下移动。 0.1只是一个采样速度。
现在,到循环部分...... 您的for事件循环应具有KEYDOWN和KEYUP检查,以确保单个按键。 这里,Player1是Player类实例的名称。
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_RIGHT:
Player1.moveright = 1
if event.key == K_LEFT:
Player1.moveleft = 1
if event.type == KEYUP:
if event.key == K_RIGHT:
Player1.moveright = 0
if event.key == K_LEFT:
Player1.moveleft = 0
添加支票以确保播放器不会离开屏幕。
现在玩家的动作已经完成,符合这个游戏的要求。
调用播放器的更新()函数,敌人并翻转屏幕。
Player1.update(time_passed)
<blit background image or color here>
screen.blit(<image_name>, (Player1.x, <PlayerYPosition>))
for enemy in Enemylist:
enemy.update(time_passed)
screen.blit(<image_name>, (enemy.x, enemy.y))
count += 1
pygame.display.update()
现在,添加碰撞检查以完成游戏。 此外,您可以删除已离开屏幕的实例以节省内存。
答案 1 :(得分:0)
为了使你的程序不那么复杂,你需要一些气球和螺丝的课程。假设你只从左到右移动,第一个类将是你的玩家,看起来像这样:
class Player(pygame.sprite.Sprite):
def __init__(self, image_file, location):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image_file)
self.rect = pygame.image.get_rect()
self.rect.top, self.rect.left = location
这段代码会让你的气球变成精灵,准备好检测碰撞。你的螺丝课程看起来很相似,只有额外的move
和location
函数以及speed
部分的__init__
部分:
class Screws(pygame.sprite.Sprite):
def __init__(self, image_file, left, speed):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image_file)
self.rect = pygame.image.get_rect()
self.rect.top = 50
self.rect.left = left
self.speed = speed
def move(self):
self.rect = self.rect.move(self.speed)
这个类使螺丝精灵,也准备好检测。这完成了类部分。现在分组这些精灵等等:
balloon = Player('/users/Gaming/Desktop/rsz_baloon.png', [a, b])
screw = Screws('/users/Gaming/Desktop/rsz_screw_png3029.png', random.randint(0, <ScreenSize>), c)
ScrewGroup = pygame.sprite.Group()
再一次,变量是可变的,但c
越高,螺钉下降的速度就越快。 a
和b
将决定气球的位置,random.randint()
将决定您的螺丝位置。 self.rect.top
是一种查找位置的方法,可以将其用作rect
的“顶部”一侧的位置。在这种情况下它保持不变。同样适用于self.rect.left
,但它是rect
的“左”侧的位置。现在去气球的移动部分,以避免过度按下UP和DOWN键(以及疲劳),在这之后添加以下代码行:
delay = 100
interval = 50
pygame.key.set_repeat(delay, interval)
on = True
screwy = 0
delay
是每个KEYDOWN被激活之间的毫秒数,而interval是等待直到开始重复KEYDOWN的毫秒数。这将通过让他按住向右箭头键的左边来帮助用户,并且气球将继续朝着期望的方向前进。 on
和screwy
变量将在下一节中讨论。接下来,while循环几乎就在那里:
while True:
screen.blit(balloon.image, balloon.rect)
while int(screwy - 1) > -1:
screen.blit(screw.image, screw.rect)
pygame.display.flip()
second while循环生成尽可能多的螺丝,只要screwy
- 1的值小于-1(负1)。这也会翻转屏幕以避免屏幕上留下任何“轨迹”。现在到气球的移动部分:
for event in pygame.event.get():
#Remember to do this : from pygame.locals import *#
if event.type == QUIT:
on = False
#Remember to import sys!#
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key = K_LEFT:
balloon.rect.left -= 30
elif event.key == K_RIGHT:
#This can only work if (width_of_the_picture - a) is equal to 30#
balloon.rect.left += int(width_of_the_picture - a)
这将允许您移动气球(您可以按住键以使气球像真实的视频游戏一样移动)。接下来将继续产生螺钉:
if screwy < 10:
ScrewGroup.append(Screws('/users/Gaming/Desktop/rsz_screw_png3029.png', random.randint(0, b), [0, 15]))
screwy += 1
这将在随机位置生成螺钉(相同的self.rect.top
值以使其看起来真实)。在这种情况下,b
将等于屏幕的宽度。最后,精灵检测:
if pygame.sprite.spritecollide(balloon, ScrewGroup, True):
on = False
sys.exit()
pass
检测气球是否与螺钉发生碰撞。如果这是真的,那么你可以决定。您可以退出while循环并退出程序,这是一种方法。但是如果您计划执行print 'Game Over!
之类的操作,请在执行on = False
/ sys.exit()
之前添加该行,这将立即退出循环/程序。您需要重新显示图像并允许屏幕退出(pygame.quit
):
screen.fill([255, 255, 255])
screen.blit(balloon.image, balloon.rect)
while int(screwy - 1) > -1:
screen.blit(screw)
pygame.display.flip()
pygame.quit()
请记住将pygame.quit()
放在while循环之外,否则屏幕会立即消失。当然,制作一些代码来防止气球退出屏幕。将KEYDOWN部分更改为:
elif event.type == pygame.KEYDOWN:
if event.key == K_LEFT:
if int(balloon.rect.left) - 30 < 0:
pass
elif int(balloon.rect.left) - 30 >= 0:
balloon.rect.left -= 30
elif event.key == K_RIGHT:
if int(balloon.rect.left) + (<Width_OF_Balloon> - a) > <Width_OF_Screen>:
pass
elif int(balloon.rect.left) + (<Width_OF_Balloon> - a) <= <Width_OF_Screen>:
#This can only work if (<Width_OF_Balloon> - a) is equal to 30#
baloon.rect.left + (<Width_OF_Balloon> - a)
如果向左/向右移动一次使气球部分离开屏幕,则程序将不允许气球左右移动而不对pass
执行任何操作。这应该会显着改善您的计划并回答您的问题。我希望这可以帮助你!