I am fairly confident with Python, and am now turning my focus from learning how to program the language to learning to program it well. I am wondering what the best way to approch classes which have too many variables in them.
I an writing a platformer game, and, though it works fine, I am trying to clean up the code. My
Player class is especially messy.
Here is an example:
class Player(obj.PhySprite): warp = None #this stores the function to change levels. It should take the #same arguments as the Level class #counters: shards = 0 #shards collected points = 0 lives = 5 #charictaristics: IS_PLAYER = True FALLS = True MOVES = True IS_ITEM = True entrance_coords = None #the normal coords when the player entered the #portal to the level. When he dies/wins he is #returned to this location. #constants: CLIMB_VEL = 1.25 #how fast he climbs up/down/left/right WALK_ACCEL = .1 #how fast he normally accelerates RUN_ACCEL = .02 #how fast he accelerates when running or dashing DECREST_ACCEL = .4 #when the jump key is releaced this is added to #gravity until he stops going up and starts #falling DEACCEL = .4 #when slowing down or turning this is additional accel MAX_WALK = 1 #max walking speed MAX_RUN = 2.95 #max running speed MAX_DASH = 3 #max dashing speed MAX_VEL = 5 #max overall speed MAX_CAPED_FALL = .5 MAX_DRIFTING_CAPE_FALL = 1 ASCENDING_TIME = 30 ASCENDING_VEL = 8 MAX_FALL = MAX_VEL #max falling speed MAX_TWIRL = 25 JUMP_VEL = 5.7 #the up velocity given when jump key is pressed SPIN_JUMP_VEL = 5 #the up velocity given when jump key is pressed TAP_JUMP_VEL = 4 #the up velocity given when spin jump onto something #tappable when not holding spin key. RUN_JUMPVEL_RATIO = 1/2.8 #this times abs(horz speed) is added to #initial jump velocity #state: is_small = True #Powered up and tall or small? is_caped = False #Has a cape? run_button = False #is run button being held? Used to find when it #it is first pressed grounded = False #player's feet touching ground. standing_on = None #the object the player's feet is touching climbing = False #on ladder and holding on fell_off = False #fell off the ladder. can_jump = False #is able to jump (on ground or ladder and not holding #jump key from previouse jump) skidding = False #turning one direction with momentum in another #direction turning = False #facing the screen after skidding. ascending = False ascending_counter = 0 glide_dashed = False gliding = False twirling = False twirling_counter = 0 direction = 1 #direction of motion -1 is left 1 is right frame = 0 #framecounter for animations spin_jump = False #spin jumping fainting = False faint_timer = 0 blinking = False blink_timer = 0 holding = None #item player is holding. kicking = 0 #timer for holding out player's foot when kicking. destroyed = 0 #keeps track of combo kills pocket = None #contents of player's pocket falling_item = None won = False #Got the shard winning_number = None #The shard player got won_frame = 0 won_timer = -15 final_explosion = None holding_up = False #has the player been holding the up key. #Used to detect if he should go though a portal or just #walked by one while holding the up key. def __init__(self): ... code, code, code ...
As you can see, most of these are just counters, timers, constants, and flags. How is the most pythonic way to sort them? The way it is now is rather confusing. I have thought about breaking off chunks of variables into classes just meant to store them, but I don't think that is the best way.
What is generally good practise for this?