2016-02-11 20 views
0

我正在处理一点空间模拟。在游戏中,您可以放大太阳系外的&。为了发挥这种整齐的松弛效应,我想放大背景中随机放置的starsky。到目前为止,我已经可以工作了,但starsky正在放大左上角。我知道我必须将星星的原点转换为(宽度/ 2,高度/ 2),但我无法弄清楚我是如何做到的。处理:将随机Starfield的中心点移动到中心

下面是代码:

int starCount = 1200; 
float[] xStar = new float[starCount]; 
float[] yStar = new float[starCount]; 
float starSpread; 
float zoom; 

void setup() { 
    size(1600, 900); 
    frameRate(30); 
    calcStars(); 
    zoom = 1; 
} 

void draw() { 
    background(#000000); 
    for(int i=0;i<starCount;i++){ 
    fill(#fff7e6); 
    noStroke(); 
    ellipse(xStar[i]*starSpread,yStar[i]*starSpread,1,1); 
    } 

    starSpread = 1+zoom*0.001; 
} 


void calcStars(){ 
    for(int i=0;i<starCount;i++){ 
    xStar[i] = -random(0-width); 
    } 
    for(int i=0;i<starCount;i++){ 
    yStar[i] = -random(0-height); 
    } 
} 

void mousePressed(){ 
    zoom = zoom - 1; 
} 

(点击鼠标来“放大”了< - 我要天上的星星移动到中间不左上角!)

所以,我有2个数组给我在窗口中1200随机坐标。 “zoom”是一个可以用滑块控制的简单浮点数。这个变量控制着所有内容的传播。它略多于0.001来对我的星星产生影响。

现在有人可以帮助我按照我的意图进行缩放吗?

在此先感谢!

+0

此代码不能编译我 - 你是否错过了几个右括号? –

+0

对不起,是的,我在浏览器实现中遇到了一些问题。这将工作。但由于缺少库文件,滑块不在其中。 (编辑文章) – ThatGuyNextDoor

+0

/编辑点击鼠标多次将“缩放”出来看看我的意思 – ThatGuyNextDoor

回答

0

还有一堆的方法可以做到这一点,但基本的做法是这样的:

步骤1:计算如何远离屏幕的每个明星的中心。

第2步:缩放那个距离。

第3步:绘制每个缩放距离中心点的距离。

int starCount = 1200; 
float[] xStar = new float[starCount]; 
float[] yStar = new float[starCount]; 
float zoom = 1; 

void setup() { 
    size(1600, 900); 
    frameRate(30); 
    calcStars(); 
} 

void draw() { 
    background(#000000); 
    for (int i=0; i<starCount; i++) { 
    fill(#fff7e6); 
    noStroke(); 

    float centerX = width/2.0; 
    float centerY = height/2.0; 

    float xDistFromCenterX = centerX - xStar[i]; 
    float yDistFromCenterY = centerY - yStar[i]; 

    float scaledXDistFromCenterX = zoom * xDistFromCenterX; 
    float scaledYDistFromCenterY = zoom * yDistFromCenterY; 

    ellipse(centerX + scaledXDistFromCenterX, centerY + scaledYDistFromCenterY , 1, 1); 
    } 

} 

void calcStars() { 
    for (int i=0; i<starCount; i++) { 
    xStar[i] = -random(0-width); 
    } 
    for (int i=0; i<starCount; i++) { 
    yStar[i] = -random(0-height); 
    } 
} 

void mousePressed() { 
    zoom = zoom + .1; 
} 

这工作,我认为这是非常接近你要的东西,但你也可以考虑重构你的代码使用Star对象,跟踪其自己的位置。无论何时你想放大,只需告诉每个物体移动。您也可以提前开始绘制图像,然后缩放该图像。就像我说的,有很多方法可以做到这一点。

+0

哇,非常感谢你的快速和完美的答案!这就是我需要的!我曾经是一个紧急解决方案,但我希望事情能够迅速响应并且干净利落;) – ThatGuyNextDoor