WebHU - Programozási kérdések és válaszok

Pygame – Probléma az ütközési határ beállításával egy adott területen [másolat]

--- TELJES KÓD A KÉRDÉS ALJÁN ---

az a tervem, hogy hozzáadok egy olyan területet a képernyőmhez, amelyet egy NPC foglal el, hogy a lejátszó teljesen ne tudjon belépni. Kipróbáltam ezt a módszert a kódom NPC osztályában, ahol a lejátszó y pozícióját összehasonlítják az npc "self.y"/current y pozíciójával:

class NPC(object):
        def __init__(self, path, x, y):
                self.image = pygame.image.load(path).convert_alpha()
                self.x = x
                self.y = y
                self.width = self.image.get_width()
                self.height = self.image.get_height()
                self.hitbox = (self.x, self.y, self.width, self.height)


        def spawn(self, surface):
                surface.blit(self.image, (self.x, self.y))
                self.hitbox = (self.x, self.y, self.width, self.height)
                pygame.draw.rect(screen, (255, 255, 255), self.hitbox, 2)

        def collide(self, x, y, width, height):
                if self.y <= y <= self.y + self.height:
                        print("collide")
                        up = True
                else:
                        up = False
                        print("not")

Tisztában vagyok vele, hogy még nem fejeztem be megfelelően a kódot, csak azt a részt tettem hozzá, aminek meg kell akadályoznia a lejátszó felfutását jelenleg tesztelési céllal.

Valamilyen oknál fogva azonban az ütközési határ a képernyő legtetején van (míg az NPC nem), és gyanítom, hogy ez annak a programnak köszönhető, amely megméri az npc magasságát a képernyő tetejétől (azaz az npc sprite 32 pixel magas, így az ütközési terület az első 32 képpont a képernyő tetején)

Az a kód, amely megakadályozza a játékos mozgását (amire a "fel" logikai érték az osztályon kívül utal), szintén nem működik - ez valószínűleg az értékek vissza nem adása miatt van?

TELJES KÓD:

import pygame
import time

progress = 0

pygame.init()
(width, height) = (600, 400) #specify window resolution
bg_colour = (100,20,156) #specify bg colour

player_path = "downChara.png" #specifies image path

moveDown = True
moveUp = True
moveRight = True
moveLeft = True

class Player(object): #representitive of the player's overworld sprite
        def __init__(self):
            self.image = pygame.image.load(player_path).convert_alpha() #creates image, the player_path variable allowing it to be updated
            self.X = (width/2) -16; # x co-ord of player
            self.Y = (height/2)-16; # y co-ord of player
            self.width = self.image.get_width()
            self.height = self.image.get_height()
            self.hitbox = (self.X, self.Y, self.width, self.height)


        def handle_keys(self, down, up, left, right): #handling the keys/inputs
                key = pygame.key.get_pressed()
                dist = 5 #distance travelled in one frame of the program
                if key[pygame.K_DOWN] and down == True: #if down
                        self.Y += dist #move down the length of dist
                        player_path = "downChara.png" #change image to down
                        self.image = pygame.image.load(player_path).convert_alpha()
                elif key[pygame.K_UP] and up == True: #if up
                        self.Y -= dist #move up the length of dist
                        player_path = "upChara.png" #change to up
                        self.image = pygame.image.load(player_path).convert_alpha()
                if key[pygame.K_RIGHT] and right == True: #etc.
                        self.X += dist
                        player_path = "rightChara.png"
                        self.image = pygame.image.load(player_path).convert_alpha()
                elif key[pygame.K_LEFT] and left == True:
                        self.X -= dist
                        player_path = "leftChara.png"
                        self.image = pygame.image.load(player_path).convert_alpha()


        def outX(coord): #"coord" acts the same as "self"
                return (coord.X)
        def outY(coord):
                return (coord.Y)


        def draw(self, surface): #draw to the surface/screen
            surface.blit(self.image, (self.X, self.Y))
            self.hitbox = (self.X, self.Y, self.width, self.height)
            pygame.draw.rect(screen, (255, 255, 255), self.hitbox, 2)
            return self.X, self.Y, self.width, self.height


class NPC(object):
        def __init__(self, path, x, y):
                self.image = pygame.image.load(path).convert_alpha()
                self.x = x
                self.y = y
                self.width = self.image.get_width()
                self.height = self.image.get_height()
                self.hitbox = (self.x, self.y, self.width, self.height)


        def spawn(self, surface):
                surface.blit(self.image, (self.x, self.y))
                self.hitbox = (self.x, self.y, self.width, self.height)
                pygame.draw.rect(screen, (255, 255, 255), self.hitbox, 2)

        def collide(self, x, y, width, height):
                if self.y <= y <= self.y + self.height:
                        print("collide")
                        up = True
                else:
                        up = False
                        print("not")
                ##if self.y < player.hitbox[1]

def text_objects(text, font):
        textSurface = font.render(text, True, (255, 255, 255))
        return textSurface, textSurface.get_rect()

def interact(text):
        textbox = pygame.transform.scale(pygame.image.load("bigbox.png"), (600, 111))
        textSize = pygame.font.Font("cour.ttf",28) #specify text size
        TextSurf, TextRect = text_objects(text, textSize) #allow text to be positioned
        TextRect.topleft = (12, 297) #where text will be
        screen.blit(textbox, (0, 289))
        screen.blit(TextSurf, TextRect) #display text
        pygame.display.update() #updates screen
        time.sleep(2)
        screen.fill(bg_colour, TextRect)



##def checker(array):
##  ##  check first value of each part of array (all numbers)
##  ##  compare it to progress
##  ##  if equal to or less than, cycle through rest of that part of array.
##  ##  if greater than, then ignore.
##  ##  e.g: progress = 49, NPC1 will still be on text "0", NPC2 will now be on "33" and NPC3 will be on "0"
##  
##        placeholderList = []
##  
##        for x in range(len(array)):
##                if array[x][0] <= progress:
##                        del placeholderList[0:]
##                        placeholderList.append(array[x][1:])
##        for x in range(len(placeholderList)):
##                passMe = placeholderList[x]
##                print (passMe)
##                npc.interact(passMe)


screen = pygame.display.set_mode((width, height)) #create window
pygame.display.set_caption('EduGame') #specify window name

player = Player()

playerx, playery, playerwidth, playerheight = player.draw(screen)

clock = pygame.time.Clock()

person1 = NPC("talkToThis.png",100, 200)
npc = NPC("test.png",0, 0)

def setup(text):
        for x in range(len(text)):
                passtext = text[x]
                interact(passtext)


boarderX = player.outX()
boarderY = player.outY()
##print (boarderX, boarderY) #making sure they both returned properly

pygame.display.flip() #paints screen
gameRun = True #allow game events to loop/be carried out more than once



while gameRun: #while game is running:
        person1text2 = [[0,"beginng","www","xxdqsd"],[1,"middle","aa"],[2,"end!"]]
        personText = ("hello","hi","bye")

        playerx, playery, playerwidth, playerheight = player.draw(screen)
        print(playerx, playery, playerwidth, playerheight)
        npc.collide(playerx, playery, playerwidth, playerheight)

        event = pygame.event.poll()
        if event.type == pygame.QUIT: #if the "x" is pressed
                pygame.quit() #quit game
                gameRun = False #break the loop.
                quit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
##                checker(person1text2)
                setup(personText)



        player.handle_keys(moveDown, moveUp, moveLeft, moveRight) #handle keys

        screen.fill(bg_colour) #draw background colour

        player.draw(screen) #draws player

        person1.spawn(screen)



        pygame.display.update()

        posX = player.outX()
        posY = player.outY()

        if posX > width - 32: #this is because the sprite's "X" is determined in the top left corner, meaning we have to subtract the width from the measurement
                moveRight = False
        else:
                moveRight = True
        if posX < 0:
                moveLeft = False
        else:
                moveLeft = True
        if posY > height - 32: #this is because the sprite's "X" is determined in the top left corner, meaning we have to subtract the width from the measurement
                moveDown = False
        else:
                moveDown = True
        if posY < 0:
                moveUp = False
        else:
                moveUp = True



        clock.tick(60)

ez nagyon WIP, szóval ha bármi mást is elkapsz, miközben átnézed, akkor nyugodtan hozd fel.

21.09.2018

  • Csak falakat (pygame.Rects vagy pygame.sprite.Sprites) hoznék létre az NPC körül, és a következő módon kezelném az ütközéseket: stackoverflow.com/a/45017561 /6220679 22.09.2018

Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..