Как напечатать что-нибудь, когда функция НЕ возвращает определенную вещь - PullRequest
0 голосов
/ 18 февраля 2019
def collideY(player, object):
    if man.x <= object.x + object.width and man.x + man.width >= object.x: # Checks if  the player is inside the bounderies of a list of objects
        return "F"

cY = collideY(Player, object)
if not cY == "F":
    print("Not F")

Это печатает "не F" все время, и я хочу, чтобы оно печаталось только тогда, когда F не возвращено PS Это весь мой код, если вы хотите его увидеть Это воссоздание Марио.Игра работает хорошо, но у меня возникают проблемы с добавлением гравитации, когда игрок выходит из платформы.Что мне нужно сделать, это обнаружить, когда игрок (человек) не находится в диапазоне х объектов.У меня есть функция CollisionY (), которая уже проверяет, находится ли игрок в диапазоне x объектов (все это находится в цикле while). Я могу заставить функцию возвращать переменную, когда обнаруживает человека в диапазоне x, нопо какой-то причине я не могу заставить его обнаруживать, когда он не находится в объектах x range

import pygame
from pygame import *

pygame.init()

# Screen Setup
Screen_Height = 600
Screen_Width = 800
Screen_Size = (Screen_Width, Screen_Height)
win = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Mario")

# Sprites for Mario
walkRight = [pygame.image.load('mario_move0.png'), pygame.image.load('mario_move1.png'),
             pygame.image.load('mario_move2.png')]
walkLeft = [pygame.image.load('mario_move02.png'), pygame.image.load('mario_move12.png'),
            pygame.image.load('mario_move22.png')]

char = pygame.image.load('mario.png')
char2 = pygame.image.load('mario2.png')
jumping = pygame.image.load("mario_jump.png")
jumping2 = pygame.image.load("mario_jump2.png")

#Setup Background
bg = pygame.image.load('level_1.png')
bg = pygame.transform.scale(bg, (9000, 600)).convert()
bgWidth, bgHeight = bg.get_rect().size

#Map sprites
spritesheet = pygame.image.load("tile_set.png")
character = Surface((15, 16), pygame.SRCALPHA)
character.blit(spritesheet, (-17, 0))
character = pygame.transform.scale(character, (44, 44))
brick1 = character




clock = pygame.time.Clock()

class player(object):
    def __init__(self, x, y, width, height ):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 1
        self.isJump = False
        self.left = False
        self.right = False
        self.standing = True
        self.walkCount = 0
        self.jumpCount = 10
        self.starting = True
        self.runCount = 0
        self.jumping = 0
        self.currenty = 410
        self.done = True
        self.ableJump = False
        self.scroll = 0
        self.x3 = 0
        self.fall = False
        self.rightStop = False
        self.leftStop = False
        self.grav = .4
    def draw(self, win):

        if self.walkCount + .5 >= 3:
            self.walkCount = 0

        if self.runCount >= 12:
            self.runCount = 12

        if self.left and not self.isJump and not self.standing and not self.fall:
            win.blit(walkLeft[self.walkCount], (self.x, self.y))
            self.walkCount += 1
            if self.runCount < 12:
                self.runCount += 1

        elif self.right and not self.isJump and not self.standing and not self.fall:
            win.blit(walkRight[self.walkCount], (self.x, self.y))
            self.walkCount += 1
            if self.runCount < 12:
                self.runCount += 1

        if self.standing and self.right and not self.isJump or self.starting and not self.fall:
            win.blit(char, (self.x, self.y))

        elif self.standing and self.left and not self.isJump and not self.fall:
            win.blit(char2, (self.x, self.y))

        elif self.isJump or self.fall:
            if self.right:
                win.blit(jumping, (self.x, self.y))

            elif self.left:
                 win.blit(jumping2, (self.x, self.y))

class Object(object):

    def __init__(self, x, y, width, height, type=""):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.type = type # OPTIONAL

    def draw(self, win):
        pygame.draw.rect(win, (255,0,0), (self.x, self.y, self.width, self.height), 5)

    def draw_brick(self, win):
        win.blit(brick1,(self.x, self.y, self.width, self.height))

def collideY(player, object):
    if man.x <= object.x + object.width and man.x + man.width >= object.x: # Top check
        if man.y <= object.y + object.height and man.y + man.height >= object.y + object.height:
            return "D"
        elif man.y <= object.y and man.y + man.height >= object.y:
            return "U"
    else:
        return "F"

    return False

def collideX(player, object):
    if man.x + man.width >= object.x and man.x <= object.x: # Left side collision
        if man.y + man.height > object.y and man.y < object.y + object.height:
            return "L"

    elif man.x <= object.x + object.width and man.x + man.width >= object.x + object.width: # right side collision
        if man.y + man.height > object.y and man.y < object.y + object.height:
            return "R"

def right():
    # Right movement
    if not keys[pygame.K_LEFT]:
        if keys[pygame.K_s]:
            if man.x == 400 and not man.fall and man.x3 < 8572:
                man.scroll -= (man.vel * man.runCount) * 1.5
            else:
                man.x += (man.vel * man.runCount) * 1.5
        elif man.x == 400 and not man.fall and man.x3 < 8572:
            man.scroll -= man.vel * man.runCount
        else:
            man.x += man.vel * man.runCount

        if man.x >= 400 and man.x3 < 8572:
            man.x = 400

        man.right = True
        man.left = False
        man.standing = False
        man.starting = False

def left():
    if keys[pygame.K_s]:
        man.x -= (man.vel * man.runCount) * 1.5
    else:
        man.x -= man.vel * man.runCount
    man.left = True
    man.right = False
    man.standing = False
    man.starting = False

def standing():
    man.standing = True
    man.done = True
    man.isJump2 = False
    man.walkCount = 0
    man.runCount = 0
    if man.right or man.left:
        if not man.isJump:
            man.alex = 0

def redrawGameWindow():

    man.draw(win)
    for o in objs:
        o.draw(win)
    for o in objs_1:
        o.draw_brick(win)
    pygame.display.update()
    win.blit(bg, (man.scroll, 0))
# mainloop
man = player(200, 505, 32, 32)

run = True
while run:
    clock.tick(27)

    objs = [  # Solid Blocks
            Object(man.scroll + 1196, 451, 71, 100),
            Object(man.scroll + 1622, 410, 71, 135),
            Object(man.scroll + 1961, 368, 71, 185),
            Object(man.scroll + 2427, 368, 71, 185),

            Object(man.scroll + 5690, 490, 167, 40),
            Object(man.scroll + 5734, 449, 123, 40),
            Object(man.scroll + 5775, 408, 80, 40),
            Object(man.scroll + 5817, 365, 40, 40),

            Object(man.scroll + 5942, 490, 167, 40),
            Object(man.scroll + 5942, 449, 125, 40),
            Object(man.scroll + 5942, 408, 80, 40),
            Object(man.scroll + 5943, 365, 40, 40),

            Object(man.scroll + 6287, 490, 207, 40),
            Object(man.scroll + 6331, 449, 163, 40),
            Object(man.scroll + 6372, 408, 120, 40),
            Object(man.scroll + 6414, 365, 80, 40),

            Object(man.scroll + 6579, 490, 167, 40),
            Object(man.scroll + 6579, 449, 125, 40),
            Object(man.scroll + 6579, 408, 80, 40),
            Object(man.scroll + 6579, 365, 40, 40),

            Object(man.scroll + 6928, 451, 71, 100),
            Object(man.scroll + 7607, 451, 73, 100),

            Object(man.scroll + 7680, 492, 382, 40),
            Object(man.scroll + 7724, 452, 341, 40),
            Object(man.scroll + 7765, 410, 299, 40),
            Object(man.scroll + 7808, 366, 256, 40),
            Object(man.scroll + 7851, 324, 214, 40),
            Object(man.scroll + 7893, 281, 172, 40),
            Object(man.scroll + 7934, 238, 130, 40),
            Object(man.scroll + 7978, 194, 88, 40),

            Object(man.scroll + 8407, 491, 40, 40),
           ]

    objs_1 = [
                Object(man.scroll + 850, 381, 44, 44),
                Object(man.scroll + 938, 381, 44, 44),
                Object(man.scroll + 1026, 381, 44, 44),

             ]

# Jump Height
    if man.standing or man.left or man.right:
        if not man.isJump:
            man.currenty = man.y
    jumpHeight = man.currenty - man.y
    jumpHeight = int(jumpHeight)

# Collisions / interactions for solid blocks
    for obj in objs:
        cX = collideX(man, obj)
        cY = collideY(man, obj)
        if man.isJump :
            if cY == "U":
                print("Up")
                man.standing = True
                man.isJump = False
                man.ableJump = True
                man.y = obj.y - man.height
            elif cY == "D":
                print("Down")
                man.y = obj.y + obj.height + 1
            elif cX == "R" and cY == False:
                print("Right")
                man.x = obj.x + obj.width + 1
            elif cX == "L" and cY == False:
                print("Left")
                man.x = obj.x - man.width - 1
        else:
            if cX == "R":
                print("Right")
                man.x = obj.x + obj.width + 1
            elif cX == "L":
                print("Left")
                man.x = obj.x - man.width - 1

# Collision / interactions with brick1
    for obj in objs_1:
        cX = collideX(man, obj)
        cY = collideY(man, obj)
        if man.isJump :
            if cY == "U":
                print("Up")
                man.standing = True
                man.isJump = False
                man.ableJump = True
                man.y = obj.y - man.height
            elif cY == "D":
                print("Down")
                if man.y < obj.y + obj.height:
                    man.y = obj.y + obj.height
                man.ableJump = False
            elif cX == "R" and cY == False:
                print("Right")
                man.x = obj.x + obj.width + 1
            elif cX == "L" and cY == False:
                print("Left")
                man.x = obj.x - man.width - 1
        elif not man.isJump:
            if cX == "R":
                print("Right")
                man.x = obj.x + obj.width + 1
            elif cX == "L":
                print("Left")
                man.x = obj.x - man.width - 1
        if not cY == "F":
            print("00")
        #else:
            #print("69")

# X.3 is the equivalent x cordinate on the map
    man.x3 = -1 * man.scroll + man.x

# Able to Quit without crashing
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

# Defies the movement keys
    keys = pygame.key.get_pressed()

# Left movement
    if keys[pygame.K_LEFT] and man.x > 4 and not man.leftStop:
        left()

# Right movement
    elif keys[pygame.K_RIGHT] and man.x3 < 8956 and not man.rightStop:
        right()

    elif not man.isJump:
        standing()

# Jump mechanics
    if keys[pygame.K_UP] and man.ableJump:
        if jumpHeight < 200:
            man.isJump = True
            man.runCount = 10
            man.jumpCount = 6

        else:
            man.ableJump = False
    elif man.isJump:
        man.ableJump = False

    if man.isJump:
        if man.jumpCount >= -8:
            neg = 1
            if man.jumpCount < 0:
                neg = -1
            man.jumpCount -= 1
        else:
            man.jumpCount = -8
        man.y -= (man.jumpCount ** 2) * 0.5 * neg



# Ground floor
    if man.y >= 505:
        if man.x3 > 2927 and man.x3 < 2985 or man.x3 > 3649 and man.x3 < 3750 or man.x3 > 6492 and man.x3 < 6552:
            man.fall = True
            man.y -= (man.jumpCount ** 2) * 0.09 * -1
        elif not man.fall:
            man.y = 505
            man.isJump = False
            man.ableJump = True

    redrawGameWindow()

pygame.quit()

1 Ответ

0 голосов
/ 18 февраля 2019

пара вопросов

  1. Проблема в том, что ваша функция collideY никогда не возвращает "F", потому что вы не передаете ей экземпляр класса.Вместо этого вы передаете ему сам класс.

  2. object - это внутренний класс Python.Не называйте переменную object.

попробуйте изменить метод collideY на этот

def collideY(man, bounds):
    if man.x <= bounds.x + bounds.width and man.x + man.width >= bounds.x: # Checks if  the player is inside the bounderies of a list of objects
        return "F"

и вызовите функцию следующим образомcollideY(man, bounds)

Вместо этого вы передаете экземпляр класса, вам следует передать экземпляр объекта, например man, если вы хотите, чтобы он работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...