1

因此,我正在制作一个简单的游戏,其中有一个 tilemap(或 cellmap,具体取决于您的术语)。问题是:如果我有一张超过 100 个图块的地图,如果我在地图下移动大约一半,应用程序会将我移动到最后一行(意味着屏幕上的底行是最后一行),我不能再向上移动,但是水平移动没有问题。如果有人能告诉我我做错了什么以及为什么我正在做的事情对大约 100 块以上的任何东西都不起作用移动代码,我将非常感激。

这是显示我如何处理触摸事件的代码。如果您认为需要更多代码,请务必告诉我。

    @Override
public boolean onTouchEvent(MotionEvent event) {
    // touch down
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // new event
        _isMoving = false;
        // store coordinates
        _xTouch = (int) event.getX();
        _yTouch = (int) event.getY();

    } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
        _isMoving = true;

        // new offset
        _xOffSet += _xTouch - (int) event.getX();
        _yOffSet += _yTouch - (int) event.getY();

        // make sure it never goes out of bounds
        if (_xOffSet < 0) {
            _xOffSet = 0;
        } else if (_xOffSet > _mapSize * _cellSize - getWidth()) {
            _xOffSet = _mapSize * _cellSize - getWidth();
        }
        if (_yOffSet < 0) {
            _yOffSet = 0;
        } else if (_yOffSet > getHeight()) {
            _yOffSet = _mapSize * _cellSize - getHeight();
        }

        _xTouch = (int) event.getX();
        _yTouch = (int) event.getY();

        findMapEnds();

    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        // touch released
        if (!_isMoving) {
            int column = (int) FloatMath.ceil((_xOffSet + event.getX())
                    / _cellSize) - 1;
            int row = (int) FloatMath.ceil((_yOffSet + event.getY())
                    / _cellSize) - 1;
            Cell cell = _mapCells.get(row).get(column);

            Toast.makeText(getContext(), "Cell id #" + cell.get_id(),
                    Toast.LENGTH_SHORT).show();
        }
    }
    return true;
}

private void findMapEnds() {

    // finds the map end.
    _StartRow = _yOffSet / _cellSize;
    _MaxRow = (int) Math.min(_mapSize, _StartRow + Math.floor(getHeight())
            / _cellSize + 2);

    _StartCol = _xOffSet / _cellSize;
    _MaxCol = (int) Math.min(_mapSize, _StartCol + Math.floor(getWidth())
            / _cellSize + 2);

    _XScrollOffset = (int) (((_xOffSet / (float) _cellSize) - (_xOffSet / _cellSize)) * _cellSize);
    _YScrollOffset = (int) (((_yOffSet / (float) _cellSize) - (_yOffSet / _cellSize)) * _cellSize);
}
4

0 回答 0