Hopefully fixed bug that touch-detection is sometimes very slow

This commit is contained in:
2018-06-22 17:07:56 +02:00
parent b28877e08e
commit 1010ddf46d
36 changed files with 476 additions and 761 deletions

View File

@ -8,6 +8,7 @@ import android.content.res.Configuration;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;

View File

@ -2,8 +2,8 @@ package de.frajul.endlessroll.main;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;
import de.frajul.endlessroll.rendering.Rendering;
import de.frajul.endlessroll.rendering.renderer.GameRenderer;
/**
@ -13,20 +13,21 @@ public class MyGlSurfaceView extends GLSurfaceView {
private GameRenderer renderer;
public MyGlSurfaceView(Context context, GameRenderer gameRenderer) throws Exception {
public MyGlSurfaceView(Context context, GameRenderer gameRenderer) {
super(context);
this.renderer = gameRenderer;
super.setEGLContextClientVersion(2);
super.setRenderer(renderer);
}
public void addRendering(Rendering rendering) {
renderer.addRendering(rendering);
public GameRenderer getRenderer() {
return renderer;
}
public void setCurrentRendering(Rendering currentRendering) {
super.setOnTouchListener(currentRendering);
renderer.setCurrentRendering(currentRendering);
@Override
public boolean onTouchEvent(MotionEvent event) {
renderer.getCurrentRendering().onTouch(event.getX(), event.getY());
return true;
}
@Override

View File

@ -1,8 +1,5 @@
package de.frajul.endlessroll.main.game;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
@ -32,6 +29,7 @@ import de.frajul.endlessroll.main.physics.Physics;
import de.frajul.endlessroll.main.screens.GameScreen;
import de.frajul.endlessroll.main.screens.Screen;
import de.frajul.endlessroll.rendering.Rendering;
import de.frajul.endlessroll.rendering.renderer.GameRenderer;
import de.frajul.endlessroll.sqlDatabase.MyDatabase;
import de.frajul.endlessroll.views.ViewManager;
@ -61,8 +59,8 @@ public class Game extends Rendering<GameScene> {
private List<Integer> collectedStars = new ArrayList<>();
private boolean energyCollected;
public Game(GameHandler handler, GameScreen gameScreen, GameActivity gameActivity) throws Exception {
super(gameActivity);
public Game(GameHandler handler, GameScreen gameScreen, GameActivity gameActivity, GameRenderer gameRenderer) throws Exception {
super(gameActivity, gameRenderer);
this.handler = handler;
this.gameActivity = gameActivity;
physics = new Physics();
@ -131,15 +129,10 @@ public class Game extends Rendering<GameScene> {
gameState = GameState.RUNNING;
}
@Override
public void setScreenSize(int width, int height) {
Vector screenSize = new Vector(width, height);
scene.setScreenSize(screenSize);
}
@Override
public void update() {
try {
GameLog.i("FrameTimeMilliseconds: " + timer.getFrameTimeMilliseconds());
particleSystem.update(timer);
if (scene == null || player == null)
return;
@ -175,10 +168,10 @@ public class Game extends Rendering<GameScene> {
}
@Override
public boolean onTouch(View v, MotionEvent event) {
public void onTouch(float x, float y) {
try {
if (gameState == GameState.RUNNING && event.getAction() == MotionEvent.ACTION_DOWN) {
Vector touchPoint = scene.calcWorldFromScreenCoords(event.getX(), event.getY());
if (gameState == GameState.RUNNING) {
Vector touchPoint = scene.calcWorldFromScreenCoords(x, y);
for (ToolButton toolButton : toolButtonBar.getToolButtons()) {
ToolType toolType = toolButton.getToolType();
@ -186,7 +179,7 @@ public class Game extends Rendering<GameScene> {
toolButton.getBorder()) && toolType != null) {
toolButtonBar.setActive(toolType);
setCurrentTool(toolType, toolButton.hasFinishedLoading());
return true;
return;
}
}
touchPoint.translate(scene.camera.getX(), scene.camera.getY());
@ -196,26 +189,23 @@ public class Game extends Rendering<GameScene> {
if (currentTool == ToolType.BOMB) {
Obstacle selectedObstacle = scene.getObstacleAtPoint(touchPoint);
if (selectedObstacle == null) {
viewManager.showBombErrorMessage(event.getX(), event.getY());
return true;
viewManager.showBombErrorMessage(x, y);
return;
} else {
currentToolButton.setProgress(0);
scene.getBombSelected().set(false);
Tool tool = addTool(touchPoint);
if (tool != null && tool instanceof Bomb)
((Bomb) tool).setAttachedObstacle(selectedObstacle);
return true;
return;
}
}
currentToolButton.setProgress(0);
addTool(touchPoint);
return true;
}
}
return false;
} catch (Exception e) {
onException(e);
return false;
}
}
@ -370,7 +360,6 @@ public class Game extends Rendering<GameScene> {
}
}
@Override
public void onException(Exception e) {
handler.onException(e);
}

View File

@ -5,6 +5,7 @@ import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import de.frajul.endlessroll.data.Vector;
import de.frajul.endlessroll.entities.AnimatedEntity;
@ -23,7 +24,6 @@ import de.frajul.endlessroll.entities.tileLists.Terrain;
import de.frajul.endlessroll.entities.tools.Tool;
import de.frajul.endlessroll.levels.worlds.World;
import de.frajul.endlessroll.main.GameActivity;
import de.frajul.endlessroll.main.GameLog;
/**
* Created by Julian on 20.07.2016.
@ -36,8 +36,8 @@ public abstract class Scene {
private GameActivity gameActivity;
protected Camera camera;
private Vector screenSize;
private Entity playerArrow;
private AtomicInteger screenWidth, screenHeight;
protected ParticleSystem particleSystem;
protected TexturePack textures;
@ -66,6 +66,8 @@ public abstract class Scene {
ceiling = new Ceiling(World.GRASSLANDS.getTerrainTexture());
player = new Player();
bombSelected = new AtomicBoolean(false);
screenWidth = new AtomicInteger();
screenHeight = new AtomicInteger();
}
public void setTexturePack(TexturePack texturePack) {
@ -153,16 +155,17 @@ public abstract class Scene {
}
protected Vector calcWorldFromScreenCoords(float screenX, float screenY) throws Exception {
if (screenSize == null)
if (screenWidth.get() == 0 || screenHeight.get() == 0)
throw new Exception("ScreenSize not set");
float glCoordWidth = (2f * screenSize.x / screenSize.y);
float x = ((screenX / screenSize.x) * 2f - 1f) * glCoordWidth / 2;
float y = -((screenY / screenSize.y) * 2f - 1f);
float glCoordWidth = (2f * screenWidth.get() / (float) screenHeight.get());
float x = ((screenX / (float) screenWidth.get()) * 2f - 1f) * glCoordWidth / 2;
float y = -((screenY / (float) screenHeight.get()) * 2f - 1f);
return new Vector(x, y);
}
public void setScreenSize(Vector screenSize) {
this.screenSize = screenSize;
public void setScreenSize(int width, int height) {
this.screenWidth.set(width);
this.screenHeight.set(height);
}
public synchronized Background getBackground() {

View File

@ -5,17 +5,18 @@ import android.view.ViewGroup;
import de.frajul.endlessroll.main.GameActivity;
import de.frajul.endlessroll.main.MyGlSurfaceView;
import de.frajul.endlessroll.rendering.renderer.GameRenderer;
/**
* Created by Julian on 30.07.2016.
*/
public abstract class GLScreen<V extends ViewGroup> extends Screen<V> {
protected MyGlSurfaceView glView;
protected GameRenderer gameRenderer;
public GLScreen(ScreenType type, GameActivity gameActivity, @LayoutRes int layoutId, MyGlSurfaceView glView) {
super(type, gameActivity, layoutId);
this.glView = glView;
this.gameRenderer = glView.getRenderer();
}
}

View File

@ -17,15 +17,14 @@ public class GLTestScreen extends GLScreen<RelativeLayout> {
public GLTestScreen(GameActivity gameActivity, MyGlSurfaceView glView) throws Exception{
super(ScreenType.GL_TEST, gameActivity, R.layout.gl_test_screen, glView);
rendering = new TestScreenRendering(gameActivity);
glView.addRendering(rendering);
rendering = new TestScreenRendering(gameActivity, gameRenderer);
}
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().menuMusic.start();
glView.setCurrentRendering(rendering);
gameRenderer.setCurrentRendering(rendering);
}
@Override

View File

@ -24,15 +24,14 @@ public class GameScreen extends GLScreen<RelativeLayout> {
public GameScreen(GameActivity gameActivity, MyGlSurfaceView glSurfaceView) throws Exception {
super(ScreenType.GAME, gameActivity, R.layout.game, glSurfaceView);
game = new Game(gameViewHandler, this, gameActivity);
glView.addRendering(game);
game = new Game(gameViewHandler, this, gameActivity, gameRenderer);
}
@Override
public void prepareToBeShown() {
gameActivity.getSoundManager().menuMusic.stop();
glView.setCurrentRendering(game);
gameRenderer.setCurrentRendering(game);
game.getViewManager().prepareToBeShown();
}
@ -77,7 +76,7 @@ public class GameScreen extends GLScreen<RelativeLayout> {
@Override
public void toScreen(ScreenType screen) {
glView.setCurrentRendering(null);
gameRenderer.setCurrentRendering(null);
gameActivity.flipToScreen(screen);
}

View File

@ -45,8 +45,7 @@ public class StartScreen extends GLScreen<RelativeLayout> implements View.OnClic
confirmDialog = new ConfirmDialog(gameActivity, this);
rendering = new StartScreenRendering(gameActivity);
glView.addRendering(rendering);
rendering = new StartScreenRendering(gameActivity, gameRenderer);
}
private Button createButton(@IdRes int id, Typeface typeface) {
@ -62,7 +61,7 @@ public class StartScreen extends GLScreen<RelativeLayout> implements View.OnClic
((StartScene) rendering.getScene()).randomizeWorld();
((StartScene) rendering.getScene()).loadTexturesForCurrentWorld();
glView.setCurrentRendering(rendering);
gameRenderer.setCurrentRendering(rendering);
}
@Override
@ -74,7 +73,7 @@ public class StartScreen extends GLScreen<RelativeLayout> implements View.OnClic
public void onClick(View v) {
if (v.equals(play)) {
gameActivity.flipToScreen(ScreenType.WORLDS);
glView.setCurrentRendering(null);
gameRenderer.setCurrentRendering(null);
} else if (v.equals(gain90EP)) {
gameActivity.getUser().gainEp(90, true);
} else if (v.equals(unlockLevels)) {

View File

@ -10,6 +10,7 @@ import de.frajul.endlessroll.main.GameLog;
import de.frajul.endlessroll.main.game.StartScene;
import de.frajul.endlessroll.main.game.Timer;
import de.frajul.endlessroll.rendering.Rendering;
import de.frajul.endlessroll.rendering.renderer.GameRenderer;
/**
* Created by Julian on 20.07.2016.
@ -20,8 +21,8 @@ public class StartScreenRendering extends Rendering<StartScene> {
private Timer timer;
private ParticleSystem particleSystem;
public StartScreenRendering(GameActivity gameActivity) throws Exception {
super(gameActivity);
public StartScreenRendering(GameActivity gameActivity, GameRenderer gameRenderer) throws Exception {
super(gameActivity, gameRenderer);
this.gameActivity = gameActivity;
this.particleSystem = new ParticleSystem(gameActivity);
}
@ -49,8 +50,6 @@ public class StartScreenRendering extends Rendering<StartScene> {
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
public void onTouch(float x, float y) {
}
}

View File

@ -10,6 +10,7 @@ import de.frajul.endlessroll.main.GameLog;
import de.frajul.endlessroll.main.game.TestScreenScene;
import de.frajul.endlessroll.main.game.Timer;
import de.frajul.endlessroll.rendering.Rendering;
import de.frajul.endlessroll.rendering.renderer.GameRenderer;
/**
* Created by Julian on 20.07.2016.
@ -20,8 +21,8 @@ public class TestScreenRendering extends Rendering<TestScreenScene> {
private Timer timer;
private ParticleSystem particleSystem;
public TestScreenRendering(GameActivity gameActivity) throws Exception{
super(gameActivity);
public TestScreenRendering(GameActivity gameActivity, GameRenderer gameRenderer) throws Exception{
super(gameActivity, gameRenderer);
this.gameActivity = gameActivity;
particleSystem = new ParticleSystem(gameActivity);
}
@ -51,8 +52,7 @@ public class TestScreenRendering extends Rendering<TestScreenScene> {
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
public void onTouch(float x, float y) {
}
}

View File

@ -58,7 +58,7 @@ public class TutorialView implements View.OnClickListener {
int imageId = breakPoints.get(currentBreakPoint).getImageId();
if (textId == -1)
textView.setVisibility(View.INVISIBLE);
textView.setVisibility(View.GONE);
else {
textView.setVisibility(View.VISIBLE);
textView.setText(textId);

View File

@ -3,23 +3,24 @@ package de.frajul.endlessroll.rendering;
import android.content.Context;
import android.view.View;
import de.frajul.endlessroll.data.Vector;
import de.frajul.endlessroll.entities.textures.TexturePack;
import de.frajul.endlessroll.main.GameActivity;
import de.frajul.endlessroll.main.game.Scene;
import de.frajul.endlessroll.main.game.Timer;
import de.frajul.endlessroll.rendering.renderer.GameRenderer;
/**
* Created by Julian on 26.11.2015.
*/
public abstract class Rendering<S extends Scene> implements View.OnTouchListener {
public abstract class Rendering<S extends Scene> {
protected S scene;
private GameActivity gameActivity;
private boolean alreadyInitiated = false;
public Rendering(GameActivity gameActivity) {
public Rendering(GameActivity gameActivity, GameRenderer gameRenderer) {
this.gameActivity = gameActivity;
gameRenderer.addRenderTarget(this);
}
public void initiate(TexturePack texturePack, Timer timer) {
@ -31,13 +32,11 @@ public abstract class Rendering<S extends Scene> implements View.OnTouchListener
public abstract void update();
public void onException(Exception e) {
gameActivity.onException(e);
}
public abstract void onTouch(float x, float y);
public void setScreenSize(int width, int height) {
if (scene != null)
scene.setScreenSize(new Vector(width, height));
scene.setScreenSize(width, height);
}
public Scene getScene() {

View File

@ -50,7 +50,6 @@ public class GameRenderer implements GLSurfaceView.Renderer {
private TerrainShader terrainShader;
private SimpleShader simpleShader;
private GuiShader guiShader;
private TexturePack texturePack;
private Timer timer;
@ -61,14 +60,18 @@ public class GameRenderer implements GLSurfaceView.Renderer {
particleRenderer = new ParticleRenderer(activity, quad, matrixCreator);
}
public void addRendering(Rendering rendering) {
renderTargets.add(rendering);
public void addRenderTarget(Rendering renderTarget){
renderTargets.add(renderTarget);
}
public synchronized void setCurrentRendering(Rendering currentRendering) {
public void setCurrentRendering(Rendering currentRendering) {
this.currentRendering = currentRendering;
}
public Rendering getCurrentRendering() {
return currentRendering;
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
GameLog.d("onSurfaceCreated");
@ -77,7 +80,7 @@ public class GameRenderer implements GLSurfaceView.Renderer {
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
try {
particleRenderer.createContext();
particleRenderer.createShader();
entityShader = new EntityShader(activity);
obstacleShader = new ObstacleShader(activity);
terrainShader = new TerrainShader(activity);
@ -86,12 +89,10 @@ public class GameRenderer implements GLSurfaceView.Renderer {
texturePack = new TexturePack(activity);
timer = new Timer();
} catch (Exception e) {
for (Rendering rendering : renderTargets)
rendering.onException(e);
}
for (Rendering rendering : renderTargets) {
rendering.initiate(texturePack, timer);
activity.onException(e);
}
for(Rendering renderTarget : renderTargets)
renderTarget.initiate(texturePack, timer);
}
@Override
@ -100,8 +101,8 @@ public class GameRenderer implements GLSurfaceView.Renderer {
particleRenderer.createFbo(width, height);
GLES20.glViewport(0, 0, width, height);
matrixCreator.setMVPMSize(width, height);
for (Rendering rendering : renderTargets)
rendering.setScreenSize(width, height);
for(Rendering renderTarget : renderTargets)
renderTarget.setScreenSize(width, height);
activity.onSurfaceChanged();
}

View File

@ -33,7 +33,7 @@ public class ParticleRenderer {
this.matrixCreator = matrixCreator;
}
public void createContext() throws Exception {
public void createShader() throws Exception {
particleShader = new ParticleShader(context);
}

View File

@ -47,7 +47,7 @@ public class GoalMessageLevelButton implements View.OnClickListener {
}
public void setVisible(boolean visible) {
layout.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
layout.setVisibility(visible ? View.VISIBLE : View.GONE);
}
public void init(@StringRes int textId, Level level) {

View File

@ -63,7 +63,7 @@ public class ShortMenu implements View.OnClickListener {
}
public void setVisible(boolean visible) {
layout.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
layout.setVisibility(visible ? View.VISIBLE : View.GONE);
if (visible)
topBar.update();
}

View File

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false">
android:layout_height="match_parent">
<ImageView
android:id="@+id/game_pausebutton"
@ -19,6 +18,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp"
android:layout_marginStart="6dp"
android:layout_marginTop="4dp"
android:text="@string/game_playerprogress_placeholder"
android:textColor="@color/secondary"
@ -42,7 +42,7 @@
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="invisible"/>
android:visibility="gone"/>
<include
android:id="@+id/game_game_over_message"
@ -51,7 +51,7 @@
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="invisible"/>
android:visibility="gone"/>
<include
android:id="@+id/game_goal_message"
@ -60,6 +60,6 @@
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="invisible"/>
android:visibility="gone"/>
</RelativeLayout>

View File

@ -132,7 +132,7 @@
android:layout_centerVertical="true"
android:text="@string/placeholder_number"
android:textSize="20sp"
android:visibility="invisible"/>
android:visibility="gone"/>
<TextView
android:id="@+id/topbar_energycount_decrease"
@ -143,5 +143,5 @@
android:layout_centerVertical="true"
android:text="@string/placeholder_number"
android:textSize="20sp"
android:visibility="invisible"/>
android:visibility="gone"/>
</RelativeLayout>