1

だから私はタイルマップ(またはあなたの用語によってはセルマップ)を持っている簡単なゲームを作っています。問題は、約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