When x is larger than 230, the circle is pushed to a position where part of it exceeds the screen width (320 pixels wide), specifically beyond the x value of 280 (since your circle has a diameter of 100 pixels, calculated from _r = 50, and its center is at x - _r + 4).
Sprites are typically clipped when drawn outside the screen area, meaning any part of the sprite that extends beyond the screen boundary will not be displayed.

To prevent the sprite from being truncated, you can implement a check to ensure that the sprite's position remains within the screen's boundaries before calling pushSprite.

Here’s an updated version of your code:

// Ensure the sprite stays within the screen's bounds x = (x > 270) ? 270 : x; // Adjust x to stay within the screen width uint32_t _r = r; // 50 uint32_t _w = _r * 2; uint32_t _h = _r * 2; TFT_eSprite _sprite = new TFT_eSprite(&M5.Lcd); _sprite.createSprite(_w, _h); _sprite.drawCircle(_r, _r, _r, _color); _sprite.drawCircle(_r, _r, _r - 1, _color); _sprite.fillCircle(_r, _r, _r - 2, _colorCircle); // Push sprite only within the screen's bounds _sprite.pushSprite(x - _r + 4, y - _r + 4); _sprite.deleteSprite();