SDL框架实现游戏重力时setY调用报错及后续左值问题求助
问题分析与修复方案
1. Player类Setter方法的致命错误
你的Player类里所有Setter方法都没有正确修改私有成员变量,比如setY(int y)里写的y = y;,这里的y是函数参数,等于把参数赋值给自己,完全没触碰到类里的私有成员y。同时getOnFloor()的返回类型是int,但私有成员onFloor是bool,类型不匹配会导致逻辑异常。
修正后的Player.h关键代码:
//Y Setter void setY(int y) { this->y = y; // 用this->区分成员变量与函数参数 } //Y Getter int getY() { return y; } //OnFloor Setter void setOnFloor(bool onFloor) { // 参数类型改为bool,匹配成员变量 this->onFloor = onFloor; } //OnFloor Getter bool getOnFloor() { // 返回类型改为bool return onFloor; }
其他Setter(setX、setHeight等)也需要做同样修改,添加this->确保修改的是类的私有成员变量。
2. 正确调用Setter方法
setY是成员函数,不是变量,不能用player->setY = 0或player->setY() -=1这类错误写法,必须通过传参调用的方式使用。
另外注意:SDL坐标系中Y轴正方向是向下的,要实现玩家向下掉落,应该给Y值加重力值,之前玩家向上掉落就是因为错误地减少了Y值。
修正后的GameScene.cpp的update函数:
void GameScene::update() { Scene::update(); if (!player->getOnFloor()) { // 用!直接取反,写法更简洁 // 先获取当前Y值,加上重力强度(这里用1作为基础值),再通过Setter设置回去 int currentY = player->getY(); player->setY(currentY + 1); } // 除非你需要强制玩家站在Y=0位置,否则不需要else分支设置Y=0,保留地板碰撞后的Y值即可 }
3. 解决"expression must be a modifiable lvalue"错误
你之前写的player->setY(player->getY() -= 1)报错,是因为getY()返回的是临时int值,不是可修改的左值(lvalue)。正确做法是先将当前Y值存入变量,修改后再传给Setter,就像上面代码里的写法。
额外优化建议
- 可以给Player类添加
velocityY成员变量模拟重力加速度,让下落更真实:// Player.h私有成员新增 int velocityY; // Player::start()中初始化 velocityY = 0; // Player::update()中修改逻辑 if (!onFloor) { velocityY += 1; // 每秒增加下落速度,模拟重力加速度 setY(getY() + velocityY); } else { velocityY = 0; // 落地后重置速度 } - 必须补充玩家与地板的碰撞检测逻辑,当玩家接触地板时将
onFloor设为true,离开时设为false,否则重力逻辑不会正常触发。
内容的提问来源于stack exchange,提问作者BlasterMaster
相关产品推荐
相关产品推荐

