- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我很难理解如何像在小行星克隆中那样移动我的宇宙飞船。当我旋转宇宙飞船时,我可以沿着世界 y 轴移动它,但不能在它自己的相对 y 轴内向前移动它。我已经评论了 if 语句用于飞船运动的代码。它位于 update() 方法的底部附近。感谢您的任何建议。
#include "Game.h"
Game::Game()
: mUColorProgram(0)
, mVColorProgram(0)
, mAsteroid(NULL)
, mSpaceship(NULL)
, mManualRotation(0.0f)
, mManualTranslation(0.0f, 0.0f, 0.0f)
, mSpinnerAngle(0.0f)
, mSpinnerAngularVelocity(glm::radians(90.0f))
, mMinX(-1.0f)
, mMinY(-1.0f)
, mMaxX(1.0f)
, mMaxY(1.0f)
, mBouncerPosition(0.0f, 0.0f, 0.0f)
, mBouncerVelocity(0.0f, 0.0f, 0.0f)
, mMinScale(0.5f)
, mMaxScale(5.0f)
, mCurrScale(mMinScale)
, mScalingSpeed(2.0f)
, mBlendColor1(1.0f, 1.0f, 0.0f, 1.0f)
, mBlendColor2(1.0f, 0.0f, 0.0f, 1.0f)
, mAlpha(1.0f)
, mBlendSpeed(-0.5f)
, mBlendedColor(mAlpha * mBlendColor1 + (1 - mAlpha) * mBlendColor2)
{
glsh::InitRandom(); // initialize random number generator
mBouncerPosition.x = glsh::Random(mMinX, mMaxX);
mBouncerPosition.y = glsh::Random(mMinY, mMaxY);
float angle = glm::radians(glsh::Random(-180.0f, 180.0f));
float speed = 0.75f;
mBouncerVelocity.x = speed * std::cos(angle);
mBouncerVelocity.y = speed * std::sin(angle);
}
Game::~Game()
{
}
void Game::initialize(int w, int h)
{
// set clearing (background) color
glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
// import some symbols from glsh namespace
using glsh::VertexPositionColor;
// define triangle mesh data (positions only)
VertexPositionColor asteroid[] = {
VertexPositionColor(0.0f, 0.40, 0.0f, 0.9f, 0.9f, 0.9f, 1.0f),
VertexPositionColor(0.0f, 0.4f, 0.0f, 0.9f, 0.9f, 0.9f, 1.0f),
VertexPositionColor(-0.3f, 0.3f, 0.0f, 0.9f, 0.9f, 0.9f, 1.0f),
VertexPositionColor(-0.4f, 0.0f, 0.0f, 0.9f, 0.9f, 0.9f, 1.0f),
VertexPositionColor(-0.1f, -0.3f, 0.0f, 0.9f, 0.9f, 0.9f, 1.0f),
VertexPositionColor(0.1f, -0.4f, 0.0f, 0.9f, 0.9f, 0.9f, 1.0f),
VertexPositionColor(0.3f, -0.2f, 0.0f, 0.9f, 0.9f, 0.9f, 1.0f),
VertexPositionColor(0.4f, 0.2f, 0.0f, 0.9f, 0.9f, 0.9f, 1.0f),
VertexPositionColor(0.1f, 0.5f, 0.0f, 0.9f, 0.9f, 0.9f, 1.0f),
};
// define quad mesh data (positions and colors)
VertexPositionColor spaceship[] = {
VertexPositionColor(0.0f, 0.5f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f),
VertexPositionColor(-0.8f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f),
VertexPositionColor(0.8f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f),
VertexPositionColor(0.0f, 0.9f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f),
VertexPositionColor(-0.5f, -0.9f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f),
VertexPositionColor(0.0f, -0.5f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f),
VertexPositionColor(0.0f, 0.9f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f),
VertexPositionColor(0.0f, -0.5f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f),
VertexPositionColor(0.5f, -0.9f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f),
};
// create meshes
mAsteroid = glsh::CreateMesh(GL_TRIANGLE_FAN, asteroid, 9);
mSpaceship = glsh::CreateMesh(GL_TRIANGLES, spaceship, 9);
// build shader programs
mUColorProgram = glsh::BuildShaderProgram("ucolor-vs.glsl", "ucolor-fs.glsl");
mVColorProgram = glsh::BuildShaderProgram("vcolor-vs.glsl", "vcolor-fs.glsl");
}
void Game::shutdown()
{
delete mAsteroid;
delete mSpaceship;
glUseProgram(0);
glDeleteProgram(mUColorProgram);
glDeleteProgram(mVColorProgram);
}
void Game::resize(int w, int h)
{
glViewport(0, 0, w, h);
}
void Game::draw()
{
glClear(GL_COLOR_BUFFER_BIT);
// activate the per-vertex color shader program
glUseProgram(mVColorProgram);
T = glsh::CreateTranslation(mBouncerPosition);
R = glsh::CreateRotationZ(mSpinnerAngle);
S = glsh::CreateScale(0.1f, 0.1f, 0.1f);
glsh::SetShaderUniform("u_Transform", T * R * S);
mAsteroid->draw();
T = glsh::CreateTranslation(mManualTranslation);
R = glsh::CreateRotationZ(mManualRotation);
S = glsh::CreateScale(0.1f, 0.1f, 0.1f);
glsh::SetShaderUniform("u_Transform", T * R * S);
mSpaceship->draw();
}
bool Game::update(float dt)
{
const glsh::Keyboard* kb = getKeyboard();
if (kb->keyPressed(glsh::KC_ESCAPE)) {
return false; // exit
}
// Rotation of spaceship
if (kb->isKeyDown(glsh::KC_LEFT)) {
mManualRotation += 3.0f * dt;
}
else if (kb->isKeyDown(glsh::KC_RIGHT)) {
mManualRotation -= 3.0f * dt;
}
// SPACESHIP MOVEMENT
// Translation of spaceship
if (kb->isKeyDown(glsh::KC_UP)) {
mManualTranslation.y += 0.5f * dt;
}
else if (kb->isKeyDown(glsh::KC_DOWN)) {
mManualTranslation.y -= 0.5f * dt;
}
// update spinner angle
mSpinnerAngle += dt * mSpinnerAngularVelocity;
// keep the angle in standard range
if (mSpinnerAngle > 180.0f) {
mSpinnerAngle -= 360.0f;
} else if (mSpinnerAngle < -180.0f) {
mSpinnerAngle += 360.0f;
}
// update bouncer position
mBouncerPosition += dt * mBouncerVelocity;
// bounce off of the horizontal boundaries of the screen
if ((mBouncerVelocity.x > 0 && mBouncerPosition.x > mMaxX) ||
(mBouncerVelocity.x < 0 && mBouncerPosition.x < mMinX))
{
mBouncerVelocity.x *= -1;
}
// bounce off of the vertical boundaries of the screen
if ((mBouncerVelocity.y > 0 && mBouncerPosition.y > mMaxY) ||
(mBouncerVelocity.y < 0 && mBouncerPosition.y < mMinY))
{
mBouncerVelocity.y *= -1;
}
return true;
}
最佳答案
您似乎在移动代码中缺少正弦和余弦函数。您目前使用 mManualTranslation
所做的只是更新 Y 坐标,而我想您还希望宇宙飞船在水平轴上移动。为此,您必须使用正弦和余弦。
if (kb->isKeyDown(glsh::KC_UP)) {
mManualTranslation.x += std::cos(mManualRotation) * 0.5f * dt;
mManualTranslation.y += std::sin(mManualRotation) * 0.5f * dt;
}
else if (kb->isKeyDown(glsh::KC_DOWN)) {
mManualTranslation.x -= std::cos(mManualRotation) * 0.5f * dt;
mManualTranslation.y -= std::sin(mManualRotation) * 0.5f * dt;
}
另外请记住,在使用度数表示角度时要小心(正如您看起来所做的那样),因为标准数学函数假定参数以弧度为单位。
关于C++ Asteroids Clone - 宇宙飞船运动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26596268/
实际上,我正在编写一个小型太空射击游戏(2.5D,俯 View )。玩家可以沿着 XZ 轴移动并通过右侧的迷你摇杆(游戏 handle )旋转宇宙飞船或查看光标位置(键盘 + 鼠标)。 因此,运动和旋
这里是初级程序员,只是想了解Ruby背后的过程sort使用飞船操作符时的方法 .希望有人能帮忙。 在以下内容中: array = [1, 2, 3] array.sort { |a, b| a b
什么是 Ruby (宇宙飞船)运算符(operator)?该运算符是否由任何其他语言实现? 最佳答案 spaceship operator将返回 1、0 或 −1,具体取决于左侧参数相对于右侧参数的
我想在 window 的中央画一艘宇宙飞船,因为它在太空中提供动力。为了滚动世界窗口,我计算了飞船的新位置,并使用 glOrtho 将一个 4000x3000 的窗口居中。我的测试是按下前进按钮并向上
我是一名优秀的程序员,十分优秀!