In my program, the w,a,s,d keys control movement. I can get either w+a or s+d to work, but not both.
Here is the input class:
[source lang="python"]class inputs: videomode = None l = False r = False u = False d = False run = True def getkeys(self): for event in pygame.event.get(): if event.type == pygame.QUIT: self.run = False keys = pygame.key.get_pressed() if keys[pygame.K_a]: self.l = True else: self.l = False if keys[pygame.K_w]: self.u = True else: self.u = False if keys[pygame.K_d]: self.r = True else: self.r = False if keys[pygame.K_s]: self.d = True else: self.d = False[/source]
Here is the input function in the game class (where i suspect the problem is):
[source lang="python"]def iupd(self): self.i.getkeys() if self.i.r: self.player.vx = self.player.speed else: self.player.vx = 0 if self.i.l: self.player.vx = -self.player.speed else: self.player.vx = 0 if self.i.d: self.player.vy = self.player.speed else: self.player.vy = 0 if self.i.u: self.player.vy = -self.player.speed else: self.player.vy = 0[/source]
I suspect that something's happening where the right and down get canceled out by the left and up, but I can't see how to correct this.
So I've started working on an extremely simple 2d tiled sidescrolling engine, using pygame (i know, but pretty much only for rendering + input). The problem is that the way that I've set up collision detection causes an object to stop moving in all directions when it hits another object. Here's the code for collision detection:
[source lang="python"]def checkcollision(ob1, ob2): if(ob1.x+ob1.w > ob2.x and ob1.x < ob2.x+ob2.w): if(ob1.y+ob1.h > ob2.y and ob1.y < ob2.y+ob2.h): return True else: return False else: return Falsedef collision(): for atile in mainarea.tiles: if(checkcollision(player,atile)): player.move(-player.vx, -player.vy) player.vx = 0 player.vy = 0[/source]
My question is, how can I implement collision detection that will only stop movement along one axis, but allow the other axis to keep moving (cause 'sliding' along walls instead of sticking)?
I apoligize if I'm asking in the wrong place, but it seems like a rather general question, and I didn't want to put this under physics, as I do not think it qualifies.