Dictionary 有没有更好的方法在Dart中编写此数据结构?
Dart中的地图是一个哈希表,对吗Dictionary 有没有更好的方法在Dart中编写此数据结构?,dictionary,dart,structure,Dictionary,Dart,Structure,Dart中的地图是一个哈希表,对吗 Map starsData = { 'stars':{ 'star1': {'x': 0, 'y': 10}, 'star2': {'x': 0, 'y': 10} } }; 下面这个JavaScript对象可以作为哈希表访问,速度更快!!我只想在Dart中做一些,但我不确定是否最好的方法是使用Map const starsData = { stars:{
Map starsData = {
'stars':{
'star1': {'x': 0, 'y': 10},
'star2': {'x': 0, 'y': 10}
}
};
下面这个JavaScript对象可以作为哈希表访问,速度更快!!我只想在Dart中做一些,但我不确定是否最好的方法是使用Map
const starsData = {
stars:{
'star1': {'x': 0, 'y': 10},
'star2': {'x': 0, 'y': 10}
}
};
我已经在Dart中重写了您的JavaScript实现(基于您链接的项目): 也可以通过以下方式进行测试:
导入'dart:html';
导入'dart:math'作为数学;
常数starsDiameter=1.25;
常数colorPallete=[
“白色”,
“黄色”,
“蓝色”,
“红色”,
“橙色”,
“绿松石”,
“紫色”,
“绿色”,
“浅蓝色”,
“浅黄色”,
“浅绿色”,
“黑暗的”,
“暗蓝色”,
“darkorange”,
“黑松石”,
“黑绿色”
];
final math.Random _rnd=math.Random();
int getRandomNumber(int-min,int-max)=>min+\r.nextInt(max-min);
班级明星{
int x,y;
int positionX=getRandomNumber(2650);
int positionY=getRandomNumber(3125);
双直径=标准直径;
int脉冲=0;
int闪烁=0;
int timeToFall=getRandomNumber(07500);
int-velocityToFall=getRandomNumber(1,5);
int directionToFall=getRandomNumber(-1,1);
字符串颜色=colorPallete[getRandomNumber(0,colorPallete.length)];
星(){
x=位置x;
y=位置y;
}
}
最终列表stars=List.generate(175,()=>Star());
无效更新(){
for(星号中的最终当前星号){
最终currentTimeToFall=currentStar.timeToFall;
如果(currentTimeToFall!=0){
currentStar.timeToFall=currentTimeToFall-1;
}否则{
最终currentVelocityToFall=currentStar.velocityToFall;
最终currentAngleToFall=currentStar.directionToFall;
最终currentPositionX=currentStar.x;
最终电流位置y=电流星形y;
currentStar.x=当前位置x+1*当前角度球;
currentStar.y=当前位置y+当前速度下降;
}
}
}
final CanvasElement canvas=querySelector(“#canvas”)作为CanvasElement;
最终CanvasRenderingContext2D=canvas.context2D;
空星(){
context2D.clearRect(
0,0,context2D.canvas.width,context2D.canvas.height);//清除画布
for(星号中的最终当前星号){
context2D.beginPath();
context2D.fillStyle=currentStar.color;
弧(currentStar.x,currentStar.y,starsDiameter,0,2*math.pi);
context2D.fill();
context2D.closePath();
}
}
void animateLoop([num highResTime]){
更新();
drawStars();
window.requestAnimationFrame(animateLoop);
}
void main(){
animateLoop();
}
通过查看您的代码,我看不出为什么星星应该保存在地图或其他哈希表相关结构中。您以两种方式使用星星:绘制和更新。在这两种情况下,您只需要遍历所有的星星,这可以通过使用一个简单的列表并迭代所有元素来完成
我应该补充一点,我不是一个前端程序员,我不能真正判断您绘制2D画布的方式是否是最有效的方式。我转换的代码只是试图展示如何在Dart中构造数据。我编辑了我的问题。我希望你能理解我需要什么。但是我用课堂写下了你的例子。我真的很抱歉,我已经试过多次试图从你的问题中得到任何意义,但是我找不到任何关于你试图完成什么的线索。您提到了哈希表,但没有说明如何访问对象。请提供一个示例,说明您想要做什么,并说明您自己提出的解决方案不起作用的原因。你想不想通过名字访问一颗星星?非常感谢!!别担心!!使用哈希表查看我在JS中的完整代码:更新了我的答案JuleMand101,这对我很有用。昨天,我使用Ameiva Lib编写了一个版本的FallingStars,我开始这个项目只是为了学习创建Dart Lib和管理项目。如果你想合作就好!!!这是我的FallingStars版本:
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();
}