Pygame collision handling












0














I made a 2D platformer game with pygame. I am struggling to figure out how to determine the direction an object is moving in.



For example: say the player is coming from above since his y velocity is greater than zero, then the problems are that his gravitation is acting on him constantly; this means that if he comes from the left side, his y velocity is greater than zero (so this if statement will get triggered even though I want the left-side-if statement to get triggered).



The source code for this is the following: `



if self.hits:
for platform in self.hits:

if self.player.vel.y > 0:
self.player.rect.y = platform.rect.top
self.player.vel.y = 0

if self.player.vel.y < 0:
self.player.rect.top = platform.rect.bottom
self.player.vel.y = 0

if self.player.vel.x > 0:
self.player.rect.right = platform.rect.left

if self.player.vel.y < 0:
self.player.rect.left = platform.rect.right


That is why I created some limitations for the recognition of each four directions: `



if self.hits:
for platform in self.hits:

if self.player.rect.bottom >= (platform.rect.top) and self.player.rect.bottom <= (platform.rect.top + 16)
and (self.player.rect.centerx + 13) >= platform.rect.left and (self.player.rect.centerx - 13) <= platform.rect.right:
self.player.pos_bottom.y = platform.rect.top
self.player.vel.y = 0

elif self.player.rect.top <= (platform.rect.bottom) and self.player.rect.top >= (platform.rect.bottom - 16)
and (self.player.rect.centerx + 13) >= platform.rect.left and (self.player.rect.centerx - 13) <= platform.rect.right:
self.player.rect.top = platform.rect.bottom
self.player.vel.y = 0

elif self.player.rect.right >= (platform.rect.left) and self.player.rect.right <= (platform.rect.right + 10) and self.player.vel.x >= 0
and self.player.rect.centery >= platform.rect.top and self.player.rect.centery <= platform.rect.bottom:
self.player.rect.right = platform.rect.left
self.player.vel.x = 0

elif self.player.rect.left <= (platform.rect.right) and self.player.rect.left >= (platform.rect.right - 10) and self.player.vel.x <= 0
and self.player.rect.centery >= platform.rect.top and self.player.rect.centery <= platform.rect.bottom:
self.player.rect.left = platform.rect.right
self.player.vel.x = 0`


This code limitates the zone in which the players direction is getting recognized, but brings a lot of bugs with it and is also really ugly.










share|improve this question
























  • Take a look at this question/answer. See how the collision detection is done in two steps: first for the x axis, then the y axis. This works quite well.
    – sloth
    Nov 13 '18 at 6:41










  • thank you that really helped me
    – Che Guevara
    Nov 13 '18 at 12:14
















0














I made a 2D platformer game with pygame. I am struggling to figure out how to determine the direction an object is moving in.



For example: say the player is coming from above since his y velocity is greater than zero, then the problems are that his gravitation is acting on him constantly; this means that if he comes from the left side, his y velocity is greater than zero (so this if statement will get triggered even though I want the left-side-if statement to get triggered).



The source code for this is the following: `



if self.hits:
for platform in self.hits:

if self.player.vel.y > 0:
self.player.rect.y = platform.rect.top
self.player.vel.y = 0

if self.player.vel.y < 0:
self.player.rect.top = platform.rect.bottom
self.player.vel.y = 0

if self.player.vel.x > 0:
self.player.rect.right = platform.rect.left

if self.player.vel.y < 0:
self.player.rect.left = platform.rect.right


That is why I created some limitations for the recognition of each four directions: `



if self.hits:
for platform in self.hits:

if self.player.rect.bottom >= (platform.rect.top) and self.player.rect.bottom <= (platform.rect.top + 16)
and (self.player.rect.centerx + 13) >= platform.rect.left and (self.player.rect.centerx - 13) <= platform.rect.right:
self.player.pos_bottom.y = platform.rect.top
self.player.vel.y = 0

elif self.player.rect.top <= (platform.rect.bottom) and self.player.rect.top >= (platform.rect.bottom - 16)
and (self.player.rect.centerx + 13) >= platform.rect.left and (self.player.rect.centerx - 13) <= platform.rect.right:
self.player.rect.top = platform.rect.bottom
self.player.vel.y = 0

elif self.player.rect.right >= (platform.rect.left) and self.player.rect.right <= (platform.rect.right + 10) and self.player.vel.x >= 0
and self.player.rect.centery >= platform.rect.top and self.player.rect.centery <= platform.rect.bottom:
self.player.rect.right = platform.rect.left
self.player.vel.x = 0

elif self.player.rect.left <= (platform.rect.right) and self.player.rect.left >= (platform.rect.right - 10) and self.player.vel.x <= 0
and self.player.rect.centery >= platform.rect.top and self.player.rect.centery <= platform.rect.bottom:
self.player.rect.left = platform.rect.right
self.player.vel.x = 0`


This code limitates the zone in which the players direction is getting recognized, but brings a lot of bugs with it and is also really ugly.










share|improve this question
























  • Take a look at this question/answer. See how the collision detection is done in two steps: first for the x axis, then the y axis. This works quite well.
    – sloth
    Nov 13 '18 at 6:41










  • thank you that really helped me
    – Che Guevara
    Nov 13 '18 at 12:14














0












0








0







I made a 2D platformer game with pygame. I am struggling to figure out how to determine the direction an object is moving in.



For example: say the player is coming from above since his y velocity is greater than zero, then the problems are that his gravitation is acting on him constantly; this means that if he comes from the left side, his y velocity is greater than zero (so this if statement will get triggered even though I want the left-side-if statement to get triggered).



The source code for this is the following: `



if self.hits:
for platform in self.hits:

if self.player.vel.y > 0:
self.player.rect.y = platform.rect.top
self.player.vel.y = 0

if self.player.vel.y < 0:
self.player.rect.top = platform.rect.bottom
self.player.vel.y = 0

if self.player.vel.x > 0:
self.player.rect.right = platform.rect.left

if self.player.vel.y < 0:
self.player.rect.left = platform.rect.right


That is why I created some limitations for the recognition of each four directions: `



if self.hits:
for platform in self.hits:

if self.player.rect.bottom >= (platform.rect.top) and self.player.rect.bottom <= (platform.rect.top + 16)
and (self.player.rect.centerx + 13) >= platform.rect.left and (self.player.rect.centerx - 13) <= platform.rect.right:
self.player.pos_bottom.y = platform.rect.top
self.player.vel.y = 0

elif self.player.rect.top <= (platform.rect.bottom) and self.player.rect.top >= (platform.rect.bottom - 16)
and (self.player.rect.centerx + 13) >= platform.rect.left and (self.player.rect.centerx - 13) <= platform.rect.right:
self.player.rect.top = platform.rect.bottom
self.player.vel.y = 0

elif self.player.rect.right >= (platform.rect.left) and self.player.rect.right <= (platform.rect.right + 10) and self.player.vel.x >= 0
and self.player.rect.centery >= platform.rect.top and self.player.rect.centery <= platform.rect.bottom:
self.player.rect.right = platform.rect.left
self.player.vel.x = 0

elif self.player.rect.left <= (platform.rect.right) and self.player.rect.left >= (platform.rect.right - 10) and self.player.vel.x <= 0
and self.player.rect.centery >= platform.rect.top and self.player.rect.centery <= platform.rect.bottom:
self.player.rect.left = platform.rect.right
self.player.vel.x = 0`


This code limitates the zone in which the players direction is getting recognized, but brings a lot of bugs with it and is also really ugly.










share|improve this question















I made a 2D platformer game with pygame. I am struggling to figure out how to determine the direction an object is moving in.



For example: say the player is coming from above since his y velocity is greater than zero, then the problems are that his gravitation is acting on him constantly; this means that if he comes from the left side, his y velocity is greater than zero (so this if statement will get triggered even though I want the left-side-if statement to get triggered).



The source code for this is the following: `



if self.hits:
for platform in self.hits:

if self.player.vel.y > 0:
self.player.rect.y = platform.rect.top
self.player.vel.y = 0

if self.player.vel.y < 0:
self.player.rect.top = platform.rect.bottom
self.player.vel.y = 0

if self.player.vel.x > 0:
self.player.rect.right = platform.rect.left

if self.player.vel.y < 0:
self.player.rect.left = platform.rect.right


That is why I created some limitations for the recognition of each four directions: `



if self.hits:
for platform in self.hits:

if self.player.rect.bottom >= (platform.rect.top) and self.player.rect.bottom <= (platform.rect.top + 16)
and (self.player.rect.centerx + 13) >= platform.rect.left and (self.player.rect.centerx - 13) <= platform.rect.right:
self.player.pos_bottom.y = platform.rect.top
self.player.vel.y = 0

elif self.player.rect.top <= (platform.rect.bottom) and self.player.rect.top >= (platform.rect.bottom - 16)
and (self.player.rect.centerx + 13) >= platform.rect.left and (self.player.rect.centerx - 13) <= platform.rect.right:
self.player.rect.top = platform.rect.bottom
self.player.vel.y = 0

elif self.player.rect.right >= (platform.rect.left) and self.player.rect.right <= (platform.rect.right + 10) and self.player.vel.x >= 0
and self.player.rect.centery >= platform.rect.top and self.player.rect.centery <= platform.rect.bottom:
self.player.rect.right = platform.rect.left
self.player.vel.x = 0

elif self.player.rect.left <= (platform.rect.right) and self.player.rect.left >= (platform.rect.right - 10) and self.player.vel.x <= 0
and self.player.rect.centery >= platform.rect.top and self.player.rect.centery <= platform.rect.bottom:
self.player.rect.left = platform.rect.right
self.player.vel.x = 0`


This code limitates the zone in which the players direction is getting recognized, but brings a lot of bugs with it and is also really ugly.







python pygame 2d collision






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 12 '18 at 22:15









martineau

66k989178




66k989178










asked Nov 12 '18 at 21:52









Che GuevaraChe Guevara

11




11












  • Take a look at this question/answer. See how the collision detection is done in two steps: first for the x axis, then the y axis. This works quite well.
    – sloth
    Nov 13 '18 at 6:41










  • thank you that really helped me
    – Che Guevara
    Nov 13 '18 at 12:14


















  • Take a look at this question/answer. See how the collision detection is done in two steps: first for the x axis, then the y axis. This works quite well.
    – sloth
    Nov 13 '18 at 6:41










  • thank you that really helped me
    – Che Guevara
    Nov 13 '18 at 12:14
















Take a look at this question/answer. See how the collision detection is done in two steps: first for the x axis, then the y axis. This works quite well.
– sloth
Nov 13 '18 at 6:41




Take a look at this question/answer. See how the collision detection is done in two steps: first for the x axis, then the y axis. This works quite well.
– sloth
Nov 13 '18 at 6:41












thank you that really helped me
– Che Guevara
Nov 13 '18 at 12:14




thank you that really helped me
– Che Guevara
Nov 13 '18 at 12:14












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270643%2fpygame-collision-handling%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270643%2fpygame-collision-handling%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

Xamarin.form Move up view when keyboard appear

Post-Redirect-Get with Spring WebFlux and Thymeleaf

Anylogic : not able to use stopDelay()