5

我想制作一个游戏,其中有来自屏幕两侧的敌人。现在我有它,以便敌人一次在屏幕上滚动一个。我希望一次多来一个,慢慢增加他们遇到的频率。这是我的代码

import pygame, sys, time, random
from pygame.locals import *
pygame.init()
winW = 1000
winH = 600
surface = pygame.display.set_mode ((winW, winH),0,32)


pygame.display.set_caption ('Moving Orc')

class Enemy:
    def __init__(self, char, startY, startX):
        self.char=char
        self.startY=startY
        self.startX=startX
        self.drawChar()

    def drawChar (self):
        self.space = pygame.image.load (self.char)
        self.spaceRect = self.space.get_rect ()
        self.spaceRect.topleft = (self.startX,self.startY)
        self.moveChar()

    def moveChar (self):
        if self.startX == 0:
            self.xMoveAmt = 5
        elif self.startX == 800:
            self.xMoveAmt = -5

        while True:
            surface.fill ((255,255,255))
            self.spaceRect.left += self.xMoveAmt

            surface.blit (self.space, self.spaceRect)

            pygame.display.update()

            time.sleep (0.02)

            if self.spaceRect.right >= winW:
                surface.fill ((255,255,255))
                break

            elif self.spaceRect.left <= 0:
                surface.fill ((255,255,255))
                break


#MAINLINE
while True:
    enemyList=[]
    leftOrRight = random.randint(0,1)
    if leftOrRight == 0:
        leftOrRight = 0
    elif leftOrRight == 1:
        leftOrRight = 800
    enemyList.append(Enemy(("orc.png"), random.randint(50, 500), leftOrRight))

    for i in range (0,len(enemyList)):
        enemyList[i].drawChar()
        break

我有它,这样每次你进入循环时,它都会重置它在我创建的类中运行的列表。一个人会从左边或右边穿过屏幕。

我什至会从哪里开始?

4

2 回答 2

3

为了拥有多个敌人,您应该解决的问题很少。

一个简单的pygame程序结构是什么样子的

init() 
While(True):
    draw()
    update()
    checkInput()

我看到你已经为敌人写了一个绘制和移动函数,但他们没有做他们应该做的事情。

您的 draw 方法加载图像,并调用移动函数。加载通常应在__init__().

你的 move 函数绘制和移动角色,但它有一个 While 循环,这使它卡住,直到该角色离开屏幕。

一个示例解决方案:

def draw(self,surface):
    surface.blit (self.space, self.spaceRect)

def move(self):
    self.spaceRect.left += self.xMoveAmt
    if self.spaceRect.right >= winW:
        self.kill()
    elif self.spaceRect.left <= 0:
        self.kill()

杀死一个对象的一种可能方法是设置一个标志,并在 While 方法中检查它是否可以从对象列表中删除。

现在您可以创建一个敌人列表,并调用 draw 并为每个敌人更新。在一个 for 循环中。

于 2013-06-05T17:16:29.233 回答
2

摆脱drawChar功能;让 Enemy 类知道surface哪些应该只存在于游戏逻辑中是不好的做法。更改moveChar函数,使其仅更新对象的位置。取出循环moveChar并处理主游戏循环中的移动。

敌人等级:

class Enemy(object):
    def __init__(self, char, startX=0, startY=0, xMovAmnt=0):
        self.char = char
        self.x = startX
        self.y = startY
        self.xMovAmnt = xMovAmnt
        # no reason to load the image every time you want to draw, do it here
        self.image = pygame.image.load(self.char)
        self.rect = self.image.get_rect()

    def moveChar(self):
        self.x += self.xMovAmnt

游戏循环

enemyList = []
while True:
    ...
    # you never specified when you want to create a new Enemy, 
    #    so you need to figure that out on your own
    ...

    # this is a more "Pythonic" way of looping over a list than using a range
    for enemy in enemyList:
        enemy.movChar()
        surface.blit(enemy.image, (enemy.x, enemy.y))

    pygame.display.update()
于 2013-06-05T17:07:57.303 回答