рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдо рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред рднрд╛рдЧ рек

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!

рдЪреМрдерд╛ рднрд╛рдЧ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ, рдореИрдВ рд▓реЗрдЬрд░ рдЧрди, рджрд░реНрдкрдг рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдХреГрдкрдпрд╛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХреЛ рдкрдврд╝реЗрдВред

рднрд╛рдЧ 1
рднрд╛рдЧ реи
рднрд╛рдЧ рей

рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ?

рдЪрд░рдг 1. рд╕реАрдорд╛рдПрдБред
рдЪрд▓реЛ рдереЛрдбрд╝реА рджреВрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдХ рдЖрджрд░реНрд╢ рд▓реЗрдЬрд░ рдкреНрд░рдХрд╛рд╢ рдХреА рдЧрддрд┐ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЗрд╕рдХреЗ рдорд╛рд░реНрдЧ рдореЗрдВ рдХреЛрдИ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрднреА рднреА рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░рд╛ рд▓реЗрдЬрд╝рд░рд▓рд╛рдЗрди рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рд╕реЗ рдмрд╛рд╣рд░ "рдЙрдбрд╝рд╛рди" рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, GameObjectsMap рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
public static boolean outOfArea(Point pos) {
return pos.x < 0 || pos.y < 0 || pos.x > WIDTH - 1
|| pos.y > HEIGHT - 1;
}


* This source code was highlighted with Source Code Highlighter .

рд╣рдо рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рд▓реЗрдЬрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред
рдЪрд░рдг 2. рд▓реЗрдЬрд░рдЧреБрдиред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд▓реЗрдЬрд░ рд╡рд░реНрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓реЗрдЬрд░ рдмрдВрджреВрдХ рд╡рд░реНрдЧ рдерд╛ рдЬреЛ рд▓реЗрдЬрд░ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЛ рдШреБрдорд╛ рдФрд░ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ:

private LaserLine mLaserLine;

рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

mLaserLine = new LaserLine(new Point(posX, posY), angle);

рдЕрдиреБрд▓рдЧреНрдирдХ рд╡рд┐рдзрд┐ рдореЗрдВ, рдЬреЛрдбрд╝реЗрдВ:

scene.getChild(GameObjectsMap.LASER_LAYER).attachChild(mLaserLine);

рдЦреИрд░, рдЕрдм рд╣рдорд╛рд░реА рдмрдВрджреВрдХ рдореЗрдВ рдПрдХ рд▓реЗрдЬрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЙрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕реЗ рдЕрдВрдХреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рдкреВрдЫрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╣ рдкрд╛рд╕ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LaserGun рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВ:
public void buildLaser(GameObject[][] map) {
mLaserLine.setAngle(getAngle());
mLaserLine.build(map);
}


* This source code was highlighted with Source Code Highlighter .


рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдЬрд░ рдкрде рдкреНрд░рд╛рд░рдВрднрд┐рдХ рджрд┐рд╢рд╛ рдФрд░ рдЙрд╕рдХреЗ рдкрде рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдирдХреНрд╢реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд▓реЗрдХрд┐рди LaserLine.build () рд╡рд┐рдзрд┐ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдЙрд╕рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░реЛред
public void build(GameObject[][] map) {
sBuilder.buildPath( this , map);
buildLines();
}


* This source code was highlighted with Source Code Highlighter .

рд╡рд┐рдзрд┐ рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрднреА рддрдХ sBuilder рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХреА рд╣реИред рдЫрд┐рдкрд╛ рд╣реБрдЖ рдЬрд╛рджреВ рд╣реИред LaserLine рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:

private static LaserLineBuilder sBuilder = new LaserLineBuilder();

рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХреЙрдкреА рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬреЛ рд╣рдореЗрдВ рдХреБрдЫ рдореЗрдореЛрд░реА рдмрдЪрд╛рдПрдЧреА рдФрд░ рдЧрддрд┐ рдкрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓реЗрдЧреАред

рдЪрд░рдг 3. LaserBuilder
рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рд▓реЗрдЬрд░ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
public class LaserLineBuilder {

private static final int MAX_STEPS = 200;

public void buildPath(LaserLine laserLine, GameObject[][] map) {
laserLine.clearPoints();
int step = 0;
int angle = laserLine.getAngle();
Point position = new Point(laserLine.getStartPosition());
GameObject gameObject;
while (step < MAX_STEPS) {
nextPosition(position, angle);
if (GameObjectsMap.outOfArea(position)) {
laserLine.addPoint(position);
return ;
}
gameObject = map[position.x][position.y];
if (gameObject == null ) {
continue ;
} else {
laserLine.addPoint(position);
int reflection = gameObject.onLaser(angle);
if (reflection < 0) {
return ;
} else {
angle = reflection;
}
}
}
laserLine.addPoint(position);
}

private void nextPosition(Point position, final int angle) {
switch (angle) {
case DynamicGameObject.DEG_0:
position.x++;
break ;
case DynamicGameObject.DEG_90:
position.y++;
break ;
case DynamicGameObject.DEG_180:
position.x--;
break ;
case DynamicGameObject.DEG_270:
position.y--;
break ;
case DynamicGameObject.DEG_45:
position.x++;
position.y++;
break ;
case DynamicGameObject.DEG_135:
position.x--;
position.y++;
break ;
case DynamicGameObject.DEG_225:
position.x--;
position.y--;
break ;
case DynamicGameObject.DEG_315:
position.x++;
position.y--;
break ;
default :
break ;
}
}
}


* This source code was highlighted with Source Code Highlighter .

рдХреНрд░рдо рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред 200 рд▓реЗрдЬрд░ рдЪрд░рдгреЛрдВ рдХреА рд╕реАрдорд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХреНрдпреЛрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рд▓реЗ рд▓реЗрдЬрд░ рдмрд┐рдВрджреБ рдХреЛ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓реЗрдЬрд░рдЧрдВрдЬ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╢реЗрд╖ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЦреЗрд▓ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╕рдордп рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рд░реЛрдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рдЕрдВрдХ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ, рдорд┐рд░рд░реНрд╕ рднреВрд▓рднреБрд▓реИрдпрд╛ рдореЗрдВ рдпрд╣ рдЕрднреА рднреА рдЗрд╕ рддрд░рд╣ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдВ рдПрдВрдбрдЧреНрд╡рд┐рди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЕрдЧрд▓рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред

рдЪрд░рдг 4. рджрд░реНрдкрдгред
рдЕрдм рддрдХ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реА рд╡рд╕реНрддреБрдПрдВ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рд▓реЗрдЬрд╝рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рдЕрдм рд╣рдореЗрдВ рдПрдХ рдРрд╕рд╛ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рд╡рд╛рдВрдЫрд┐рдд рдмрдирд╛рд╡рдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред
public class Mirror extends DynamicGameObject {

public Mirror(final int posX, final int posY, final int angle,
final TextureRegion region) {
super(posX, posY, angle, region);
}

@Override
void attachTo(Scene scene) {
scene.getChild(GameObjectsMap.GAME_OBJECTS_LAYER).attachChild(
getSprite());
}

@Override
int onLaser( int angle) {
int a = getAngle() % 4;
if (angle == (a + 1) % 8) return (a + 7) % 8;
if (angle == (a + 7) % 8) return (a + 1) % 8;
if (angle == (a + 3) % 8) return (a + 5) % 8;
if (angle == (a + 5) % 8) return (a + 3) % 8;
return -1;
}

}


* This source code was highlighted with Source Code Highlighter .

рдПрдХ рдирдпрд╛ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╣рдо рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рдкрд╛рдардХ рдкрд░ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ рдХрд┐ рдСрдирд╕реНрд▓рд░ рд╡рд┐рдзрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЯреВ-рд╡реЗ рдорд┐рд░рд░ рддреИрдпрд╛рд░ рд╣реИред рдпрд╣ GameObjectsMap рдореЗрдВ рдЕрдкрдиреА рд╢реБрд░реБрдЖрдд рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
рдЪрд░рдг 4: рд▓реЗрдЬрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВред
рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, рдЗрд╕ рд╡рд┐рдзрд┐ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
public void add(Type type, final int posH, final int posW, final int angle) {
GameObject object = null ;
switch (type) {
case lasergun:
LaserGun l = new LaserGun(posH, posW, angle, mTextures
.getLaserGun());
mLaserGuns.add(l);
object = l;
break ;
case mirror:
object = new Mirror(posH, posW, angle, mTextures.getMirror());
break ;
case target:

break ;
default :
break ;
}
mMap[posH][posW] = object ;
}


* This source code was highlighted with Source Code Highlighter .

рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЦреБрдж рдХреЛ рджрд░реНрдкрдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдФрд░ рдмрдВрджреВрдХреЛрдВ рдХреЗ рд▓рд┐рдП:

private LinkedList mLaserGuns;
рдФрд░
public void buildLasers() {
for (LaserGun gun : mLaserGuns) {
gun.buildLaser(mMap);
}
}


* This source code was highlighted with Source Code Highlighter .

рдЦреИрд░ рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред рд╕реНрдЯреЗрдЬ рдХреЗ рд╕рд╛рде рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
private void initMap() {
mGameObjectsMap = new GameObjectsMap(mTextures);
mGameObjectsMap.add(Type.lasergun, 0, 0, 3);
mGameObjectsMap.add(Type.lasergun, 3, 2, 7);
mGameObjectsMap.add(Type.lasergun, 3, 4, 4);
mGameObjectsMap.add(Type.mirror, 3, 3, 3);
mGameObjectsMap.addToScene(mEngine.getScene());
mGameObjectsController = new GameObjectsController(mGameObjectsMap, this );
final Scene scene = getEngine().getScene();
mGameObjectsMap.buildLasers();
}


* This source code was highlighted with Source Code Highlighter .

рдирддреАрдЬрддрди, рд╣рдо рдордЬрд╝реЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджреЗрдЦреЗрдВрдЧреЗ:
рдЫрд╡рд┐

рдЖрдЬ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд╕рд╡рд╛рд▓реЛрдВ, рд╕рд▓рд╛рд╣ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред
рд╕реНрд░реЛрдд рдХреЛрдб

Source: https://habr.com/ru/post/In123516/


All Articles