You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
7.6 KiB
242 lines
7.6 KiB
/*
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
* To change this template file, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
package com.trs.main;
|
|
|
|
import com.badlogic.gdx.Gdx;
|
|
import com.badlogic.gdx.Input;
|
|
import com.badlogic.gdx.graphics.Color;
|
|
import com.badlogic.gdx.graphics.g2d.Batch;
|
|
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
|
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
|
|
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
|
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
|
|
import com.badlogic.gdx.math.Matrix4;
|
|
import com.badlogic.gdx.math.Rectangle;
|
|
import com.badlogic.gdx.scenes.scene2d.Actor;
|
|
import java.util.ArrayList;
|
|
|
|
/**
|
|
*
|
|
* @author Jan
|
|
*/
|
|
public class Textbox extends Actor{
|
|
|
|
BitmapFont font;
|
|
Rectangle r;
|
|
int printLine;
|
|
int printChar;
|
|
ArrayList<String> splitted;
|
|
String toPring;
|
|
|
|
ShapeRenderer renderer;
|
|
|
|
int state; // 0: drawing 1: waiting for input 2: finished
|
|
|
|
int selectedAsw = 0;
|
|
|
|
String[] ans;
|
|
|
|
float textHeight;
|
|
|
|
public Textbox(String toPrint, String[] ans, float xPos, float yPos) {
|
|
FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("font.ttf"));
|
|
FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
|
|
parameter.size = 21;
|
|
font = generator.generateFont(parameter);
|
|
generator.dispose();
|
|
font.setColor(Color.BLACK);
|
|
|
|
renderer = new ShapeRenderer();
|
|
textHeight = getTextHeight("A");
|
|
printLine = 0;
|
|
printChar = 0;
|
|
this.ans = ans;
|
|
setName("textbox");
|
|
font = new BitmapFont();
|
|
splitted = getSplitted(toPrint, (int)(Main.CAMERA_WIDTH/2));
|
|
|
|
// CALCULATE NEEDED HEIGHT
|
|
float height = splitted.size() * 1.2f * textHeight + (ans.length+1) * 1.2f * textHeight;
|
|
|
|
r = new Rectangle(xPos - Main.CAMERA_WIDTH/2 + 20, yPos - Main.CAMERA_HEIGHT/2 + 20, Main.CAMERA_WIDTH/2, height);
|
|
setBounds(r.getX(), r.getY(), r.getWidth(), r.getHeight());
|
|
|
|
state = 0;
|
|
}
|
|
|
|
public Textbox(Textbox t, float xPos, float yPos){
|
|
font = new BitmapFont();
|
|
FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("font.ttf"));
|
|
FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
|
|
parameter.size = 21;
|
|
font = generator.generateFont(parameter);
|
|
generator.dispose();
|
|
font.setColor(Color.BLACK);
|
|
|
|
textHeight = getTextHeight("A");
|
|
this.splitted = t.splitted;
|
|
this.ans = t.ans;
|
|
System.out.println(splitted.size());
|
|
float height = this.splitted.size() * 1.2f * textHeight + (this.ans.length+2) * 1.2f * textHeight;
|
|
r = new Rectangle(xPos - Main.CAMERA_WIDTH/2 + 20, yPos - Main.CAMERA_HEIGHT/2 + 20, Main.CAMERA_WIDTH - 40, height);
|
|
setBounds(r.getX(), r.getY(), r.getWidth(), r.getHeight());
|
|
|
|
renderer = new ShapeRenderer();
|
|
printLine = 0;
|
|
printChar = 0;
|
|
setName("textbox");
|
|
|
|
}
|
|
|
|
@Override
|
|
public void act(float delta) {
|
|
|
|
|
|
|
|
if(state == 1){
|
|
if(Gdx.input.isKeyJustPressed(Input.Keys.DOWN)){
|
|
if(selectedAsw < ans.length - 1) {
|
|
selectedAsw++;
|
|
}
|
|
}
|
|
|
|
if(Gdx.input.isKeyJustPressed(Input.Keys.UP)){
|
|
if(selectedAsw > 0) {
|
|
selectedAsw--;
|
|
}
|
|
}
|
|
|
|
if(Gdx.input.isKeyJustPressed(Input.Keys.ENTER)){
|
|
state = 2;
|
|
System.out.println(ans[selectedAsw]);
|
|
}
|
|
}
|
|
else{
|
|
if(printChar >= splitted.get(printLine).length()){
|
|
if(splitted.size()-1 <= printLine){
|
|
state = 1;
|
|
}
|
|
else{
|
|
printLine++;
|
|
printChar = 0;
|
|
}
|
|
}
|
|
else{
|
|
printChar++;
|
|
}
|
|
if(Gdx.input.isKeyJustPressed(Input.Keys.ENTER)){
|
|
state = 1;
|
|
printLine = splitted.size()-1;
|
|
}
|
|
}
|
|
|
|
super.act(delta);
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
protected void positionChanged() {
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
public void draw(Batch batch, float parentAlpha) {
|
|
font.setColor(Color.BLACK);
|
|
batch.end();
|
|
renderer.setProjectionMatrix(batch.getProjectionMatrix());
|
|
renderer.begin(ShapeRenderer.ShapeType.Filled);
|
|
renderer.setColor(Color.BLUE);
|
|
renderer.rect(getX(), getY(), getWidth(), getHeight());
|
|
renderer.end();
|
|
renderer.begin(ShapeRenderer.ShapeType.Line);
|
|
renderer.setColor(Color.RED);
|
|
renderer.rect(getX(), getY(), getWidth(), getHeight());
|
|
renderer.end();
|
|
batch.begin();
|
|
if(state == 0){
|
|
for(int i = 0; i < splitted.size(); i++){
|
|
if(i == printLine){
|
|
font.draw(batch, splitted.get(i).substring(0, printChar), getX()+5, getY() + getHeight()-i*1.2f*textHeight - 5);
|
|
}
|
|
else if(i < printLine){
|
|
font.draw(batch, splitted.get(i), getX()+5, getY() + getHeight()-i*1.2f*textHeight - 5);
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
for(int i = 0; i <= printLine; i++){
|
|
font.draw(batch, splitted.get(i), getX()+5, getY() + getHeight()-i*1.2f*textHeight - 5);
|
|
}
|
|
|
|
for(int i = 0; i < ans.length; i++) {
|
|
if(selectedAsw == i) {
|
|
font.setColor(Color.RED);
|
|
}
|
|
else {
|
|
font.setColor(Color.BLACK);
|
|
}
|
|
|
|
font.draw(batch, ans[i], getX()+5, getY() + getHeight() - ((splitted.size() + i + 1) * 1.2f * textHeight - 5));
|
|
}
|
|
}
|
|
super.draw(batch, parentAlpha);
|
|
}
|
|
|
|
public ArrayList<String> getSplitted(String toSplit, int maxLength){
|
|
ArrayList<String> words = new ArrayList<>();
|
|
int tail = 0;
|
|
for(int head = 0; head < toSplit.length(); head++){
|
|
if(toSplit.charAt(head) == ' '){
|
|
words.add(toSplit.substring(tail, head+1));
|
|
head++;
|
|
tail=head;
|
|
}
|
|
}
|
|
words.add(toSplit.substring(tail, toSplit.length()));
|
|
|
|
ArrayList<String> toReturn = new ArrayList<>();
|
|
String string = new String();
|
|
for(String s : words){
|
|
if(getTextWidth(string)+getTextWidth(s) >= maxLength){
|
|
toReturn.add(string);
|
|
string = new String();
|
|
string += s;
|
|
}
|
|
else if(getTextWidth(string)+getTextWidth(s) < maxLength){
|
|
string += s;
|
|
}
|
|
}
|
|
toReturn.add(string);
|
|
|
|
for(String s : toReturn){
|
|
//System.out.println("-"+s+"-");
|
|
}
|
|
|
|
return toReturn;
|
|
}
|
|
|
|
|
|
public float getTextWidth(String text){
|
|
GlyphLayout glyphLayout = new GlyphLayout();
|
|
glyphLayout.setText(font,text);
|
|
return glyphLayout.width;
|
|
}
|
|
public float getTextHeight(String text){
|
|
GlyphLayout glyphLayout = new GlyphLayout();
|
|
glyphLayout.setText(font,text);
|
|
return glyphLayout.height;
|
|
}
|
|
public int getState(){
|
|
return state;
|
|
}
|
|
public int getSelectedAsw(){
|
|
return selectedAsw;
|
|
}
|
|
}
|