我的平台图像冲突问题如何解决? [英] My Collision With My Platform Images Problem How To Fix?
问题描述
问题是,当我与我的平台发生碰撞时,它似乎让我比平台更高对我所有的平台都这样做,我知道为什么
the problem is that when I collide with my platform it seems to put me way higher then the platform it does this for all my platforms and idk why
我的平台碰撞
for enemy in enemies:
if playerman.rect.colliderect(enemy.rect):
collide = True
playerman.y = enemy.rect.top - playerman.height + 1
if playerman.rect.right > enemy.rect.left and playerman.rect.left < enemy.rect.left - playerman.width:
playerman.x = enemy.rect.left - player.width
if playerman.rect.left < enemy.rect.right and playerman.rect.right > enemy.rect.right + playerman.width:
playerman.x = enemy.rect.right
我的完整代码
# import module
import pygame
pygame.init()
# window
window = pygame.display.set_mode((500,470))
pygame.display.set_caption("YELOLL")
background = pygame.image.load("bg.jpg")
left_image = pygame.image.load("Sprite-0003.png")
right_image = pygame.image.load("Sprite-0002.png")
Right_Coins = pygame.image.load("Coin.png")
platforms = pygame.image.load("rat.png")
def Redraw():
window.blit(background, (0,0))
# draw the player
class player:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.isJump = False
self.JumpCount = 10
self.fall = 0
self.left_image = False
self.right_image = False
self.speed = 5
self.color = color
self.rect = pygame.Rect(x,y,height,width)
self.left_image = pygame.image.load("Sprite-0002.png")
self.right_image = pygame.image.load("Sprite-0003.png")
self.left_image = pygame.transform.scale(self.left_image,(self.left_image.get_width()//1,self.left_image.get_height()//1))
self.right_image = pygame.transform.scale(self.right_image,(self.right_image.get_width()//1,self.right_image.get_height()//1))
...
self.rect = pygame.Rect(x,y,left_image.get_width(), left_image.get_height())
self.direction = "left" #set a stating direction
def draw(self):
self.rect.topleft = (self.x,self.y)
if self.direction == "left":
window.blit(self.left_image,self.rect)
else:
window.blit(self.right_image,self.rect)
# enemy
class enemy:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.color = color
self.rect = pygame.Rect(x,y,height,width)
self.platforms = pygame.image.load("rat.png")
self.platforms = pygame.transform.scale(self.platforms,(self.platforms.get_width()//2,self.platforms.get_height()//2))
self.rect = pygame.Rect(x,y,platforms.get_width(), platforms.get_height())
self.direction = "left" #set a stating direction
def draw(self):
self.rect.topleft = (self.x,self.y)
window.blit(self.platforms,self.rect)
# coins
class coin:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.color = color
self.rect = pygame.Rect(x,y,height,width)
self.Right_Coins = pygame.image.load("Coin.png")
self.Right_Coins = pygame.transform.scale(self.Right_Coins,(self.Right_Coins.get_width()//2,self.Right_Coins.get_height()//2))
self.rect = pygame.Rect(x,y,Right_Coins.get_width(), Right_Coins.get_height())
self.direction = "left" #set a stating direction
def draw(self):
self.rect.topleft = (self.x,self.y)
window.blit(self.Right_Coins,self.rect)
class botts:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.color = color
self.height = height
self.width = width
self.rect = pygame.Rect(x,y,height,width)
def draw(self):
self.rect.topleft = (self.x,self.y)
pygame.draw.rect(window, self.color, self.rect)
font = pygame.font.Font('freesansbold.ttf', 32)
score = 0
text = font.render('Score = ' + str(score), True, (255,255,255))
textRect = text.get_rect()
textRect.center = (100, 40)
# FPS
FPS = 60
clock = pygame.time.Clock()
# colors
Green = (0,255,2)
white = (255,255,255)
Yellow = (248,255,0)
Blue = (0,255,201)
# define player and enemy
playerman = player(50,390,30,30, Blue)
enemy1 = enemy(180,390,150,10, Green)
enemy2 = enemy(300,290,150,10, Green)
enemy3 = enemy(70,250,150,10, Green)
enemy4 = botts(-10000,490,150000,50, white)
teleport = enemy(390,390,40,80, white)
enemies = [enemy1,enemy2,enemy3,enemy4]
# define coins
coin1 = coin(230,370,10,10, Yellow)
coin2 = coin(350,270,10,10, Yellow)
coin3 = coin(150,230,10,10, Yellow)
coin4 = coin(250,450,10,10, Yellow)
Coins_list = [coin1,coin2,coin3,coin4,teleport]
# main loop
runninggame = True
while runninggame:
for event in pygame.event.get():
if event.type == pygame.QUIT:
runninggame = False
Redraw()
clock.tick(FPS)
teleport.draw()
window.blit(text,textRect)
playerman.draw()
for enemy in enemies:
enemy.draw()
for coin in Coins_list:
coin.draw()
if playerman.y < 250:
playerman.y += 1
for enemy in enemies:
enemy.y += playerman.speed
for coin in Coins_list:
coin.y += playerman.speed
if playerman.y > 450:
playerman.y -= playerman.fall
for enemy in enemies:
enemy.y -= playerman.fall
for coin in Coins_list:
coin.y -= playerman.fall
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
playerman.direction = "left"
playerman.x -= playerman.speed
if playerman.x < 100:
playerman.x += playerman.speed
for enemy in enemies:
enemy.x += playerman.speed
for coin in Coins_list:
coin.x += playerman.speed
if keys[pygame.K_RIGHT]:
playerman.direction = "right"
playerman.x += playerman.speed
if playerman.x > 450:
playerman.x -= playerman.speed
for enemy in enemies:
enemy.x -= playerman.speed
for coin in Coins_list:
coin.x -= playerman.speed
if not playerman.isJump:
playerman.y += playerman.fall
playerman.fall += 1
collide = False
for enemy in enemies:
if playerman.rect.colliderect(enemy.rect):
collide = True
playerman.y = enemy.rect.top - playerman.height + 1
if playerman.rect.right > enemy.rect.left and playerman.rect.left < enemy.rect.left - playerman.width:
playerman.x = enemy.rect.left - player.width
if playerman.rect.left < enemy.rect.right and playerman.rect.right > enemy.rect.right + playerman.width:
playerman.x = enemy.rect.right
for i in range(len(Coins_list)-1,-1,-1):
if playerman.rect.colliderect(Coins_list[i].rect):
del Coins_list[i]
score += 1
text = font.render('Score = ' + str(score), True, (255,255,255))
textRect = text.get_rect()
textRect.center = (100,40)
if playerman.rect.colliderect(teleport.rect):
for enemy in enemies:
if playerman.rect.centerx:
playerman.x = 50
playerman.y = 150
if playerman.rect.bottom >= 500:
collide = True
playerman.isJump = False
playerman.JumpCount = 10
playerman.y = 500 - playerman.height
if collide:
if keys[pygame.K_SPACE]:
playerman.isJump = True
playerman.fall = 0
else:
if playerman.JumpCount > 0:
playerman.y -= (playerman.JumpCount*abs(playerman.JumpCount))*0.4
playerman.JumpCount -= 1
else:
playerman.isJump = False
playerman.JumpCount = 10
pygame.display.update()
pygame.quit()
推荐答案
问题隐藏在 Platform
类中,因为 self.platforms
和 不一样代码>平台代码>.
):
注意 self.platforms
被缩放到它的一半大小,因此你在设置矩形时必须使用 self.platforms
而不是 platform
(<代码>self.rect
The issue is hidden in the class Platform
, because self.platforms
is not the same as platform
.
Note self.platforms
is scaled to its half size, thus you have to use self.platforms
rather than platform
when you setup the rectangle (self.rect
):
self.rect = pygame.Rect(x,y,platforms.get_width(),platforms.get_height())
self.rect = pygame.Rect(x,y, self.platforms.get_width(), self.platforms.get_height())
无论如何,我建议通过 get_rect()
获取矩形:
Anyway, I recommend to get the rectangle by get_rect()
:
self.rect = self.platforms.get_rect(topleft = (x, y))
class Paltform
:
class enemy:
def __init__(self,x,y,height,width,color):
self.x = x
self.y = y
self.height = height
self.width = width
self.color = color
self.rect = pygame.Rect(x,y,height,width)
self.platforms = pygame.image.load("rat.png")
self.platforms = pygame.transform.scale(self.platforms,(self.platforms.get_width()//2,self.platforms.get_height()//2))
self.rect = self.platforms.get_rect(topleft = (x, y)) # <---
self.direction = "left" #set a stating direction
如果图像的顶部不是可击中,例如散布草,则您必须将击中框缩小草的高度.
向 enemy
类添加一个方法,该方法返回命中框:
If the top of the image is not hittable, like spread grass, the you have to shrink the hitbox by the height of the grass.
Add a method to the class enemy
, which returns the hitbox:
class enemy:
# [...]
def get_hitbox(self):
grass_height = 25
hitboxb = self.rect
hitboxb.top += grass_height
return hitboxb
class botts:
# [...]
def get_hitbox(self):
return self.rect
使用碰撞框进行碰撞检测:
Use the hit box for the collision detection:
for enemy in enemies:
enemy_hitbox = enemy.get_hitbox()
if playerman.rect.colliderect(enemy_hitbox):
collide = True
playerman.y = enemy_hitbox.top - playerman.height + 1
# [...]
这篇关于我的平台图像冲突问题如何解决?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!