Проблемы с движением игроков и взаимодействие с персонажами в Pygame

Я работаю над маленькой игрой, которая касается главного героя, который является кошкой, и собак, которые преследуют его. Собаки могут блуждать, как они должны делать, но кошка будет перемещать только небольшое пространство слева и справа; кошка будет двигаться вниз один раз, но она не будет двигаться вверх. Будет ли размер кошки заставлять камеру не следовать или позволять кошке двигаться дальше? Размер - вещь внутри playerObj.

Кроме того, когда собака сталкивается с кошкой, кошка должна потерять один бар здоровья. Когда кошка сталкивается с собакой, она не обнаруживает, что собака «ударила» по кошке, а кошка не потеряла ни одного бара здоровья, как и следовало ожидать. Это проблема с обнаружением столкновения в моем коде. Кошка вообще не теряет здоровья. Не уверен, есть ли в моем коде функция, которая не выполняется или что. Я собираюсь опубликовать весь основной код, который касается как движения, так и здоровья.

Основной игровой файл

import pygame, sys, math, random
import time
# from pygame import *
from globals import *
from Start import *
from instructions import *

def main():
    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    startScreen()
    displayInst()
    instructions()


def instructions():
        while True:
            for event in pygame.event.get():
                keyE = pygame.event.get(KEYUP)
                if event.type == pygame.QUIT:
                    terminate()
                if event.type == pygame.KEYDOWN:
                    DISPLAYSURF.fill(WHITE)
                    runGame()
                    if event.key == pygame.K_ESCAPE:
                        terminate()

def runGame():

    invulnerable = False   # if the player is invulnerable
    invulnerableStart = 0
    gameOverMode = False   # if the player has lost
    gameOverStartTime = 0  # time the player lost
    winMode = False        # if the player won
    INVULTIME = 2

    dogObjs = []  #stores all dog objects in the game
    # cameraX and cameraY are the top left of where the camera view is
    cameraX = 0
    cameraY = 0

    dogObjs = [] # stores all the non-player objects
    foodObjs = [] # stores all the food objects

    playerObj = {'surface': pygame.transform.scale(HungryCat, (STARTSIZE, STARTSIZE)),
                 'facing': RIGHT,
                  'size' : STARTSIZE,
                  'x': HALF_WINWIDTH,
                  'y': HALF_WINHEIGHT,
                  'health': MAXHEALTH}

    moveLeft = False
    moveRight = False
    moveUp = False
    moveDown = False

    while True:  # main game loop
        DISPLAYSURF.fill(WHITE)
        if invulnerable and time.time() - invulnerableStart > INVULTIME:
            invulnerable = False

        for dObj in dogObjs:
            # move all the dogs
            dObj['x'] += dObj['moveX']
            dObj['y'] += dObj['moveY']

            if random.randint(0,99) < DIRECTIONCHANGE:
                dObj['moveX'] = getRandomVelocity()
                dObj['moveY'] = getRandomVelocity()
                if dObj['moveX'] > 0:  # faces right
                    dObj['surface'] = pygame.transform.scale(TScaryDog, (dObj['width'], dObj['height']))
                else:  # faces left
                    dObj['surface'] = pygame.transform.scale(ScaryDog, (dObj['width'], dObj['height']))

        # go through all objects and see if any need to be deleted
        for i in range(len(dogObjs) -1, -1, -1):
            if isOutsideActiveArea(cameraX, cameraY, dogObjs[i]):
                del dogObjs[i]

        # if there are not enough dogs, make more
        while len(dogObjs) < NUMDOGS:
            dogObjs.append(makeNewDog(cameraX, cameraY))

        # adjusts the cameras X and Y if they are beyond the allowed camera slack value
        playerCenterX = playerObj['x'] + int(playerObj['size'] / 2)
        playerCenterY = playerObj['y'] + int(playerObj['size'] / 2)
        if (cameraX + HALF_WINWIDTH) - playerCenterX > CAMERASLACK:
            cameraX = playerCenterX + CAMERASLACK - HALF_WINWIDTH
        elif playerCenterX - (cameraX + HALF_WINWIDTH) > CAMERASLACK:
            cameraX = playerCenterX - CAMERASLACK - HALF_WINWIDTH
        if (cameraY + HALF_WINHEIGHT) - playerCenterY > CAMERASLACK:
            cameraY = playerCenterY + CAMERASLACK - HALF_WINHEIGHT
        elif playerCenterY - (cameraY + HALF_WINHEIGHT) > CAMERASLACK:
            cameraY = playerCenterY - CAMERASLACK - HALF_WINHEIGHT

        # draw all dogs
        for dObj in dogObjs:
            dObj['rect'] = pygame.Rect(dObj['x'] - cameraX,
                                          dObj['y'] - cameraY,
                                          dObj['width'],
                                          dObj['height'])
            DISPLAYSURF.blit(dObj['surface'], dObj['rect'])

        # draw the player
        flashIsOn = round(time.time(), 1) * 10 % 2 == 1
        if not gameOverMode and not (invulnerable and flashIsOn):
        # and not flashIsOn:
            playerObj['rect'] = pygame.Rect( (playerObj['x'] - cameraX,
                                                playerObj['y'] - cameraY,
                                                playerObj['size'],
                                                playerObj['size']) )
            DISPLAYSURF.blit(playerObj['surface'], playerObj['rect'])

        # draws the health meter
        healthMeter(playerObj['health'])


        for event in pygame.event.get():
            if event.type == QUIT:
                terminate()

            elif event.type == KEYDOWN:
                if event.key in (K_UP, K_w):
                    moveDown = False
                    moveUP = True
                elif event.key in (K_DOWN, K_s):
                    moveUp = False
                    moveDown = True
                elif event.key in (K_LEFT, K_a):
                    moveRight = False
                    moveLeft = True
                    if playerObj['facing'] != LEFT:
                        playerObj['surface'] = pygame.transform.scale(THungryCat, (playerObj['size'], playerObj['size']))
                    playerObj['facing'] = LEFT
                elif event.key in (K_RIGHT, K_d):
                    moveLeft = False
                    moveRight = True
                    if playerObj['facing'] != RIGHT:
                        playerObj['surface'] = pygame.transform.scale(HungryCat, (playerObj['size'], playerObj['size']))
                    playerObj['facing'] = RIGHT
                elif winMode and event.key == K_RETURN:
                    return

            elif event.type == KEYUP:
                # stop moving the players
                if event.key in (K_LEFT, K_a):
                    moveLeft = False
                elif event.key in (K_RIGHT, K_d):
                    moveRight = False
                elif event.key in (K_UP, K_w):
                    moveUp = False
                elif event.key in (K_DOWN, K_s):
                    moveDown = False

                elif event.key == K_ESCAPE:
                    terminate()


        if not gameOverMode:
            # actually move the player
            if moveLeft:
                playerObj['x'] -= MOVERATE
            if moveRight:
                playerObj['x'] += MOVERATE
            if moveUp:
                playerObj['y'] -= MOVERATE
            if moveDown:
                playerObj['y'] += MOVERATE

            # check for collision with dogs
            for i in range(len(dogObjs)- 1, -1, -1):
                dgObjs = dogObjs[i]
                if rect in dgObjs and playerObj['rect'].colliderect(dgObjs['rect']):
                    # this means a collision has occured

                    if dgObjs['width'] * dgObjs['height'] <= playerObj['size']** 2:
                        playerObj['size'] += int((dgObjs['width'] * dgObjs['height'])** 2) + 1
                        del dogObjs[i]

                        if playerObj['facing'] == LEFT:
                            playerObj['surface'] = pygame.transform.scale(HungryCat, (playerObj['size'], playerObj['size']))
                        if playerObj['facing'] == RIGHT:
                            playerObj['surface'] = pygame.transform.scale(THungryCat, (playerObj['size'], playerObj['size']))

                        if playerObj['size'] > HOWBIG:
                            winMode = True

                    elif not invulnerable:

                        invulnerable = True
                        invulnerableStart = time.time()
                        playerObj['health'] -= 1
                        if playerObj['health'] == 0:
                            gameOverMode = True
                            gameOverStartTime = time.time()


        else:
            # game is over, show "game over" screen
            gameOverScreen = pygame.image.load('gameOver.png')
            DISPLAYSURF.blit(gameOverScreen, (0,0))
            if time.time() - gameOverStartTime > GAMEOVERTIME:
                return # end the current game

        # check if player has won
        if winMode:
            WinScreen = pygame.image.load('Win.png')
            DISPLAYSURF.blit(WinScreen, (0,0))

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


def healthMeter(currentHealth):  # draws the players health bar
    for i in range(currentHealth):
        pygame.draw.rect(DISPLAYSURF, RED, (15, 5 + (10 * MAXHEALTH) - i * 10, 20, 10))
    for i in range(MAXHEALTH):
        pygame.draw.rect(DISPLAYSURF, WHITE, (15, 5 + (10 * MAXHEALTH) - i * 10, 20, 10), 1)

def getRandomVelocity():
    speed = random.randint(DOGMINSPEED, DOGMAXSPEED)
    if random.randint(0, 1) == 0:
        return speed
    else:
        return -speed

def makeNewDog(cameraX, cameraY):
    dog = {}
    generalSize = random.randint(5, 25)
    multiplier = random.randint(1,3)
    dog['width'] = (generalSize + random.randint(0,10)) * multiplier
    dog['height'] = (generalSize + random.randint(0,10)) * multiplier
    dog['x'], dog['y'] = getRandomOffCameraPos(cameraX, cameraY, dog['width'], dog['height'])
    dog['moveX'] = getRandomVelocity()
    dog['moveY'] = getRandomVelocity()
    if dog['moveX'] < 0:  # faces right
        dog['surface'] = pygame.transform.scale(ScaryDog, (dog['width'], dog['height']))
    else:  #dog is facing left
        dog['surface'] = pygame.transform.scale(TScaryDog, (dog['width'], dog['height']))
    return dog

def getRandomOffCameraPos(cameraX, cameraY, objWidth, objHeight):

    cameraRect = pygame.Rect(cameraX, cameraY, WINWIDTH, WINHEIGHT)
    while True:
        x = random.randint(cameraX - WINWIDTH, cameraX + (2 * WINWIDTH))
        y = random.randint(cameraY - WINHEIGHT, cameraY + (2 * WINHEIGHT))

        objRect = pygame.Rect(x,y, objWidth, objHeight)
        if not objRect.colliderect(cameraRect):
            return x, y

def isOutsideActiveArea(cameraX, cameraY, obj):
    # Return False if camerax and cameray are more than
    # a half-window length beyond the edge of the window.
    boundsLeftEdge = cameraX - WINWIDTH
    boundsTopEdge = cameraY - WINHEIGHT
    boundsRect = pygame.Rect(boundsLeftEdge, boundsTopEdge, WINWIDTH * 5, WINHEIGHT * 5)
    objRect = pygame.Rect(obj['x'], obj['y'], obj['width'], obj['height'])
    return not boundsRect.colliderect(objRect)

if __name__ == '__main__':
    main()
4 голоса | спросил Taylor 18 PMpTue, 18 Apr 2017 16:14:23 +030014Tuesday 2017, 16:14:23

1 ответ


1

Поэтому я считаю, что проблема связана с:

1). Имея несколько циклов «основной игры» и

2). проблемы с импортом pygame.

Я считаю, что у меня было несколько «плохих» импортов с разными файлами, которые у меня были с «встроенными» модулями. Я считаю, что они конфликтуют, потому что, как только я прокомментировал остальные мои файлы и сделал его одним большим основным файлом, он работал так, как я думал.

Спасибо всем, кто помог мне с основами Stack Exchange!

ответил Taylor 19 PMpWed, 19 Apr 2017 18:41:22 +030041Wednesday 2017, 18:41:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132