Pygame hitbox碰撞问题

时间:2016-12-10 12:02:17

标签: python pygame collision-detection

我正在使用Pygame制作2D平台游戏,我已经制作了一个代码来检测我的角色是否在场上。以下是坠落和碰撞检测的代码。

这是碰撞代码(在Hitbox类中):

Route::group(['domain' => 'my.domain.com'], function () {
    Route::get('/', 'UserDashboardController@index');
});
Route::group(['domain' => 'my.domain.us'], function () {
    Route::get('/', 'UserDashboardController@index');
});
Route::group(['domain' => 'my.domain.uk'], function () {
    Route::get('/', 'UserDashboardController@index');
});

Route::group(['domain' => 'store.domain.uk'], function () {
    Route::get('/', 'SimpleShopController@index');
});

这是下降的代码(在播放器类中):

def is_on_floor(self):
check_y = self.rect.y + self.rect.height
parent_y = self.rect.y - self.y_offset
collided = False
block_x, block_y,block_width,block_height = 0,0,0,0
points = [[self.rect.x, self.rect.y],
          [self.rect.x + self.rect.width, self.rect.y],
          [self.rect.x, self.rect.y + self.rect.height],
          [self.rect.x + self.rect.width, self.rect.y + self.rect.y]]
for obj in world:
    for point in points:
        if obj.hitbox.rect.x <= point[0] <= obj.hitbox.rect.x + obj.hitbox.rect.width and\
           obj.hitbox.rect.y <= point[1] <= obj.hitbox.rect.y + obj.hitbox.rect.height and\
           collided == False:
            block_x = obj.hitbox.rect.x
            block_y = obj.hitbox.rect.y
            block_width = obj.hitbox.rect.width
            block_height = obj.hitbox.rect.height
            collided = True
            break
    if collided:
        self.rect.y = block_y - self.rect.height
        parent_y = self.rect.y - self.y_offset
return parent_y, collided

问题是我的角色刚落地。但是,字符 站在一个凸起的块上,我将其添加到级别以进行测试。有谁知道我怎么解决它?

编辑: 为了添加新块,我正在创建块对象的副本。我试过这个:

def fall (self):
    self.y_speed += 0.4
    self.y_pos += self.y_speed
    self.hitbox.update(self.x_pos,self.y_pos)
    floor_check, collided = self.hitbox.is_on_floor()
    if collided:
        self.y_pos = floor_check
        self.can_jump = True
        self.y_speed = 0

但似乎当我更新块时(因此hitbox移动到它的位置),它会更新一个命中框,它似乎在块对象之间共享。我不明白的是我使用obj = copy.copy(self) obj.hitbox = copy.copy(self.hitbox) world.append(obj) 来复制hitbox,但由于某些原因,这似乎没有用。

1 个答案:

答案 0 :(得分:1)

我已经解决了我自己的问题:P似乎问题是实际在我制作hitbox的方式。要设置它,我输入x,y,width,height就好像它是一个矩形,但我的hitbox类实际上需要width,height,x_offset,y_offset。这意味着我不小心制作了hitboxes,不知何故有0宽度,0高度,并且偏移很多,这导致了奇怪的效果。