2015-04-12 196 views
0

我想知道是否有人可以幫我一些代碼。 下面我有一個代碼可控圈(代表一個蛇頭)蛇遊戲邊界碰撞

我可以修改/添加到下面的代碼,以便當蛇與邊界/邊界碰撞時,它從對面重複?

我已經將遊戲分辨率設置爲1024×768

任何幫助是極大的讚賞:)

snake.cpp

#include "snake.hpp" 

#include <cstdlib> 

void Snake::move() 
{ 
    switch(direction_){ 
    case Direction::North: 
     position_.y += 10; 
     break; 
    case Direction::East: 
     position_.x += 10; 
     break; 
    case Direction::South: 
     position_.y -= 10; 
     break; 
    case Direction::West: 
     position_.x -= 10; 
    } 

} 


void Snake::render(prg::Canvas& canvas) const 
{ 
    canvas.drawCircle(getPosition().x, getPosition().y,20,prg::Colour::WHITE); 
} 

void Snake::changeDirection(Direction new_direction) 
{ 
    direction_ = new_direction; 
} 

play_state.cpp

#include "play_state.hpp" 
#include "ai_snake.hpp" 
#include "player_snake.hpp" 
#include <iostream> 

const size_t MaxShapes {5}; 
const unsigned int MaxScale {5}; 

bool PlayState::onCreate() 
{ 
    snakes_.push_back(new AISnake); 
    snakes_.back()->setPosition(Position(100,100)); 
    snakes_.push_back(new PlayerSnake); 
    snakes_.back()->setPosition(Position(50,50)); 

    double x, y; 
    for(unsigned shape = 0;shape < MaxShapes;shape++) 
    { 
     x = (double)(rand() % prg::application.getScreenWidth()); 
     y = (double)(rand() % prg::application.getScreenHeight()); 

     shapes_.push_back(Square({x, y})); 

    } 
    return true; 
} 

bool PlayState::onDestroy() 
{ 
    return true; 
} 

void PlayState::onEntry() 
{ 
    prg::application.addKeyListener(*this); 
    game_timer_.start(); 
} 

void PlayState::onExit() 
{ 
    prg::application.removeKeyListener(*this); 
    game_timer_.stop(); 
} 

void PlayState::onUpdate() 
{ 

} 

void PlayState::onRender(prg::Canvas& canvas) 
{ 
    const std::string text = ""; 

    canvas.blitFast(
     background_, 
     canvas.getWidth()/2 - background_.getWidth()/2, 
     canvas.getHeight()/2 - background_.getHeight()/2 
    ); 

    prg::uint text_dims[2]; 
    prg::Font::MASSIVE.computePrintDimensions(text_dims, text); 
    prg::Font::MASSIVE.print(
     canvas, 
     prg::application.getScreenWidth()/2 - text_dims[0]/2, 
     prg::application.getScreenHeight()/2 - text_dims[1]/2, 
     prg::Colour::RED, 
     text); 

    for(const auto snake : snakes_) { 
    snake->render(canvas); 
    } 

    for(Shape shapes : shapes_) { 
    shapes.render(canvas); 
    } 
} 

bool PlayState::onKey(const prg::IKeyEvent::KeyEvent& key_event) 
{ 
    if(key_event.key_state == KeyEvent::KB_DOWN) { 
     switch(key_event.key) { 
     case KeyEvent::KB_ESC_KEY: 
      prg::application.exit(); 
      break; 

     } 
    } 
    return true; 
} 

void PlayState::onTimer(prg::Timer& timer) 
{ 
    for(auto snake : snakes_) { 
     snake->move(); 
    } 
} 

play_state.hpp

#if !defined PLAY_STATE_HPP 
#define PLAY_STATE_HPP 

#include <prg_interactive.hpp> 
#include "snake.hpp" 
#include "square.hpp" 
#include <list> 


//Example of forward declaration of Snake class 
class Snake; 

class PlayState final : public prg::IAppState, 
         public prg::IKeyEvent, 
         public prg::ITimerEvent { 
public: 
    PlayState() = default; 
    bool onCreate() override; 
    bool onDestroy() override; 
    void onEntry() override; 
    void onExit() override; 
    void onUpdate() override; 
    void onRender(prg::Canvas& canvas) override; 

    bool onKey(const prg::IKeyEvent::KeyEvent& key_event) override; 
    void onTimer(prg::Timer& timer) override; 

private: 
    //Snake* snakes_[2] {nullptr,nullptr}; 
    std::list<Snake*> snakes_; 
    prg::Timer game_timer_ {0, 1000/30, *this}; 
    const prg::Image background_ {prg::ImageFile("resources/images/border.bmp").load()}; 

     std::vector<Shape> shapes_; 
}; 

#endif // PLAY_STATE_HPP 
+1

那麼你不能有一個X座標低於零或大於1024,或Y座標低於零或大於768.現在想想你應該檢查的地方。 –

+0

感謝您的回覆,你提到的基本上是我需要實現的地方。我對C++相當陌生,但我認爲我需要某種switch case語句? 另外,我最好喜歡有某種網格系統(20x20或其他)來處理蛇的運動。任何想法如何可以實現?) – Addsy

回答

0

這同樣適用的1024×768 一個邊界:

if (position_.x < 0) position_.x = 1023; else if (position_.x > 1023) position_.x = 0; 
if (position_.y < 0) position_.y = 767; else if (position_.y > 767) position_.y = 0; 

注意的寬度意味着X是和之間1023

從你的代碼判斷,你使用10x10的塊。如果是這種情況,您應該根據需要自定義上面的代碼。

編輯:

從意見和我的回答,我合併這代碼,你可以遵循:

#include "snake.hpp" 

#include <cstdlib> 

void Snake::move() 
{ 
    switch(direction_){ 
    case Direction::North: 
     position_.y += 1; 
     break; 
    case Direction::East: 
     position_.x += 1; 
     break; 
    case Direction::South: 
     position_.y -= 1; 
     break; 
    case Direction::West: 
     position_.x -= 1; 
    } 

    if (position_.x < 0) position_.x = 63; else if (position_.x > 63) position_.x = 0; 
    if (position_.y < 0) position_.y = 47; else if (position_.y > 47) position_.y = 0; 
} 


void Snake::render(prg::Canvas& canvas) const 
{ 
    canvas.drawCircle(getPosition().x * 16, getPosition().y * 16,16,prg::Colour::WHITE); 
} 

void Snake::changeDirection(Direction new_direction) 
{ 
    direction_ = new_direction; 
} 

這是16×16像素,1024 x 768分辨率結果的64×48格。

玩得開心!

+0

完美的作品!謝謝:D 我實際上還沒有能夠將一個網格系統納入我的代碼中,讓蛇可以四處移動。有沒有一種簡單的方法來繪製網格,使蛇能夠逐塊移動? – Addsy

+0

1024和768都可以被16除。所以使用一個16x16的網格。結果是64x48那麼你應該在渲染階段使用這些變量並將它們與16相乘。 – bytecode77

+0

感謝您的建議,這基本上是我一直在努力實現的。任何想法我可以添加到下面的代碼來創建一個網格系統,可以通過設置的分辨率進行分割?我將廣告我爲我的播放狀態創建的.cpp和.hpp文件 – Addsy