tBane Temat założony przez niniejszego użytkownika |
[Java libGDX] Jak poprawnie przetwarzać eventy dotyku? » 2025-12-18 12:25:57 Cześć. Problem z kodem mam taki, że podczas gry nie program wykrywa wszystkich kliknięć (TouchDown). Może problemem jest to, że brak kolejki eventów? Jak sądzicie? Poniżej zamieszczam kod jaki mam. (ChatGPT mi nie pomógł) :-/ Co dziwne - w Emulatorze Android Studio problem nie występuje (pewnie chodzi o multitouch). Pomożecie? Może być też jak wyłączyć multitouch w apce - też chyba pomoże. package com.tbane.mysticgems.MyInput;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputAdapter; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.Array; import com.tbane.mysticgems.Renderer;
public class MyInputProcessor extends InputAdapter { private OrthographicCamera camera;
private boolean touchBegan = false; private boolean touchEnded = false; private boolean touchMoved = false; private Vector3 lastTouchPos = new Vector3(); private boolean backPressed = false;
public MyInputProcessor(OrthographicCamera camera) { this.camera = camera; }
@Override public boolean keyDown(int keycode) {
if (keycode == Input.Keys.BACK || keycode == Input.Keys.ESCAPE) { backPressed = true; return true; }
return false; }
@Override public boolean touchDown(int screenX, int screenY, int pointer, int button) {
camera.unproject(lastTouchPos.set(screenX, screenY, 0)); touchBegan = true; touchMoved = false; touchEnded = false; return true; }
@Override public boolean touchUp(int screenX, int screenY, int pointer, int button) {
camera.unproject(lastTouchPos.set(screenX, screenY, 0)); touchEnded = true; touchBegan = false; touchMoved = false; return true; }
@Override public boolean touchDragged(int screenX, int screenY, int pointer) {
camera.unproject(lastTouchPos.set(screenX, screenY, 0)); touchMoved = true; touchBegan = false; touchEnded = false; return true; } public void setBackPressed() { backPressed = true; }
public boolean isTouchBegan() { return touchBegan; } public boolean isTouchEnded() { return touchEnded; } public boolean isTouchMoved() { return touchMoved; } public boolean isBackPressed() { return backPressed; }
public Vector3 getTouchPosition() { return lastTouchPos.cpy(); } public float getTouchX() { float normalizedX = (lastTouchPos.x + 1f) * 0.5f; // 0..1 float scale = Math.min( (float)Gdx.graphics.getWidth() / Renderer.VIRTUAL_WIDTH, (float)Gdx.graphics.getHeight() / Renderer.VIRTUAL_HEIGHT ); float offsetX = (Gdx.graphics.getWidth() - Renderer.VIRTUAL_WIDTH * scale) * 0.5f; return (normalizedX * Gdx.graphics.getWidth() - offsetX) / scale; }
public float getTouchY() { float normalizedY = (lastTouchPos.y + 1f) * 0.5f; // 0..1 float scale = Math.min( (float)Gdx.graphics.getWidth() / Renderer.VIRTUAL_WIDTH, (float)Gdx.graphics.getHeight() / Renderer.VIRTUAL_HEIGHT ); float offsetY = (Gdx.graphics.getHeight() - Renderer.VIRTUAL_HEIGHT * scale) * 0.5f; return (normalizedY * Gdx.graphics.getHeight() - offsetY) / scale; }
public void reset() { touchBegan = false; touchEnded = false; touchMoved = false; backPressed = false; } }
|
|
DejaVu |
» 2025-12-18 13:31:03 Ty masz jakiegoś ułomnego chata czy co, że nie rozwiązuje Ci problemów? :) |
|
skovv |
» 2025-12-18 14:28:09 Tu chyba nie chodzi o ułomnego chata tylko o to, że nie wiem.. nie chce Ci się stary pogłówkować dobrze czy coś? Z programowaniem jest tak, że niestety to sport typowo do główkowania i chyba o to w tym chodzi a jak patrzę na forum to wygląda ono jak twój dziennik haha :D Ogółem jak coś nie działa to napisz sobie osobno prostą apke która robi tylko to co chcesz by działało. Jak zadziała to porównaj z tym co masz w głównej apce, przenieś/popraw i z głowy :) Jak nie działa dalej to główkuj dalej, cenna nauka! |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-12-19 00:05:04 Zrezygnowałem z subskrypcji więc jakość odpowiedzi spadła :-/ dotyk działa dobrze w menu głównym a nie działa w grze. Nie wiem co może być tego powodem. Dlatego piszę. Pierwszy raz pracuję z telefonem i wolę spytać się ekspertów jak coś zrobić, niż zrobić źle.
Jutro jeszcze do tego przysiądę, ale wątpię bym sam rozwiązał ten problem :-/ |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-12-19 00:22:08 Zauważyłem też że touchEnded działa a touchBegan już nie |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-12-19 06:22:42 Jest git. miałem lagi po prostu i dlatego źle wczytywało eventy dotyku. Dodałem optymalizację, żeby tylko widoczne gemy renderowało i jest już wszystko ok... Chyba muszę sobie zrobić przerwę od programowania bo ostatnio słabo mi to idzie :-/ for(Gem gem : _gems){ Rectangle rect = new Rectangle( gem.realPosition.x - Gem.size.x / 2f, gem.realPosition.y - Gem.size.y / 2f, Gem.size.x, Gem.size.y ); if(rect.overlaps(_gameBoardRect)) gem.draw();
}
|
|
skovv |
» 2025-12-19 06:36:17 AA widzisz, różne dziwne przyczyny są tego - ciężko wpaść na to że to lag, nie pomyślał bym o tym. Chat gpt ogółem jest głupi, spróbuj deepseek.com + zaznaczaj kunzeby dobrze przemyślał odpowiedź, potrafi być dużo lepszy |
|
tBane Temat założony przez niniejszego użytkownika |
» 2025-12-19 06:42:50 Mam nauczkę na przyszłość - zawsze śledzić FPS bez względu na to czy mają być renderowane w grze. Później będę testował różne opcje renderingu żeby poprawić jeszcze FPS jaak będzie ich mało |
|
| « 1 » |