Есть ли лучший способ написания этой структуры данных в Dart? - PullRequest
0 голосов
/ 28 января 2020

Карта в Dart - это таблица ha sh, я прав?

Map starsData = {
        'stars':{   
            'star1': {'x': 0, 'y': 10},
            'star2': {'x': 0, 'y': 10}
        }
};  

Этот объект ниже в JavaScript может быть доступен как таблица ha sh, быстрее !! Я просто хочу сделать некоторые из них в Dart, но я не уверен, что лучше всего использовать Map.

const starsData = {
    stars:{
       'star1': {'x': 0, 'y': 10},
       'star2': {'x': 0, 'y': 10}
    }
};

1 Ответ

1 голос
/ 28 января 2020

Я переписал вашу реализацию JavaScript (на основе проекта, на который вы ссылались: https://github.com/ToniCalfim/fallingstars/blob/master/index.js) в Dart:

Также можно протестировать с: https://dartpad.dev/900989f4e35e5a61200e4ad04ecd399a

import 'dart:html';
import 'dart:math' as math;

const starsDiameter = 1.25;

const colorPallete = [
  'white',
  'yellow',
  'blue',
  'red',
  'orange',
  'turquoise',
  'purple',
  'green',
  'lightblue',
  'lightyellow',
  'lightgreen',
  'darkred',
  'darkblue',
  'darkorange',
  'darkturquoise',
  'darkgreen'
];

final math.Random _rnd = math.Random();
int getRandomNumber(int min, int max) => min + _rnd.nextInt(max - min);

class Star {
  int x, y;

  int positionX = getRandomNumber(2, 650);
  int positionY = getRandomNumber(3, 125);
  double diameter = starsDiameter;

  int pulsing = 0;
  int blinking = 0;

  int timeToFall = getRandomNumber(0, 7500);
  int velocityToFall = getRandomNumber(1, 5);
  int directionToFall = getRandomNumber(-1, 1);

  String color = colorPallete[getRandomNumber(0, colorPallete.length)];

  Star() {
    x = positionX;
    y = positionY;
  }
}

final List<Star> stars = List.generate(175, (_) => Star());

void update() {
  for (final currentStar in stars) {
    final currentTimeToFall = currentStar.timeToFall;

    if (currentTimeToFall != 0) {
      currentStar.timeToFall = currentTimeToFall - 1;
    } else {
      final currentVelocityToFall = currentStar.velocityToFall;
      final currentAngleToFall = currentStar.directionToFall;

      final currentPositionX = currentStar.x;
      final currentPositionY = currentStar.y;

      currentStar.x = currentPositionX + 1 * currentAngleToFall;
      currentStar.y = currentPositionY + currentVelocityToFall;
    }
  }
}

final CanvasElement canvas = querySelector('#canvas') as CanvasElement;
final CanvasRenderingContext2D context2D = canvas.context2D;

void drawStars() {
  context2D.clearRect(
      0, 0, context2D.canvas.width, context2D.canvas.height); // Clear canvas

  for (final currentStar in stars) {
    context2D.beginPath();
    context2D.fillStyle = currentStar.color;
    context2D.arc(currentStar.x, currentStar.y, starsDiameter, 0, 2 * math.pi);
    context2D.fill();
    context2D.closePath();
  }
}

void animateLoop([num highResTime]) {
  update();
  drawStars();
  window.requestAnimationFrame(animateLoop);
}

void main() {
  animateLoop();
}

Просматривая ваш код, я не смог найти никакой причины, по которой звезды должны быть сохранены на карте или в других структурах, связанных с таблицами Ha sh. Вы используете звезды двумя способами: рисовать и обновлять. В обоих случаях вы просто проходите все звёзды, что можно сделать с помощью простого списка и перебирая все элементы.

Я должен добавить, что я не являюсь программистом внешнего интерфейса и действительно не могу судить, То, как вы рисуете 2D-холст, является наиболее эффективным способом сделать это. Мой преобразованный код является лишь попыткой показать, как данные могут быть структурированы в Dart.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...