LibGDX - reakcja na klikanie

0

Witam,
Zacząłem sobie mały projekt w LibGDX i mam mały problem. Wiem jak zrobić żeby po kliknięciu jakiś tam obiekt coś robił.
Ale niestety nie wiem jak podzielić mój GamePlayScreen na dwie części tak żeby po kliknięciu z lewej strony obiekt poruszał się w lewo i analogicznie na prawą stronę.
Ma ktoś może pomysł jak to zrobić ?

0

Najlepiej będzie chyba reagować na myszkę i sprawdzać pozycję kursora względem pozycji obiektu który chcesz poruszać. Jeżeli kursor jest na lewo od obiektu porusz w lewo jeżeli na prawo to w prawo.

0

Być może i masz rację, ale jak to zrobić/ czego użyć ?

0

Już zrobiłem :) Czy jest możliwość zrobienia tak żeby nie trzeba było klikać tylko jeden klik wystarczy żeby przejść na lewą lub prawą stronę ekranu ?
I w jaki sposób zablokować żeby gracz nie wychodził poza okno gry ?

0

Niemal wszystko jest możliwe kwestia wymyślenia jak to ma działać. Trzeba pomyśleć z jakiego zdarzenia chcesz skorzystać i napisać trochę kody który to wykona.

0

No rozumiem. Ale nawet z tym wychodzeniem poza ekran próbowałem juz chyba wszystkiego.. np: że jeżeli startowa pozycja obiektu bedzie mniejsza niż 0 to przypisz wartość 0 do xMoveAmmount, które jest u mnie odpowiedzialne za poruszanie się w lewo.

0

Wrzuć jakiś kod będzie dużo łatwiej powiedzieć co może nie działać jak trzeba.

0

Klasa Player

import com.badlogic.gdx.math.Interpolation;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.scenes.scene2d.Action;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.mygdx.game.MyGame;
 
public class Player extends Image{
 
    private final static int WIDHT = 77;
    private final static int HEIGHT = 152;
     
    private final static int STARTING_X = 200;
    private final static int STARTING_Y = 300;
     
    public Player(){
        super(new Texture("plane-red-300px.png"));
         
        this.setOrigin(WIDHT / 2, HEIGHT / 2);
        this.setSize(WIDHT, HEIGHT);
         
        // starting position
        this.setPosition(STARTING_X, STARTING_Y);
    }
 
    public void reactOnLeftClick() {
        int xMoveAmmount = -20;
        int yMoveAmmount = 0;
        float moveActionTime = 0.30f;
        Action moveAction = Actions.sequence(
                Actions.moveBy(xMoveAmmount, yMoveAmmount, moveActionTime)
                );
                 
        this.addAction(moveAction);
        if(this.STARTING_X <= this.getWidth()){
        	xMoveAmmount = 0;
        }
         
    }
    
    public void reactOnRightClick(){
    	int xMoveRightAmmount = 20;
        int yMoveRightAmmount = 0;
        float moveRightActionTime = 0.30f;
        Action moveRightAction = Actions.sequence(
                Actions.moveBy(xMoveRightAmmount, yMoveRightAmmount, moveRightActionTime)
                );
         
        this.addAction(moveRightAction);
    }
     
}

A to GamePlayScreen

import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.Button;
import com.badlogic.gdx.scenes.scene2d.ui.Button.ButtonStyle;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.mygdx.game.MyGame;
import com.mygdx.game.entities.Player;

public class GamePlayScreen extends AbstarctScreen {

	private Player player;
	private Button leftPlayerButton;
	private Button rightPlayerButton;
	public GamePlayScreen(MyGame game) {
		super(game);
	}

	private void initleftPlayerButton(){
		leftPlayerButton = new Button(new ButtonStyle());
		leftPlayerButton.setWidth(240);
		leftPlayerButton.setHeight(80);
		leftPlayerButton.setX(0);
		leftPlayerButton.setY(0);
		leftPlayerButton.setDebug(true);
		stage.addActor(leftPlayerButton);
		
		leftPlayerButton.addListener(new ClickListener(){
			@Override
			public boolean touchDown(InputEvent event, float x, float y,
					int pointer, int button) {
				player.reactOnLeftClick();
				return super.touchDown(event, x, y, pointer, button);
			}
			
		});
	}
	private void initrightPlayerButton(){
		rightPlayerButton = new Button(new ButtonStyle());
		rightPlayerButton.setWidth(240);
		rightPlayerButton.setHeight(80);
		rightPlayerButton.setX(240);
		rightPlayerButton.setY(0);
		rightPlayerButton.setDebug(true);
		stage.addActor(rightPlayerButton);
		rightPlayerButton.addListener(new ClickListener(){
			@Override
			public boolean touchDown(InputEvent event, float x, float y,
					int pointer, int button) {
				player.reactOnRightClick();
				return super.touchDown(event, x, y, pointer, button);
			}
			
		});
	}
	

	private void initPlayer() {
		
		player = new Player();
		stage.addActor(player);
	}

	public void render(float delta)
	{
		super.render(delta);
		update();
		
		spriteBatch.begin();
		stage.draw();
		spriteBatch.end();
	}
	private void update()
	{
		stage.act();
	}


	@Override
	protected void init() {
		initPlayer();
		initleftPlayerButton();
		initrightPlayerButton();
		
		
	}


	
}
0
 if(this.STARTING_X <= this.getWidth()){
            xMoveAmmount = 0;
        }

ja to rozumiem tak (jeżeli się mylę to mnie popraw)

jeżeli STARTING_X jest mniejsze równe szerokość obrazka ustaw na pozycję 0

chyba że ja to źle zrozumiałem...

0

xMoveAmmount jest odpowiedzialne za to jak dany obiekt szybko ma się poruszać. Wykombinowałem sobie tak, żeby przypisać później to tego 0 i nawet jeśli ktoś naciska myszką to już w lewo nie pójdzie bo ma ustawione na 0

0

Witam,
Jeżeli mam metodę która zwiększa punkty o 1, to jak zrobić aby punkty dodawały się co 1 sekunde ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1