X и Y моего игрока пройдут только определенную точку - PullRequest
0 голосов
/ 20 ноября 2018

Примечание: я использую python / pygame.Я строил мини-карту и основывал расположение иконки персонажа на значениях х и у персонажа.Вскоре я понял, что икона пошла только до определенного момента.Я решил напечатать x игрока на любом y и вскоре узнал, что x и y будут обновляться только до 955 и 350-го числа.Если вы могли прочитать это, и я упускаю что-то очевидное, пожалуйста, дайте мне знать.Это все соответствующий код.Спасибо!Кроме того, если мне нужно быть более конкретным, просто напишите мне, а не снимайте это.

Вот код - некоторые из его могут не понадобиться, но я добавил его на всякий случай:

class You(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface([50, 50])
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.inventory = pygame.sprite.Group()
        self.touched_trees = pygame.sprite.Group()
        self.OpenInventory = False
        self.rect.x = x
        self.rect.y = y
        self.dx = 0
        self.dy = 0
        self.speed = 5
        self.strength = 5
        self.food = 10
        self.water = 10
        self.outside = True
        self.health = 20
        self.coords = []
        self.incar = False
        self.insidehp = False
        self.insideHouse = False
        self.insidegym = False
        self.insideFirestation = False
        self.intread = False
        self.intree = False
        self.inbench = False
        self.alive = True
        self.action = False
        self.frozen = False
        self.benchfactor = 0
        self.benchmeter = 0
        self.mask = pygame.mask.from_surface(self.image)

    def update(self):
        screen.blit(self.image, (self.rect.x, self.rect.y))
        if self.dx != 0:
            self.move_single_axis(self.dx, 0)
        if self.dy != 0:
            self.move_single_axis(0, self.dy)
        if self.food > 10:
            self.food = 10
        if self.food < 1:
            self.alive = False
        if self.water > 10:
            self.water = 10
        if self.water < 1:
            self.alive = False


    def move_single_axis(self, dx, dy):
        global ct
        self.rect.x += dx
        self.rect.y += dy
        if self.outside:
            wall = pygame.sprite.spritecollide(player, map.home, False)
            for w in wall:
                if self. insideHouse == False:
                    if dx > 0:
                        self.rect.right = w.rect.left
                    elif dx < 0:
                        self.rect.left = w.rect.right
                    elif dy > 0:
                        self.rect.bottom = w.rect.top
                    elif dy < 0:
                        self.insideHouse = True
                        self.rect.y -= 50


                elif self.rect.bottom == w.rect.bottom:
                    self.rect.y += 50
                    print('exit det is good')
                    self.insideHouse = False
        pwall = pygame.sprite.spritecollide(player, otherpeoples, False)
        for p in pwall:
            if dx > 0:
                p.rect.x += self.speed
            elif dx < 0:
                p.rect.x -= self.speed
            elif dy > 0:
                p.rect.y += self.speed
            elif dy < 0:
                p.rect.y -= self.speed
        if self.outside:
            #tree collisions
            twall = pygame.sprite.spritecollide(player, forest.NormalTreeses, False)
            for a in twall:
                forest.NormalTreeses.remove(a)
                self.touched_trees.add(a)
                self.intree = True
            twall2 = pygame.sprite.spritecollide(player, self.touched_trees, False)
            for t in self.touched_trees:
                for o in forest.Trunks:
                    if o.rect.x == w.rect.x+225 and o.rect.y == w.rect.y+225:
                        screen.blit(o.image, (o.rect.x, o.rect.y))
            if not twall2:
                for touch in self.touched_trees:
                    forest.NormalTreeses.add(touch)
                    self.touched_trees.remove(touch)
                    self.intree = False

        if self.intree:
            twall3 = pygame.sprite.spritecollide(player, forest.Trunks, False)
            for t in twall3:
                if dx > 0:
                    self.rect.right = t.rect.left
                elif dx < 0:
                    self.rect.left = t.rect.right
                elif dy > 0:
                    self.rect.bottom = t.rect.top
                elif dy < 0:
                    self.rect.top = t.rect.bottom

        if self.outside:
            cwall = pygame.sprite.spritecollide(player, map.HP, False)
            for c in cwall:
                if self.insidehp == False:
                    if dx > 0:
                        self.rect.right = c.rect.left
                    elif dx < 0:
                        self.rect.left = c.rect.right
                    elif dy > 0:
                        self.rect.bottom = c.rect.top
                    elif dy < 0:
                        self.insidehp = True
                        self.rect.y -= 50

                elif self.rect.bottom == c.rect.bottom:
                    self.rect.y += 50
                    self.insidehp = False

        if self.insidehp == True:
            hpwalldet = pygame.sprite.spritecollide(self, hpwalls, False)
            for h in hpwalldet:
                if dx > 0:
                    self.rect.right = h.rect.left
                elif dx < 0:
                    self.rect.left = h.rect.right
                elif dy > 0:
                    self.rect.bottom = h.rect.top
                elif dy < 0:
                    self.rect.top = h.rect.bottom

        if self.insideFirestation == True:
            fswalldet = pygame.sprite.spritecollide(self, fswalls, False)
            for f in fswalldet:
                if dx > 0:
                    self.rect.right = f.rect.left
                elif dx < 0:
                    self.rect.left = f.rect.right
                elif dy > 0:
                    self.rect.bottom = f.rect.top
                elif dy < 0:
                    self.rect.top = f.rect.bottom


        if self.outside:
            dwall = pygame.sprite.spritecollide(player, map.gyms, False)
            for d in dwall:
                if self.insidegym == False:
                    if dx > 0:
                        self.rect.right = d.rect.left
                    elif dx < 0:
                        self.rect.left = d.rect.right
                    elif dy > 0:
                        self.rect.bottom = d.rect.top
                    elif dy < 0:
                        self.insidegym = True
                        d.image.fill(WHITE)
                        self.rect.y -= 50


                elif self.rect.bottom == d.rect.bottom:
                    self.rect.y -= 50
                    d.image = pygame.image.load("Images/gym.png")
                    d.image = pygame.transform.scale(d.image, (2000, 1000))
                    self.insidegym = False

        if self.outside:
            ewall = pygame.sprite.spritecollide(player, map.firestations, False)
            for e in ewall:
                if self.insideFirestation == False:
                    if dx > 0:
                        self.rect.right = e.rect.left
                    elif dx < 0:
                        self.rect.left = e.rect.right
                    elif dy > 0:
                        self.rect.bottom = e.rect.top
                    elif dy < 0:
                        self.insideFirestation = True
                        e.image.fill(WHITE)
                        self.rect.y -= 50

                elif self.rect.bottom == e.rect.bottom:
                    self.rect.y -= 50
                    e.image = pygame.image.load("Images/firehouse.png")
                    e.image = pygame.transform.scale(e.image, (1000, 1000))
                    self.insideFirestation = False

        ct = pygame.sprite.spritecollide(self, carlist, False)
        if self.incar == False:
            if ct:
                for t in ct:
                    t.lose_attributes()
                    incarlist.add(t)
                    player.GainCarAttributes(t)




    def GainCarAttributes(self, car):
        self.image = pygame.Surface([200, 200])
        self.image.fill(YELLOW)
        self.speed = car.speed
        self.health = car.health
        self.incar = True
        print('became car')

    def ExitCar(self, car):
        self.image = pygame.Surface([50, 50])
        car.image = pygame.Surface([200, 200])
        car.image.fill(YELLOW)
        incarlist.x = player.rect.x
        incarlist.y = player.rect.y
        self.rect.x -= 55
        self.image.fill(BLUE)
        self.speed -= self.speed
        self.speed += 10
        self.health = 20
        self.incar = False

    def left(self, _deltatime):
        self.dx = -self.speed

    def right(self, _deltatime):
        self.dx = self.speed

    def up(self, _deltatime):
        self.dy = -self.speed

    def down(self, _deltatime):
        self.dy = self.speed

    def stopx(self):
        self.dx = 0

    def stopy(self):
        self.dy = 0

---- я немного пропустил

def event_collector():
    global inmenu
    inmenu = False
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            global done
            done = True
        if event.type == pygame.KEYDOWN:
            if player.frozen == False:
                if event.key == pygame.K_w:
                    player.up(deltatime)
                if event.key == pygame.K_a:
                    player.left(deltatime)
                if event.key == pygame.K_s:
                    player.down(deltatime)
                if event.key == pygame.K_d:
                    player.right(deltatime)
                if event.key == pygame.K_t:
                    tx = int(input('enter column: '))
                    ty = int(input('enter row: '))
                    player.rect.x = tx * 1000
                    player.rect.y = ty * 1000
                if event.key == pygame.K_p:
                    player.health -= 10
                    player.water -= 5
                    player.food -= 5
                if event.key == pygame.K_e and player.incar == True:
                    player.ExitCar(t)
                    incarlist.remove([0])
                    player.incar = False
                    print("Car exited")

            elif player.inbench:
                if player.benchmeter < .9:
                    if event.key == pygame.K_q:
                        if player.strength < 25:
                            player.benchfactor += 0.1
                            print(player.strength)
                            player.benchmeter += 0.1
                else:
                    time.sleep(1)
                    player.benchmeter = 0

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_w or event.key == pygame.K_s:
                player.stopy()
            if event.key == pygame.K_a or event.key == pygame.K_d:
                player.stopx()
            if event.key == pygame.K_e:
                player.action = False
            if event.key == pygame.K_q:
                if player.OpenInventory == False:
                    player.OpenInventory = True
                else:
                    player.OpenInventory = False
            if event.key == pygame.K_ESCAPE:
                pause_menu = True
            if event.key == pygame.K_e:
                player.action = True

        if event.type == pygame.MOUSEBUTTONUP:
            for o in otherpeoples:
                if o.rect.collidepoint(pygame.mouse.get_pos()):
                    selected.add(o)
                    inmenu = True

        if inmenu:
            for s in selected:
                for i in TalkMenu:
                    if i.rect.collidepoint(pygame.mouse.get_pos()):
                        print('doublecheck')
                        if event.type == pygame.MOUSEBUTTONUP:
                            jerry.friendmeter += 1
                            print(s.friendmeter)
            for i in TalkMenu:
                screen.blit(i.image, (s.rect.x, s.rect.y - 50))


while not done:
    screen.fill(GREY)
    if pause_menu == False:
        event_collector()
        if player.alive == True:
            print(player.rect.x, player.rect.y)
            if player.rect.right > 1000:
                diff = player.rect.right - 1000
                player.rect.right = 1000
                map.shiftworldx(-diff)

            if player.rect.left < 500:
                diff = 500 - player.rect.left
                player.rect.left = 500
                map.shiftworldx(diff)

            if player.rect.bottom > 400:
                diff = player.rect.bottom - 400
                player.rect.bottom = 400
                map.shiftworldy(-diff)

            if player.rect.top < 200:
                diff = 200 - player.rect.top
                player.rect.top = 200
                map.shiftworldy(diff)


            map.buildings.draw(screen)
            map.home.draw(screen)
            map.gyms.draw(screen)
            map.roads.draw(screen)
            map.HP.draw(screen)
            for n in forest.NormalTreeses:
                screen.blit(n.image, (n.rect.x, n.rect.y))
            forest.FallenTrees.draw(screen)
            market.MarketBoothsSpawns.draw(screen)
            map.firestations.draw(screen)
            for o in otherpeoples:
                screen.blit(o.image, (o.rect.x, o.rect.y))
            #Minimap
            screen.blit(minimap.image, ((WIDTH1/100)-13, (HEIGHT1/100)-7))
            #HUD besides inv
            minimap.displayBuildings(screen, player)
            screen.blit(playICON.image, (100 * (player.rect.x / 10000), (player.rect.y / 10000) * 100))
            hbar.update(player, LGREEN)
            screen.blit(hback.image, (385, 0))
            screen.blit(hbar.image, (395, 10))
            screen.blit(FWback.image, (385, 20))
            fbar.update(player, RED)
            screen.blit(fbar.image, (395, 30))
            wbar.update(player, BLUE)
            screen.blit(wbar.image, (645, 30))
            #Inventory
            if player.OpenInventory == True:
                HUD.openInentory(WIDTH1, HEIGHT1, screen, player, 0, 1)
            else:
                screen.blit(pygame.image.load('Images/backpack1.png'), (WIDTH1 / 2 * 1.9, HEIGHT1 / 10 + 1 * 50 - 100))
            for i in player.inventory:
                i.AMMO.draw(screen)
                i.USED_AMMO.draw(screen)

            #treadmill
            if player.intread == True:
                player.rect.y += player.speed - 2
                if player.speed < 15.1:
                    player.speed += .01

            if player.insideFirestation == True:
                fswalls.draw(screen)
                fsbeds.draw(screen)
                fscountertops.draw(screen)
                fscouches.draw(screen)


            if player.insidehp == True:
                cwall = pygame.sprite.spritecollide(player, map.HP, False)
                locR = 5
                for c in cwall:
                    screen.blit(frontdesk.image, (c.rect.x + 1250, c.rect.y + 2500))
                    hpwalls.draw(screen)


            if player.insideHouse == True:
                wall = pygame.sprite.spritecollide(player, map.home, False)
                for w in wall:
                    x = w.rect.x + 375
                    y = w.rect.y + 400
                    cx = w.rect.x + 800
                    cy  = w.rect.y + 700
                    w.image = floor.image
                    screen.blit(couch.image, (x, y))
                    screen.blit(counter.image, (cx, cy))
                    if player.rect.x < w.rect.x:
                        player.rect.left = w.rect.left
                    if player.rect.x > w.rect.x + 850:
                        player.rect.right = w.rect.right
                    if player.rect.y < w.rect.y:
                        player.rect.top = w.rect.top


            if player.insidegym == True:
                gym_treadmills.draw(screen)
                gym_bench_press.draw(screen)
                tredcollideP1 = pygame.sprite.spritecollide(player, gym_treadmills, False)
                for t in tredcollideP1:
                    if player.intread == False:
                        if t.InUse == False:
                            if player.dx > 0:
                                player.rect.right = t.rect.left
                            elif player.dx < 0:
                                player.rect.left = t.rect.right
                            elif player.dy > 0:
                                player.rect.bottom = t.rect.top
                            elif player.dy < 0:
                                player.rect.x = t.rect.x + 37.5
                                player.rect.y = t.rect.y + 25
                                intreadlist.add(t)
                                player.intread = True
                                t.InUse = True

                if player.intread:
                    for i in intreadlist:
                        if player.rect.y > i.rect.y + 175:
                            print('sec')
                            i.InUse = False
                            intreadlist.empty()
                            player.intread = False

                benchcollideP1 = pygame.sprite.spritecollide(player, gym_bench_press, False)
                for b in benchcollideP1:
                    if player.inbench == False:
                        if b.InUse == False:
                            if player.dx > 0:
                                player.rect.right = b.rect.left
                            elif player.dx < 0:
                                player.rect.left = b.rect.right
                            elif player.dy > 0:
                                player.rect.bottom = b.rect.top
                            elif player.dy < 0:
                                if player.action == True:
                                    player.rect.x = b.rect.x + 37.5
                                    player.rect.y = b.rect.y + 25
                                    player.frozen = True
                                    player.inbench = True
                                    player.action = False
                                    b.InUse = True
                                else:
                                    player.rect.top = b.rect.bottom
                if player.inbench:
                    if player.action == True:
                        player.rect.x +=30
                        player.frozen = False
                        player.inbench = False


            incarlist.draw(screen)
            carlist.draw(screen)
            carlist.update(screen)
            player.update()

    elif pause_menu == True:
        message_display('RESUME', BLACK, HEIGHT1/3)
        message_display('FULLSCREEN', BLACK, HEIGHT1/3+45)
        message_display('QUIT GAME', BLACK, HEIGHT1/3+90)
        resume.rect.x = WIDTH1 / 2 - 100
        resume.rect.y = HEIGHT1 / 3 - 30
        fullscreenHitBox.rect.x = WIDTH1 / 2 - 132
        fullscreenHitBox.rect.y = HEIGHT1 / 3 + 18
        quit_game.rect.x = WIDTH1/2-117
        quit_game.rect.y = HEIGHT1/3+73
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            if resume.rect.collidepoint(pygame.mouse.get_pos()):
                if event.type == pygame.MOUSEBUTTONUP:
                    pause_menu = False
            if fullscreenHitBox.rect.collidepoint(pygame.mouse.get_pos()):
                if event.type == pygame.MOUSEBUTTONUP:
                    pygame.display.toggle_fullscreen()
            if quit_game.rect.collidepoint(pygame.mouse.get_pos()):
                if event.type == pygame.MOUSEBUTTONUP:
                    done = True
    mpx, mpy = pygame.mouse.get_pos()
    screen.blit(mousey.image, (mpx, mpy))
    pygame.display.update()
    pygame.display.flip()
    deltatime = clock.tick()/10
#    print (deltatime)
 #   print (fp1.matrix)
pygame.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...