@@ -189,6 +189,7 @@ Player::Player(PlayerStatus& player_status, const std::string& name_) :
189
189
m_visible(true ),
190
190
m_grabbed_object(nullptr ),
191
191
m_grabbed_object_remove_listener(new GrabListener(*this )),
192
+ m_released_object(false ),
192
193
// if/when we have complete penny gfx, we can
193
194
// load those instead of Tux's sprite in the
194
195
// constructor
@@ -1135,9 +1136,12 @@ Player::handle_input()
1135
1136
/* Handle vertical movement: */
1136
1137
if (!m_stone && !m_swimming) handle_vertical_input ();
1137
1138
1139
+ /* grabbing */
1140
+ bool just_grabbed = try_grab ();
1141
+
1138
1142
/* Shoot! */
1139
1143
auto active_bullets = Sector::get ().get_object_count <Bullet>();
1140
- if (m_controller->pressed (Control::ACTION) && (m_player_status.bonus == FIRE_BONUS || m_player_status.bonus == ICE_BONUS)) {
1144
+ if (m_controller->pressed (Control::ACTION) && (m_player_status.bonus == FIRE_BONUS || m_player_status.bonus == ICE_BONUS) && !m_grabbed_object ) {
1141
1145
if ((m_player_status.bonus == FIRE_BONUS &&
1142
1146
active_bullets < m_player_status.max_fire_bullets ) ||
1143
1147
(m_player_status.bonus == ICE_BONUS &&
@@ -1200,10 +1204,9 @@ Player::handle_input()
1200
1204
do_standup (false );
1201
1205
}
1202
1206
1203
- /* grabbing */
1204
- try_grab ();
1205
-
1206
- if (!m_controller->hold (Control::ACTION) && m_grabbed_object) {
1207
+ /* Drop grabbed object when releasing the Action button on keyboard or gamepad, and on the second button press when using touchscreen */
1208
+ if ((m_controller->is_touchscreen () ? m_controller->pressed (Control::ACTION) : !m_controller->hold (Control::ACTION)) &&
1209
+ m_grabbed_object && !just_grabbed) {
1207
1210
auto moving_object = dynamic_cast <MovingObject*> (m_grabbed_object);
1208
1211
if (moving_object) {
1209
1212
// move the grabbed object a bit away from tux
@@ -1256,12 +1259,17 @@ Player::handle_input()
1256
1259
}
1257
1260
moving_object->del_remove_listener (m_grabbed_object_remove_listener.get ());
1258
1261
m_grabbed_object = nullptr ;
1262
+ m_released_object = true ;
1259
1263
}
1260
1264
} else {
1261
1265
log_debug << " Non MovingObject grabbed?!?" << std::endl;
1262
1266
}
1263
1267
}
1264
1268
1269
+ if (!m_controller->hold (Control::ACTION) && m_released_object) {
1270
+ m_released_object = false ;
1271
+ }
1272
+
1265
1273
/* stop backflipping at will */
1266
1274
if ( m_backflipping && ( !m_controller->hold (Control::JUMP) && !m_backflip_timer.started ()) ){
1267
1275
stop_backflipping ();
@@ -1293,10 +1301,10 @@ Player::position_grabbed_object()
1293
1301
}
1294
1302
}
1295
1303
1296
- void
1304
+ bool
1297
1305
Player::try_grab ()
1298
1306
{
1299
- if (m_controller->hold (Control::ACTION) && !m_grabbed_object && !m_duck)
1307
+ if (m_controller->hold (Control::ACTION) && !m_grabbed_object && !m_duck && !m_released_object )
1300
1308
{
1301
1309
1302
1310
Vector pos (0 .0f , 0 .0f );
@@ -1335,11 +1343,12 @@ Player::try_grab()
1335
1343
moving_object.add_remove_listener (m_grabbed_object_remove_listener.get ());
1336
1344
1337
1345
position_grabbed_object ();
1338
- break ;
1346
+ return true ;
1339
1347
}
1340
1348
}
1341
1349
}
1342
1350
}
1351
+ return false ;
1343
1352
}
1344
1353
1345
1354
void
0 commit comments