Я попытался сделать клон марио в pygame/python. по какой-то причине мой персонаж продолжает появляться сбоку. независимо от того, что я даю ему

avatar
Dashfast
6 августа 2021 в 08:13
54
1
2

Проблема в том, что я объявил self.rect.x=x, а в Марио функцию x=300, но когда я пытаюсь получить доступ к mario.draw, по какой-то причине Марио появляется в -35 в координатах x. Может кто-то помочь мне с этим? Мои прошлые коды работали с методом, который я использую, но теперь он просто не работает. Координата y тоже не работает. Он просто появляется в середине экрана.

Небольшое примечание: у меня была функция с именем draw, которая выводила на экран self.rect и self.image.

import pygame
from pygame.locals import *
import os
#Starting up the game
pygame.init()
clock=pygame.time.Clock()
#screen
SCREENWIDTH=800
SCREENHEIGHT=int(SCREENWIDTH*0.8)
screen=pygame.display.set_mode((SCREENWIDTH,SCREENHEIGHT))
pygame.display.set_caption("Mario")
#functions and classes
class Mario():
    def __init__(self,x,y,speed):
        """making my variables"""
        self.speed=speed
        self.in_air=False
        self.flip=False
        self.vel_y=0
        self.jump=False
        self.direction=1
        self.animation_list=[]
        self.action=0
        self.index=0
        animation_types=["idle","run"]
        temp_list=[]
        for animation in animation_types:
            temp_list=[]
            num_frames=len(os.listdir(f"Mario/img/{animation}"))
            for x in range(num_frames):
                img=pygame.image.load(f"Mario/img/{animation}/{x}.png").convert_alpha()
                img=pygame.transform.scale(img,(70,70))
                temp_list.append(img)
            self.animation_list.append(temp_list)
        self.image=self.animation_list[self.action][self.index]
        self.rect=self.image.get_rect()
        """ i specifically here say self.rect.x=x"""
        self.rect.x=x
        self.rect.y=y    
    pygame.display.update()
Источник
Iain Shelvington
6 августа 2021 в 08:17
3

for x in range(num_frames): переопределяет переменную x, вы должны использовать другую переменную для цикла

Dashfast
6 августа 2021 в 08:40
0

ты имеешь в виду, что я должен использовать i вместо x?

Iain Shelvington
6 августа 2021 в 08:42
1

Да, или даже что-то вроде "frame_num" или "frame_index" было бы красиво и описательно.

Ответы (1)

avatar
Eladtopaz
9 августа 2021 в 06:46
0

Как уже было сказано, когда вы сделали:

for x in range(num_frames):

вы взяли x как переменную в функции def __init__(self,x,y,speed) и изменили ее на основе результата, который даст вам range(num_frames). Всегда так работает for loop. если есть переменная, он изменит ее, и изменение продолжится после цикла. если переменной нет, будет создана новая.

Вы можете поместить эти две строки:

self.rect.x=x
self.rect.y=y

перед for loop, который меняет x, или вы можете просто использовать другую переменную в loop вместо x.