2010-04-23 120 views
1

我正在使用一些代碼來創建一個帶箭頭鍵的三角形。我想創建一個獨立移動的第二個對象。這是我遇到麻煩的地方,我創造了第二個演員,但無法讓它移動。有太多的代碼可以發佈,所以我只會發布一下,看看有沒有人可以幫忙。幫助理解一些OpenGL的東西

ogl_test.cpp

#include "platform.h" 
#include "srt/scheduler.h" 

#include "model.h" 
#include "controller.h" 

#include "model_module.h" 
#include "graphics_module.h" 

class blob : public actor { 
public: 
    blob(float x, float y) : actor(math::vector2f(x, y)) { } 

    void render() { 
     transform(); 

     glBegin(GL_TRIANGLES); 
      glVertex3f(0.25f, 0.0f, -5.0f); 
      glVertex3f(-.5f, 0.25f, -5.0f); 
      glVertex3f(-.5f, -0.25f, -5.0f); 
     glEnd(); 
     end_transform(); 
    } 
    void update(controller& c, float dt) { 
     if (c.left_key) { 
      rho += pi/9.0f * dt; 
      c.left_key = false; 
     } 
     if (c.right_key) { 
      rho -= pi/9.0f * dt; 
      c.right_key = false; 
     } 
     if (c.up_key) { 
      v += .1f * dt; 
      c.up_key = false; 
     } 
     if (c.down_key) { 
      v -= .1f * dt; 
      if (v < 0.0) { v = 0.0; } 
      c.down_key = false; 
     } 
     actor::update(c, dt); 
    } 
}; 

class enemyOne : public actor { 
public: 
    enemyOne(float x, float y) : actor(math::vector2f(x, y)) { } 

    void render() { 
     transform(); 

     glBegin(GL_TRIANGLES); 
      glVertex3f(0.25f, 0.0f, -5.0f); 
      glVertex3f(-.5f, 0.25f, -5.0f); 
      glVertex3f(-.5f, -0.25f, -5.0f); 
     glEnd(); 
     end_transform(); 
    } 
    void update(controller& c, float dt) { 
     if (c.left_key) { 
      rho += pi/9.0f * dt; 
      c.left_key = false; 
     } 
     if (c.right_key) { 
      rho -= pi/9.0f * dt; 
      c.right_key = false; 
     } 
     if (c.up_key) { 
      v += .1f * dt; 
      c.up_key = false; 
     } 
     if (c.down_key) { 
      v -= .1f * dt; 
      if (v < 0.0) { v = 0.0; } 
      c.down_key = false; 
     } 
     actor::update(c, dt); 
    } 
}; 

int APIENTRY WinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    char* lpCmdLine, 
    int nCmdShow 
) 
{ 

    model m; 
    controller control(m); 

    srt::scheduler scheduler(33); 
    srt::frame* model_frame = new srt::frame(scheduler.timer(), 0, 1, 2); 
    srt::frame* render_frame = new srt::frame(scheduler.timer(), 1, 1, 2); 
    model_frame->add(new model_module(m, control)); 

    render_frame->add(new graphics_module(m)); 

    scheduler.add(model_frame); 
    scheduler.add(render_frame); 

    blob* prime = new blob(0.0f, 0.0f); 
    m.add(prime); 
    m.set_prime(prime); 

    enemyOne* primeTwo = new enemyOne(2.0f, 0.0f); 
    m.add(primeTwo); 
    m.set_prime(primeTwo); 

    scheduler.start(); 
    control.start(); 

    return 0; 
} 

model.h

#include <vector> 
#include "vec.h" 

const double pi = 3.14159265358979323; 

class controller; 

using math::vector2f; 

class actor { 
public: 
    vector2f P; 
    float theta; 
    float v; 
    float rho; 

    actor(const vector2f& init_location) : 
     P(init_location), 
     rho(0.0), 
     v(0.0), 
     theta(0.0) 
    { } 
    virtual void render() = 0; 
    virtual void update(controller&, float dt) { 
     float v1 = v; 
     float theta1 = theta + rho * dt; 
     vector2f P1 = P + v1 * vector2f(cos(theta1), sin(theta1)); 
     if (P1.x < -4.5f || P1.x > 4.5f) { P1.x = -P1.x; } 
     if (P1.y < -4.5f || P1.y > 4.5f) { P1.y = -P1.y; } 
     v = v1; 
     theta = theta1; 
     P = P1; 
    } 

protected: 
    void transform() { 
     glPushMatrix(); 
     glTranslatef(P.x, P.y, 0.0f); 
     glRotatef(theta * 180.0f/pi, 0.0f, 0.0f, 1.0f); //Rotate about the z-axis 
    } 
    void end_transform() { 
     glPopMatrix(); 
    } 
}; 

class model { 
private: 
    typedef std::vector<actor*> actor_vector; 
    actor_vector actors; 
public: 
    actor* _prime; 

    model() { } 

    void add(actor* a) { 
     actors.push_back(a); 
    } 
    void set_prime(actor* a) { 
     _prime = a; 
    } 
    void update(controller& control, float dt) { 
     for (actor_vector::iterator i = actors.begin(); i != actors.end(); ++i) { 
      (*i)->update(control, dt); 
     } 
    } 
    void render() { 
     for (actor_vector::iterator i = actors.begin(); i != actors.end(); ++i) { 
      (*i)->render(); 
     } 
    } 
}; 
+0

我知道我在enemyOne actor下面的代碼是不正確的,但是當我改變它時,它不再編譯,所以我就這樣離開它 – shinjuo 2010-04-23 03:22:29

+0

這是否足以讓人們看到我在使用什麼? – shinjuo 2010-04-23 04:01:25

+0

實際上,我認爲你提出了太多的代碼(並沒有完成,工作示例),所以我們無法解碼你做了什麼。 – 2010-04-23 05:55:02

回答

3

blob被擦除按鍵的第二男主角看到之前:

if (c.left_key) { 
    rho += pi/9.0f * dt; 
    c.left_key = false; // <-- HERE 
} 

清除每一幀後的鍵盤狀態不應該是任何一個演員的關注,控制器本身應該這樣做。

1

兩個blob和enemyOne都有,檢查箭頭鍵,看看是否移動的更新功能。如果你在一個更新函數中註釋掉了所有的if語句,那麼它就不應該再移動了。或者,您可以更改update函數中的if語句以檢查其他鍵並使用它們來控制其他對象。

編輯:正如在另一個答案中指出的,當你設置c.left_key = false; (或其他鍵上的一個鍵),可以防止其他演員看到該鍵被按下。要麼不傳遞控制器作爲參考,要麼刪除這些代碼行應該解決這個問題。