Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] Rysowanie po mapie

Ostatnio zmodyfikowano 2013-08-23 23:04
Autor Wiadomość
GGG205
Temat założony przez niniejszego użytkownika
[SFML 2.0] Rysowanie po mapie
» 2013-08-22 00:09:06
Witam ! Mam taki oto problem.
1.Nie mogę przypisać wartości do obiektu np: Obiekt = 1. Potrzebuję tego, aby zrobić mapę przy użyciu tablic np: int tablica[3] = {1,1,1};
2.Jak uporam się z tym problemem chcę napisać "Edytor map", tyle że gdy rysuję po mapie to tylko jeden obiekt się tworzy i tylko jeden się przesuwa, wiem że musiał bym utworzyć wektora, ale zbytnio ich nie rozumiem więc też wolał bym użyć tablic do przechowywania tych kafelek.

Drobny screen:

http://s6.ifotos.pl/img​/Beztytuup_nwpeanq.png
I oto kod:

C/C++
#include <SFML/Graphics.hpp>
#include <string>
#include <vector>
#include <cmath>
#include <conio.h>
#include <iostream>
#include <fstream>
#include <windows.h>

using namespace sf;
using namespace std;

RectangleShape Cube;

class postac
{
public:
    RectangleShape Player;
   
    postac() {
        Player.setSize( Vector2f( 20, 20 ) );
        Player.setPosition( 20, 20 );
        Player.setFillColor( Color( 150, 50, 250 ) );
    }
   
    void Sterowanie()
    {
        if( Keyboard::isKeyPressed( Keyboard::Up ) || Keyboard::isKeyPressed( Keyboard::W ) ) Player.move( 0.0f, - 0.1f );
       
        if( Keyboard::isKeyPressed( Keyboard::Down ) || Keyboard::isKeyPressed( Keyboard::S ) ) Player.move( 0.0f, 0.1f );
       
        if( Keyboard::isKeyPressed( Keyboard::Left ) || Keyboard::isKeyPressed( Keyboard::A ) ) Player.move( - 0.1f, 0.0f );
       
        if( Keyboard::isKeyPressed( Keyboard::Right ) || Keyboard::isKeyPressed( Keyboard::D ) ) Player.move( 0.1f, 0.0f );
       
    }
   
};

int main()
{
    RenderWindow Window( VideoMode( 640, 480, 32 ), "Game - Sparda" );
    Event zdarzenie;
   
    postac gracz;
   
    Cube.setSize( Vector2f( 20, 20 ) );
   
    while( Window.isOpen() )
    {
        while( Window.pollEvent( zdarzenie ) )
        {
            switch( zdarzenie.type )
            {
            case Event::Closed: Window.close(); break;
            case Event::MouseMoved: if( Mouse::isButtonPressed( Mouse::Left ) )
                {
                    Cube.setPosition( Vector2f( zdarzenie.mouseMove.x, zdarzenie.mouseMove.y ) );
                } break;
            }
        }
       
       
       
        Window.clear();
        gracz.Sterowanie();
        Window.draw( Cube );
        Window.draw( gracz.Player );
       
        Window.display();
    }
    return 0;
}
P-90736
hincu
» 2013-08-22 09:58:30
z mojego edytora, nie powinienes miec problemow w zrozumieniu tego

C/C++
bool Map::CheckTile( sf::RenderWindow & wnd )
{
    for( std::list < Tile *>::iterator it = TileList.begin(); it != TileList.end(); ++it )
    {
        Tile & tile = ** it;
        if( tile.Z == currentlayer && tile.X == mouse.getPosition( wnd ).x / tilesize
        && tile.Y == mouse.getPosition( wnd ).y / tilesize )
        {
            tile.X = mouse.getPosition( wnd ).x / tilesize;
            tile.Y = mouse.getPosition( wnd ).y / tilesize;
            tile.Z = currentlayer;
            tile.SpriteX = currenttile.SpriteX;
            tile.SpriteY = currenttile.SpriteY;
            return false;
        }
    }
    return true;
}

void Map::AddTile( sf::RenderWindow & wnd )
{
   
    Tile * temptile = new Tile;
    temptile->X =( mouse.getPosition( wnd ).x +( - Pos.x * tilesize ) ) / tilesize;
    temptile->Y =( mouse.getPosition( wnd ).y +( - Pos.y * tilesize ) ) / tilesize;
    temptile->Z = currentlayer;
    temptile->SpriteX = currenttile.SpriteX;
    temptile->SpriteY = currenttile.SpriteY;
    TileList.push_back( temptile );
}
P-90744
MrPoxipol
» 2013-08-22 10:28:59
Za pewne chodziło o możliwość rysowania trzymając przycisk myszy, ja zarzucę kodzikiem z mojego edytora:
C/C++
#define setType(x, y, d) map[y][x] = d; tile[y][x].setTexture(tile_t[d]); // map - tablica z enumami odpowiadającymi elementom mapy, tile - tablica ze sprite'ami, tile_t - tablica z teksturami

bool MapView::tileSet( sf::Vector2u coords )
{
    /*Tutaj był kod, który jest niepotrzebny dla Ciebie, zawiera on sprawdzanie wielu warunków, uruchamianie odpowiednich funkcji do narzędzi, etc.
    W końcu po spełnieniu kilku warunków zostaje wywołane makro dla rysowania ołówkiem*/
    setType( coords.x, coords.y, currentTileType );
    return true;
}

void MapView::updateEvents( sf::Event * event, sf::RenderWindow & Window )
{
    if( event->type == sf::Event::MouseButtonPressed )
         tile_pressed = true;
   
    if( event->type == sf::Event::MouseButtonReleased )
         tile_pressed = false;
   
    if( tile_pressed )
    {
        sf::Vector2i pos = sf::Mouse::getPosition( Window );
       
        // Other version.
        for( int i = 0; i < MAP_SIZE; ++i )
        for( int j = 0; j < MAP_SIZE; ++j )
        {
            if( tile_bounds[ j ][ i ].contains(( sf::Vector2f ) pos ) )
                 tileSet( sf::Vector2u( i, j ) );
           
        }
    }
}
Mam nadzieję, że chociaż trochę rozjaśniłem.
/edit:
Mogę jeszcze wrzucić funkcję do Bucket Fill'a jak by ktoś chciał ;>
P-90745
hincu
» 2013-08-23 07:46:26
a co to za problem zrobic ifa czy przycisk jest wcisniety i wywolac metode? O_O
P-90792
domin568
» 2013-08-23 17:28:32
Jeżeli ktoś nie zna dobrze SFMLA to może to nie być takie proste :)
P-90818
hincu
» 2013-08-23 20:46:57
domin a co tam jest z sfml po za pobieraniem pozycji myszki w oknie? reszta to aktualizacja obiektu i dodanie go do listy... ktos tu kodu nie umie czytac xD
P-90832
domin568
» 2013-08-23 22:01:40
No ale trzeba sie z tym wszystkim oswoić , nie wszystko jest takie proste ...
P-90835
MrPoxipol
» 2013-08-23 23:04:35
Żeby coś takiego zrobić, nie trzeba być geniuszem i mieć w jednym palcu SFML'a..wystarczy pomyśleć jak to ma działać.
P-90837
« 1 »
  Strona 1 z 1