Skip to content

Commit b1bcf91

Browse files
author
Valentin Vetter
committed
feat(entities): add TilingSprite
1 parent 7bad927 commit b1bcf91

File tree

7 files changed

+139
-5
lines changed

7 files changed

+139
-5
lines changed

engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/Entity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public abstract class Entity<T extends Entity<?>> {
2424
Mask mask;
2525

2626
static enum Type {
27-
CIRCLE, LINE, RECTANGLE, SPRITE, TEXT, BITMAPTEXT, GROUP, BUFFERED_GROUP, SPRITEANIMATION, ROUNDED_RECTANGLE, POLYGON
27+
CIRCLE, LINE, RECTANGLE, SPRITE, TEXT, BITMAPTEXT, GROUP, BUFFERED_GROUP, SPRITEANIMATION, ROUNDED_RECTANGLE, POLYGON, TILING_SPRITE
2828
}
2929

3030
Entity() {

engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/GraphicEntityModule.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ public Rectangle createRectangle() {
261261
newEntity(c);
262262
return c;
263263
}
264-
264+
265265
/**
266266
* Creates a new RoundedRectangle entity, its graphical counterpart will be created on the frame currently being computed.
267267
*
@@ -272,7 +272,7 @@ public RoundedRectangle createRoundedRectangle() {
272272
newEntity(c);
273273
return c;
274274
}
275-
275+
276276
/**
277277
* Creates a new Polygon entity, its graphical counterpart will be created on the frame currently being computed.
278278
*
@@ -360,6 +360,17 @@ public SpriteAnimation createSpriteAnimation() {
360360
return c;
361361
}
362362

363+
/**
364+
* Creates a new TilingSprite entity, its graphical counterpart will be created on the frame currently being computed.
365+
*
366+
* @return the entity. Modify its properties to animate the graphical counterpart.
367+
*/
368+
public TilingSprite createTilingSprite() {
369+
TilingSprite c = new TilingSprite();
370+
newEntity(c);
371+
return c;
372+
}
373+
363374
private void newEntity(Entity<?> e) {
364375
lockWorld = true;
365376
entities.add(e);

engine/modules/entities/src/main/java/com/codingame/gameengine/module/entities/Serializer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ class Serializer {
6868
keys.put("points", "ps");
6969
keys.put("skewX", "kx");
7070
keys.put("skewY", "ky");
71+
keys.put("tileX", "tx");
72+
keys.put("tileY", "ty");
73+
keys.put("tileScaleX", "tsx");
74+
keys.put("tileScaleY", "tsy");
7175

7276
commands = new HashMap<>();
7377
commands.put("CREATE", "C");
@@ -99,6 +103,7 @@ class Serializer {
99103
types.put(Type.BITMAPTEXT, "X");
100104
types.put(Type.SPRITEANIMATION, "A");
101105
types.put(Type.POLYGON, "P");
106+
types.put(Type.TILING_SPRITE, "D");
102107

103108
if (keys.values().stream().distinct().count() != keys.values().size()) {
104109
throw new RuntimeException("Duplicate keys");
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.codingame.gameengine.module.entities;
2+
3+
/**
4+
* A TilingSprite is a graphical entity which displays a tiling image. That image must be loaded into the viewer's texture cache, which you can
5+
* configure by adding files to the <code>assets</code> folder of your game's project.
6+
*/
7+
public class TilingSprite extends SpriteBasedEntity<TilingSprite> {
8+
9+
private int tileX, tileY;
10+
private double tileScaleX = 1, tileScaleY = 1;
11+
12+
@Override
13+
Entity.Type getType() {
14+
return Entity.Type.TILING_SPRITE;
15+
}
16+
17+
public TilingSprite setTileX(int tileX) {
18+
return setTileX(tileX, null);
19+
}
20+
21+
public TilingSprite setTileX(int tileX, Curve curve) {
22+
this.tileX = tileX;
23+
set("tileX", tileX, curve);
24+
return this;
25+
}
26+
27+
public TilingSprite setTileY(int tileY) {
28+
return setTileY(tileY, null);
29+
}
30+
31+
public TilingSprite setTileY(int tileY, Curve curve) {
32+
this.tileY = tileY;
33+
set("tileY", tileY, curve);
34+
return this;
35+
}
36+
37+
public TilingSprite setTileScale(double tileScale) {
38+
return setTileScale(tileScale, null);
39+
}
40+
41+
public TilingSprite setTileScale(double tileScale, Curve curve) {
42+
setTileScaleX(tileScale, curve);
43+
setTileScaleY(tileScale, curve);
44+
return this;
45+
}
46+
47+
public TilingSprite setTileScaleX(double tileScaleX) {
48+
return setTileScaleX(tileScaleX, null);
49+
}
50+
51+
public TilingSprite setTileScaleX(double tileScaleX, Curve curve) {
52+
this.tileScaleX = tileScaleX;
53+
set("tileScaleX", tileScaleX, curve);
54+
return this;
55+
}
56+
57+
public TilingSprite setTileScaleY(double tileScaleY) {
58+
return setTileScaleY(tileScaleY, null);
59+
}
60+
61+
public TilingSprite setTileScaleY(double tileScaleY, Curve curve) {
62+
this.tileScaleY = tileScaleY;
63+
set("tileScaleY", tileScaleY, curve);
64+
return this;
65+
}
66+
67+
public int getTileX() {
68+
return tileX;
69+
}
70+
71+
public int getTileY() {
72+
return tileY;
73+
}
74+
75+
public double getTileScaleX() {
76+
return tileScaleX;
77+
}
78+
79+
public double getTileScaleY() {
80+
return tileScaleY;
81+
}
82+
83+
}

engine/modules/entities/src/main/resources/view/entity-module/Command.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ const PROPERTY_KEY_MAP = {
4343
d: 'duration',
4444
bw: 'baseWidth',
4545
bh: 'baseHeight',
46-
ps: 'points'
46+
ps: 'points',
47+
tx: 'tileX',
48+
ty: 'tileY',
49+
tsx: 'tileScaleX',
50+
tsy: 'tileScaleY'
4751
}
4852

4953
export class CreateCommand {

engine/modules/entities/src/main/resources/view/entity-module/EntityFactory.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { BufferedGroup } from './BufferedGroup.js'
99
import { SpriteAnimation } from './SpriteAnimation.js'
1010
import { RoundedRectangle } from './RoundedRectangle.js';
1111
import { Polygon } from './Polygon.js';
12+
import { TilingSprite } from './TilingSprite.js';
1213

1314
export class EntityFactory {
1415
static create (type) {
@@ -23,7 +24,8 @@ export class EntityFactory {
2324
B: BufferedGroup,
2425
A: SpriteAnimation,
2526
K: RoundedRectangle,
26-
P: Polygon
27+
P: Polygon,
28+
D: TilingSprite
2729
}[type]
2830
if (!EntityClass) {
2931
throw new Error('Exception: entity type not found: ' + type)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { SpriteBasedEntity } from './SpriteBasedEntity.js'
2+
3+
/* global PIXI */
4+
5+
export class TilingSprite extends SpriteBasedEntity {
6+
constructor () {
7+
super()
8+
Object.assign(this.defaultState, {
9+
tileX: 0,
10+
tileY: 0,
11+
tileScaleX: 1,
12+
tileScaleY: 1
13+
})
14+
}
15+
16+
initDisplay () {
17+
super.initDisplay()
18+
this.graphics = new PIXI.extras.TilingSprite(PIXI.Texture.EMPTY)
19+
}
20+
21+
updateDisplay (state, changed, globalData) {
22+
super.updateDisplay(state, changed, globalData)
23+
24+
this.graphics.tilePosition.x = state.tileX
25+
this.graphics.tilePosition.y = state.tileY
26+
this.graphics.tileScale.x = state.tileScaleX
27+
this.graphics.tileScale.y = state.tileScaleY
28+
}
29+
}

0 commit comments

Comments
 (0)