/
arti4
/
IndividualProject
Обзор
Документация
Войти
/
arti4
/
IndividualProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
MyGame/app/src/main/java/com/example/mygame/RoadGenerator.java
314 строк
11 KB
arti4
upload files
18 ноя 2025, 12:41
18 ноя 2025, 12:41
f3a2f8a
Код
Авторство
О чём код?
package com.example.mygame; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; public class RoadGenerator { private int screenWidth; private float scaleFactor; private int roadFillColor = Color.BLACK; private int roadStrokeColor = Color.GRAY; public RoadGenerator(int screenWidth, float scaleFactor) { this.screenWidth = screenWidth; this.scaleFactor = scaleFactor; } public Bitmap generateRoadSegment(int type) { int width, height; if (type == 5) { width = (int)(600 * scaleFactor); height = (int)(400 * scaleFactor); } else if (type == 4) { width = (int)(600 * scaleFactor); height = (int)(400 * scaleFactor); } else if (type == 6) { width = (int)(800 * scaleFactor); height = (int)(800 * scaleFactor); } else if (type == 3) { width = (int)(350 * scaleFactor); height = (int)(450 * scaleFactor); } else { width = (int)(350 * scaleFactor); height = (int)(200 * scaleFactor); } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); switch (type) { case 0: // Обычная дорога drawNormalRoad(canvas, width, height); break; case 1: // Трамплин drawRamp(canvas, width, height); break; case 2: // Препятствие drawObstacle(canvas, width, height); break; case 3: // Молот drawHammer(canvas, width, height); break; case 4: // Движущаяся платформа break; case 5: // Длинный трамплин drawLongRamp(canvas, width, height); break; } return bitmap; } private void drawDirectionArrowsAtEnd(Canvas canvas, int width, int height, Paint paint) { paint.setColor(Color.YELLOW); paint.setStrokeWidth(3 * scaleFactor); paint.setStyle(Paint.Style.STROKE); int arrowCount = 3; float arrowStartX = width * 0.7f; float arrowSpacing = (width * 0.3f) / (arrowCount + 1); for (int i = 1; i <= arrowCount; i++) { float x = arrowStartX + i * arrowSpacing; float y = height * 0.5f; Path arrow = new Path(); arrow.moveTo(x - 15 * scaleFactor, y - 10 * scaleFactor); arrow.lineTo(x, y + 10 * scaleFactor); arrow.lineTo(x + 15 * scaleFactor, y - 10 * scaleFactor); canvas.drawPath(arrow, paint); } } private void drawDirectionArrows(Canvas canvas, int width, int height, Paint paint) { paint.setColor(Color.YELLOW); paint.setStrokeWidth(3 * scaleFactor); paint.setStyle(Paint.Style.STROKE); int arrowCount = 5; float arrowSpacing = width / (arrowCount + 1); for (int i = 1; i <= arrowCount; i++) { float x = i * arrowSpacing; float y = height * 0.7f; Path arrow = new Path(); arrow.moveTo(x - 15 * scaleFactor, y - 10 * scaleFactor); arrow.lineTo(x, y + 10 * scaleFactor); arrow.lineTo(x + 15 * scaleFactor, y - 10 * scaleFactor); canvas.drawPath(arrow, paint); } } public void setColorScheme(int fillColor, int strokeColor) { this.roadFillColor = fillColor; this.roadStrokeColor = strokeColor; } private void drawNormalRoad(Canvas canvas, int width, int height) { Paint paint = new Paint(); int roadHeight = (int)(35 * scaleFactor); int roadTop = height - roadHeight; paint.setColor(roadFillColor); paint.setStyle(Paint.Style.FILL); canvas.drawRect(0, roadTop, width, height, paint); paint.setColor(roadStrokeColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(15 * scaleFactor); canvas.drawLine(0, roadTop, width, roadTop, paint); canvas.drawLine(0, height, width, height, paint); } private void drawRamp(Canvas canvas, int width, int height) { Paint paint = new Paint(); paint.setColor(Color.TRANSPARENT); canvas.drawRect(0, 0, width, height, paint); Paint rampPaint = new Paint(); rampPaint.setColor(roadFillColor); Path rampPath = new Path(); float leftBottom = height; float leftTop = height - 35 * scaleFactor; float rightBottom = height; float rightTop = height * 0.05f; rampPath.moveTo(0, leftBottom); rampPath.lineTo(0, leftTop); rampPath.lineTo(width, rightTop); rampPath.lineTo(width, rightBottom); rampPath.close(); canvas.drawPath(rampPath, rampPaint); paint.setColor(roadStrokeColor); paint.setStrokeWidth(20 * scaleFactor); paint.setStyle(Paint.Style.STROKE); canvas.drawLine(0, leftTop, width, rightTop, paint); canvas.drawLine(0, leftBottom, width, rightBottom, paint); } private void drawLongRamp(Canvas canvas, int width, int height) { Paint paint = new Paint(); Paint rampPaint = new Paint(); rampPaint.setColor(roadFillColor); Path rampPath = new Path(); float leftBottom = height; float leftTop = height - 35 * scaleFactor; float rightBottom = height; float rightTop = height * 0.02f; rampPath.moveTo(0, leftBottom); rampPath.lineTo(0, leftTop); rampPath.lineTo(width, rightTop); rampPath.lineTo(width, rightBottom); rampPath.close(); canvas.drawPath(rampPath, rampPaint); paint.setColor(roadStrokeColor); paint.setStrokeWidth(20 * scaleFactor); paint.setStyle(Paint.Style.STROKE); canvas.drawLine(0, leftTop, width, rightTop, paint); canvas.drawLine(0, leftBottom, width, rightBottom, paint); } private void drawObstacle(Canvas canvas, int width, int height) { Paint paint = new Paint(); paint.setColor(roadFillColor); int roadHeight = (int)(35 * scaleFactor); int roadTop = height - roadHeight; canvas.drawRect(0, roadTop, width, height, paint); paint.setColor(roadStrokeColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(15 * scaleFactor); canvas.drawLine(0, roadTop, width, roadTop, paint); canvas.drawLine(0, height, width, height, paint); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.RED); float triangleHeight = 60 * scaleFactor; float triangleBase = 40 * scaleFactor; float triangleY = height - 25 * scaleFactor; int triangleCount = (int)(width / triangleBase); float startX = (width - (triangleCount * triangleBase)) / 2; for (int i = 0; i < triangleCount; i++) { float x = startX + i * triangleBase; Path triangle = new Path(); triangle.moveTo(x, triangleY); triangle.lineTo(x + triangleBase / 2, triangleY - triangleHeight); triangle.lineTo(x + triangleBase, triangleY); triangle.close(); canvas.drawPath(triangle, paint); paint.setColor(Color.DKGRAY); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(2 * scaleFactor); canvas.drawPath(triangle, paint); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.RED); } } private void drawHammer(Canvas canvas, int width, int height) { Paint paint = new Paint(); paint.setColor(roadFillColor); int roadHeight = (int)(35 * scaleFactor); int roadTop = height - roadHeight; canvas.drawRect(0, roadTop, width, height, paint); paint.setColor(roadStrokeColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(15 * scaleFactor); canvas.drawLine(0, roadTop, width, roadTop, paint); canvas.drawLine(0, height, width, height, paint); paint.setColor(Color.GRAY); int baseWidth = (int)(80 * scaleFactor); int baseHeight = (int)(60 * scaleFactor); int baseX = (width - baseWidth) / 2; int baseY = height - baseHeight; canvas.drawRect(baseX, baseY, baseX + baseWidth, baseY + baseHeight, paint); paint.setColor(Color.DKGRAY); int poleWidth = (int)(20 * scaleFactor); int poleHeight = (int)(180 * scaleFactor) + (int)(50 * scaleFactor); int poleX = baseX + (baseWidth - poleWidth) / 2; int poleY = baseY - poleHeight; canvas.drawRect(poleX, poleY, poleX + poleWidth, baseY, paint); paint.setColor(Color.RED); int headWidth = (int)(100 * scaleFactor); int headHeight = (int)(40 * scaleFactor); int headX = poleX + (poleWidth - headWidth) / 2; int headY = poleY - headHeight; canvas.drawRect(headX, headY, headX + headWidth, headY + headHeight, paint); paint.setColor(Color.argb(255, 150, 150, 150)); int metalWidth = (int)(80 * scaleFactor); int metalHeight = (int)(25 * scaleFactor); int metalX = headX + (headWidth - metalWidth) / 2; int metalY = headY - metalHeight; canvas.drawRect(metalX, metalY, metalX + metalWidth, metalY + metalHeight, paint); } public int getTypeCount() { return 7 ; } public String getTypeName(int type) { switch (type) { case 0: return "ROAD"; case 1: return "LONG RAMP"; case 2: return "OBSTACLE"; case 3: return "HAMMER"; case 4: return "MOVING PLATFORM"; case 5: return "LONG RAMP"; default: return "UNKNOWN"; } } public float getRampAngle() { return 18.4f; } public int getSegmentWidth(int type) { if (type == 1) { return (int)(600 * scaleFactor); } else if (type == 5) { return (int)(900 * scaleFactor); } else { return (int)(350 * scaleFactor); } } public int getSegmentHeight(int type) { if (type == 5) { return (int)(450 * scaleFactor); } else { return (int)(200 * scaleFactor); } } public int getSegmentHeight() { return (int) (200 * scaleFactor); } }