65.9K
CodeProject 正在变化。 阅读更多。
Home

MarbleMaze

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2013年7月24日

CPOL

3分钟阅读

viewsIcon

17410

传统的游戏变得更加有趣。

引言

这个应用程序的想法属于 All-in-One: Games(多合一:游戏) 类别。

MarbleMaze(弹珠迷宫) 是一款游戏,目标是通过避开障碍物到达目的地。它基于设备的运动传感器(加速计),您必须管理您的运动传感器,以防止您的弹珠掉入洞中。随着级别的增加,复杂性也会增加,到达目的地的时间会减少。这将使游戏更加有趣。任何人都可以挑战其他玩家在固定的时间内到达目的地,如果失败,他/她就输掉游戏。

 

 

将有一个选项可以与您所在地区的玩家或国际玩家竞争。借助 GPS,它将搜索特定公里范围内所有想玩的玩家,这样用户就可以自由地与地区或国际玩家一起玩。这只是解释游戏想法的示例图片。更好的游戏设计正在建设中,并将很快上传。 

主要特点 

  • 超过 50 个级别可以玩。
  • 区域和国际高分榜,以便用户能够更好地了解他/她的排名
  • 一些有用的技巧来提高排名。
  • 更好的 UI 设计
  • 使用 Windows 运行时处理来自加速计、触摸、鼠标和游戏控制器的输入。 
  • 三种模式:训练、初级、专家

附加功能 

  • 背景音乐
  • 播放和混合音效
  • 不同的颜色弹珠。

使用代码 

我将使用 C# 开发这个游戏。

处理加速计输入

它展示了 Update 方法如何轮询加速计并更新组合的输入值。  

// for sensors. const float acceleromterScalingFactor = 3.5f;
if (m_accelerometer != nullptr)
{
    Windows::Devices::Sensors::AccelerometerReading^ reading =
        m_accelerometer->GetCurrentReading();

    if (reading != nullptr)
    {
        combinedTiltX += static_cast<float>(reading->AccelerationX) * acceleromterScalingFactor;
        combinedTiltY += static_cast<float>(reading->AccelerationY) * acceleromterScalingFactor;
    }
}

检测触摸和鼠标输入

当用户触摸或单击时,会选择一个菜单项。m_pointQueue 跟踪用户触摸或单击屏幕的位置。如果按下任何按钮,则会更新游戏状态。

// Check whether the user choose a button from the UI.
bool anyPoints = !m_pointQueue.empty();
while (!m_pointQueue.empty())
{
       UserInterface::GetInstance().HitTest(m_pointQueue.front());
       m_pointQueue.pop();
}
// Update the game state if any button was pressed
if (m_startGameButton.IsPressed())
{
    SetGameState(GameState::PreGameCountdown);
    m_startGameButton.SetPressed(false);
}
if (m_highScoreButton.IsPressed())
{
    SetGameState(GameState::HighScoreDisplay);
    m_highScoreButton.SetPressed(false);
}    

暂停、恢复和重新启动功能

当用户切换离开游戏时,游戏会暂停,并且游戏会保存当前游戏状态并暂停音频播放。 当应用程序恢复时,游戏会恢复音频播放。 当应用程序关闭并在稍后重新启动时,游戏会从其先前的状态恢复。 为了支持暂停和恢复,Marble Maze 定义了 PersistentState 类。

ref class PersistentState
{
public:
    void Initialize(
        _In_ Windows::Foundation::Collections::IPropertySet^ m_settingsValues,
        _In_ Platform::String^ key
        );

    void SaveBool(Platform::String^ key, bool value);
    void SaveInt32(Platform::String^ key, int value);
    void SaveSingle(Platform::String^ key, float value);
    void SaveXMFLOAT3(Platform::String^ key, DirectX::XMFLOAT3 value);
    void SaveString(Platform::String^ key, Platform::String^ string);

    bool LoadBool(Platform::String^ key, bool defaultValue);
    int  LoadInt32(Platform::String^ key, int defaultValue);
    float LoadSingle(Platform::String^ key, float defaultValue);
    DirectX::XMFLOAT3 LoadXMFLOAT3(Platform::String^ key, DirectX::XMFLOAT3 defaultValue);
    Platform::String^ LoadString(Platform::String^ key, Platform::String^ defaultValue);

private:
    Platform::String^ m_keyName;
    Windows::Foundation::Collections::IPropertySet^ m_settingsValues;
};

MarbleMaze 类包含一个 PersistentState 对象。 MarbleMaze 构造函数初始化此对象,并将本地应用程序数据存储提供为后备数据存储。

m_persistentState = ref new PersistentState();
m_persistentState->Initialize(ApplicationData::Current-> 

播放背景音乐

if (!m_audio.m_isAudioStarted)
{
    m_audio.Start();
} 

OnSuspending 方法保存游戏状态并暂停音频。

void MarbleMaze::OnSuspending()
{
    SaveState();
    m_audio.SuspendAudio();
} 

由于此应用程序将从头开始构建,并且处于开发阶段,因此概念、设计 (UI) 和代码的所有方面将尽快上传。 

背景  

我开发 MarbleMaze 的想法来自于我之前为其他手机开发的游戏。 我已经为 Qt 手机开发了这个游戏,并将相同的逻辑应用于为 Windows 8 桌面开发游戏,并具有高级和一些新功能。 

由于我过去两年一直是微软学生合作伙伴。 所以,我从一些 MSP 和 MVP 那里学到了很多。 他们正在帮助我设计和编码。 我也在从 MSDN 网站学习和编写这个应用程序。

请求

您的评论非常有价值,可以帮助我纠正问题并改进我的应用程序,所以请评论这篇文章并帮助我为社会提供一个有价值的游戏。 非常感谢。

© . All rights reserved.