Skip to content
This repository was archived by the owner on Apr 9, 2018. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ dependencies {
compile 'io.leonis:zosma:0.0.5'
compile 'io.leonis:algieba:0.0.4'
compile 'io.leonis:subra-protocol:0.0.1'
compile 'io.leonis:torch:0.0.1'

// math
compile 'org.nd4j:nd4j-native:0.8.0'
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/io/leonis/subra/gui/CanvasComponent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.leonis.subra.gui;

import com.googlecode.lanterna.*;
import com.googlecode.lanterna.gui2.*;
import java.util.function.BiFunction;
import java.util.stream.IntStream;
import lombok.AllArgsConstructor;

/**
* The class CanvasComponent.
*
* Draws an rectangle the same size as it's parent a dynamic color.
*
* @author Jeroen de Jong
*/
@AllArgsConstructor
public class CanvasComponent extends AbstractComponent<CanvasComponent> {

/**
* Function to determine background color at a specific position
*/
private final BiFunction<Integer, Integer, TextColor> backgroundSupplier;

@Override
protected ComponentRenderer<CanvasComponent> createDefaultRenderer() {
return new ComponentRenderer<CanvasComponent>() {
@Override
public TerminalSize getPreferredSize(final CanvasComponent component) {
return new TerminalSize(0, 0);
}

@Override
public void drawComponent(final TextGUIGraphics graphics, final CanvasComponent component) {
IntStream.range(0, this.getPreferredSize(component).getColumns()).forEach(x ->
IntStream.range(0, this.getPreferredSize(component).getRows()).forEach(y -> {
graphics.setBackgroundColor(backgroundSupplier.apply(x, y));
graphics.setCharacter(x, y, ' ');
}));
}
};
}
}
93 changes: 93 additions & 0 deletions src/main/java/io/leonis/subra/gui/TestGuI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package io.leonis.subra.gui;

import com.googlecode.lanterna.TextColor.ANSI;
import com.googlecode.lanterna.gui2.BasicWindow;
import io.leonis.algieba.spatial.*;
import io.leonis.subra.game.data.*;
import io.leonis.subra.gui.field.PotentialFieldPanel;
import io.leonis.subra.math.spatial.GaussianPotentialField;
import io.leonis.torch.Torch;
import io.leonis.torch.component.ComponentBackground;
import java.util.*;
import java.util.stream.Collectors;
import lombok.Value;
import org.nd4j.linalg.factory.Nd4j;

/**
* todo remove
*/
public class TestGuI {

public static void main(final String[] args) {
final Set<Player> robots =
new HashSet<>(
Arrays.asList(
new Player.State(
1,
System.currentTimeMillis(),
10,
5,
180,
TeamColor.BLUE),
new Player.State(
2,
System.currentTimeMillis(),
4,
13,
320,
TeamColor.BLUE),
new Player.State(
3,
System.currentTimeMillis(),
14,
20,
140,
TeamColor.BLUE)));
final Set<Ball> balls = new HashSet<>(
Arrays.asList(
new Ball.State(
System.currentTimeMillis(),
10, 10, 0),
new Ball.State(
System.currentTimeMillis(),
5, 5, 0)));
// final INDArray data = FieldGenerator.whatever(robots);

final Set<FieldLine> lines = new HashSet<>(
Arrays.asList(
new FieldLine.State(0, 0, 10, 10, 1)
));
Field field = new Field.State(60, 90, lines, Collections.emptySet());

PotentialField aggregatedPotentialField =
new AggregatedPotentialField(
Nd4j.zeros(2, 1),
robots.stream()
.map(player ->
new GaussianPotentialField(player.getXY(), 60, 1, 1, 0, false))
.collect(Collectors.toSet()));

StatesMaarWeer s = new StatesMaarWeer(
balls,
robots,
aggregatedPotentialField,
field
);
new Thread(
new Torch(
gui -> gui.addWindowAndWait(new BasicWindow("wat")),
new ComponentBackground(new PotentialFieldPanel<>(s), ANSI.BLUE))
).start();
}

@Value
static class StatesMaarWeer implements Ball.SetSupplier, Player.SetSupplier,
PotentialField.Supplier, Field.Supplier {

private Set<Ball> balls;
private Set<Player> players;
private PotentialField potentialField;
private Field field;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.leonis.subra.gui.field;

import com.googlecode.lanterna.TerminalSize;
import com.googlecode.lanterna.TextColor.RGB;
import com.googlecode.lanterna.gui2.*;
import io.leonis.subra.game.data.Ball;
import java.util.Collection;
import lombok.AllArgsConstructor;

/**
* The class BallPositionsComponent.
*
* Draws an {@code 0} with an orange background on the positions of a provided {@link Collection} of
* {@link Ball balls}.
*
* @author Jeroen de Jong
*/
@AllArgsConstructor
public final class BallPositionsComponent extends AbstractComponent<BallPositionsComponent> {

/**
* The collection of balls to draw
*/
private final Collection<Ball> balls;

@Override
protected ComponentRenderer<BallPositionsComponent> createDefaultRenderer() {
return new ComponentRenderer<BallPositionsComponent>() {
@Override
public TerminalSize getPreferredSize(final BallPositionsComponent component) {
return TerminalSize.ZERO;
}

@Override
public void drawComponent(
final TextGUIGraphics graphics,
final BallPositionsComponent component
) {
graphics.setForegroundColor(new RGB(255, 255, 255));
component.balls.forEach(ball -> {
graphics.setBackgroundColor(new RGB(255, 165, 0));
graphics.setCharacter((int) ball.getX(), (int) ball.getY(), '0');
});
}
};
}
}
66 changes: 66 additions & 0 deletions src/main/java/io/leonis/subra/gui/field/FieldLinesComponent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package io.leonis.subra.gui.field;

import com.googlecode.lanterna.*;
import com.googlecode.lanterna.gui2.*;
import io.leonis.subra.game.data.FieldLine;
import java.util.Collection;
import java.util.function.BiFunction;
import java.util.stream.IntStream;
import lombok.AllArgsConstructor;

/**
* The class FieldLinesComponent.
*
* Draws vertical and horizontal {@link FieldLine field lines}. Draws a + at the begin and end of
* every line.
*
* @author Jeroen de Jong
*/
@AllArgsConstructor
public final class FieldLinesComponent extends AbstractComponent<FieldLinesComponent> {

/**
* Collection of lines to draw
*/
private final Collection<FieldLine> fieldLines;
/**
* Function to determine background color at a specific position
*/
private final BiFunction<Integer, Integer, TextColor> backgroundSupplier;

@Override
protected ComponentRenderer<FieldLinesComponent> createDefaultRenderer() {
return new ComponentRenderer<FieldLinesComponent>() {
@Override
public TerminalSize getPreferredSize(final FieldLinesComponent component) {
return TerminalSize.ZERO;
}

@Override
public void drawComponent(final TextGUIGraphics graphics,
final FieldLinesComponent component) {
component.fieldLines.forEach(fieldLine ->
IntStream.range((int) fieldLine.getXStart(), (int) fieldLine.getXEnd())
.forEach(
x -> IntStream.range((int) fieldLine.getYStart(), (int) fieldLine.getYEnd())
.forEach(y -> {
graphics.setBackgroundColor(backgroundSupplier.apply(x, y));
// TODO The determination of the character should be more obvious.
graphics.setCharacter(x, y, this.getCharacter(x, y, fieldLine));
})));
}

private Character getCharacter(
final Integer x,
final Integer y,
final FieldLine fieldLine
) {
if ((fieldLine.getYStart() == y && fieldLine.getXStart() == x) ||
(fieldLine.getYEnd() == y && fieldLine.getXEnd() == x)) {
return '+';
}
return fieldLine.getYStart() == fieldLine.getYEnd() ? '|' : '–';
}
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package io.leonis.subra.gui.field;

import static io.leonis.algieba.geometry.CardinalDirection.*;

import com.google.common.collect.ImmutableMap;
import com.googlecode.lanterna.*;
import com.googlecode.lanterna.TextColor.RGB;
import com.googlecode.lanterna.gui2.*;
import io.leonis.algieba.geometry.CardinalDirection;
import io.leonis.subra.game.data.Player;
import java.util.AbstractMap.SimpleEntry;
import java.util.*;
import java.util.Map.Entry;
import java.util.function.BiFunction;
import lombok.AllArgsConstructor;

/**
* The class OrientationIndicatorComponent.
*
* Draws an arrow character around the original player location in the orientation the player is
* facing.
*
* @author Jeroen de Jong
*/
@AllArgsConstructor
public final class OrientationIndicatorComponent extends
AbstractComponent<OrientationIndicatorComponent> {

/**
* The set of players to draw the indicator for
*/
private final Collection<Player> players;
/**
* Function to determine background color at a specific position
*/
private final BiFunction<Integer, Integer, TextColor> backgroundSupplier;
/**
* Mapping of {@link CardinalDirection} to a {@link Character} and its offset
*/
private final Map<CardinalDirection, Entry<TerminalPosition, Character>> mapping =
ImmutableMap.<CardinalDirection, Entry<TerminalPosition, Character>>builder()
.put(NORTH, new SimpleEntry<>(new TerminalPosition(0, -1), '↑'))
.put(NORTH_EAST, new SimpleEntry<>(new TerminalPosition(1, -1), '↗'))
.put(EAST, new SimpleEntry<>(new TerminalPosition(1, 0), '→'))
.put(SOUTH_EAST, new SimpleEntry<>(new TerminalPosition(1, 1), '↘'))
.put(SOUTH, new SimpleEntry<>(new TerminalPosition(0, 1), '↓'))
.put(SOUTH_WEST, new SimpleEntry<>(new TerminalPosition(-1, 1), '↙'))
.put(WEST, new SimpleEntry<>(new TerminalPosition(-1, 0), '←'))
.put(NORTH_WEST, new SimpleEntry<>(new TerminalPosition(-1, -1), '↖'))
.build();

@Override
protected ComponentRenderer<OrientationIndicatorComponent> createDefaultRenderer() {
return new ComponentRenderer<OrientationIndicatorComponent>() {
@Override
public TerminalSize getPreferredSize(final OrientationIndicatorComponent component) {
return TerminalSize.ZERO;
}

@Override
public void drawComponent(
final TextGUIGraphics graphics,
final OrientationIndicatorComponent component
) {
graphics.setForegroundColor(new RGB(255, 255, 255));
component.players.forEach(player -> {
final Entry<TerminalPosition, Character> entry = mapping
.get(player.getCardinalDirection());
final TerminalPosition position = entry.getKey()
.withRelative((int) player.getX(), (int) player.getY());
graphics.setBackgroundColor(
component.backgroundSupplier.apply(position.getRow(), position.getColumn()));
graphics.setCharacter(position, entry.getValue());
});
}
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package io.leonis.subra.gui.field;

import com.googlecode.lanterna.TerminalSize;
import com.googlecode.lanterna.TextColor.*;
import com.googlecode.lanterna.gui2.*;
import io.leonis.subra.game.data.*;
import java.util.Collection;
import lombok.AllArgsConstructor;

/**
* The class PlayerPositionsComponent.
*
* Draws all provided player ids with the {@link TeamColor} as background.
*
* @author Jeroen de Jong
*/
@AllArgsConstructor
public class PlayerPositionsComponent extends AbstractComponent<PlayerPositionsComponent> {

/**
* Set of players to draw.
*/
private final Collection<Player> players;

@Override
protected ComponentRenderer<PlayerPositionsComponent> createDefaultRenderer() {
return new ComponentRenderer<PlayerPositionsComponent>() {
@Override
public TerminalSize getPreferredSize(final PlayerPositionsComponent component) {
return TerminalSize.ZERO;
}

@Override
public void drawComponent(
final TextGUIGraphics graphics,
final PlayerPositionsComponent component
) {
graphics.setForegroundColor(new RGB(255, 255, 255));
component.players.forEach(player -> {
graphics.setBackgroundColor(
player.getTeamColor() == TeamColor.BLUE ? ANSI.BLUE : ANSI.YELLOW);
graphics.putString((int) player.getX(), (int) player.getY(),
Integer.toHexString(player.getId()));
});
}
};
}
}
Loading