2013-01-20 42 views
1

我不認爲任何代碼演示將是必要的,因爲它不是很多SFML,因爲它是C++。問題是,我將如何通過屏幕上的某些東西來實現平滑移動?例如,我將一個方塊移動到屏幕上,並且將它定義爲我之前定義的整數的位置變量,以便我可以使用箭頭鍵移動它。當我按下將值添加到變量的鍵時,如果我只使用一個鍵,但按兩個鍵時,它只能增加第二個鍵的值。我將如何使它對角移動?當按下2個箭頭鍵時實現對角線移動(使用SFML)

回答

3

僞代碼

if (key.up()) 
{ 
    if (key.right()) 
     direction = up_right; 
    else if (key.left()) 
     direction = up_left; 
    else 
     direction = up; 
} 
else if (key.down()) 
{ 
    etc... 
+0

非常感謝!這已經完成了這項工作! – Safixk

3

接受的答案是不是很大。

您最好將x和y移動分開存儲,檢查所有按下的鍵並指定實際移動。

x = 0.0; 
y = 0.0; 
speed = 1.0; 

if (key.up()) 
{ 
    y -= speed; 
} 

if (key.down()) 
{ 
    y+= speed; 
} 

if (key.left()) 
{ 
    x -= speed; 
} 

if (key.right()) 
{ 
    x+= speed; 
} 

Move(x, y); 

這應該讓你開始。

當你仔細觀察它時,你會注意到這個代碼有一點點怪癖 - 如果你沿對角線移動,你會發現你移動得太快而且有點作弊!這是因爲兩個單位的速度正在增加,而不僅僅是一個。您可能會認爲解決方案是將每個值減半,但這樣會太慢。當你對角線移動時,你需要考慮三角形和畢達哥拉斯定理 - 你會想要通過以root 2分割兩個方向來進行補償。

0

這對我有用,但像你說的那樣,玩家可能會獲得不公平擁有更現代化的計算機。我採用了變量x和y的平方根,但我不確定這是否可以防止任何不必要的作弊行爲。

float x = 0.0; 
float y = 0.0; 
float speed = 0.35; 

x = std::sqrt(std::pow((double)x, 2) + std::pow((double)y, 2)); 
y = std::sqrt(std::pow((double)x, 2) + std::pow((double)y, 2)); 

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) 
{ 
     source.y = Up; 
     y -= speed; 
} 

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) 
{ 
     source.y = Down; 
     y += speed; 
} 

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) 
{ 
     source.y = Left; 
     x -= speed; 
} 

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) 
{ 
     source.y = Right; 
     x += speed; 
} 

playerImage.move(x, y); 

另外我有一個事件後,我的事件循環比較幀計數器時鐘和幀速度。我的問題是,這個塊是否對上面的代碼有影響,可以防止作弊,如果是的話,我會刪除sqrt語句?

frameCounter = (updateFrame) ? frameCounter + frameSpeed * clock.restart().asSeconds() : 0; 

if(frameCounter >= switchFrame) 
{ 
     frameCounter = 0; 
     source.x++; 
     if(source.x * 32 >= pTexture.getSize().x) 
       source.x = 0; 
} 
相關問題