Пятница, 08 Ноября 2024, 10:35

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[C++] Тайловая карта...
GrossCageДата: Понедельник, 30 Июля 2012, 23:08 | Сообщение # 1
Плюсовый Сишник
Сейчас нет на сайте
Есть двумерный массив room[6][10], который равен
Code

                  { {1,1,1,1,1,1,1,1,1,1},
                     {1,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,1},
                     {1,2,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,1},
                     {1,1,1,1,1,1,1,1,1,1} };

и есть цикл
Code
for (int i = 0; i < 9; i++){
         for (int j = 0; j < 5; j++){
             switch (room[j][i]){
                 case 0:  
                     floor.o_move(32 * i, 32 * j);
                     floor.o_addinworld();
                 case 1:  
                     wall.o_move(32 * i, 32 * j);
                     wall.o_addinworld();
                 case 2:  
                     player.o_move(32 * i, 32 * j);
                     player.o_addinworld();
             }
         }
     }

Вроде все правильно, но все равно получается это:
То есть все рисуется в одной координате... В чем же дело? smile


PixelPong - готов
fmangustДата: Понедельник, 30 Июля 2012, 23:18 | Сообщение # 2
был не раз
Сейчас нет на сайте
Code
#include <iostream> // cin, cout
#include <clocale>  // поддержка русского языка
#include <conio.h>  
#include <stdlib.h> // поддержка функции очистки экрана system("cls")

using namespace std;

int main()
{

setlocale(LC_CTYPE,"Russian"); // установка русского языка

char act;    // переменная для хранения ввода пользователя
int ch;      // ввод пользователя приведённый к типу int
int x = 0;   // две переменные для хранения координат пользователя
int y = 0;
char map[15][20]; // двумерный массив для хранения игровой карты

// блок инициализации массива
// внешний цикл отвечает за строки
for (int i = 0; i< 15; i++)
{
  // внутренний цикл отвечает за столбцы
  for (int j = 0; j< 20; j++)
  {
   map[i][j] = ' ';
  }
}

map[0][0] = 'Т'; // помещаем игровой персонаж в начало координат
while (1)
{
  system("cls"); // вызов функции очистки экрана

  for (int i = 0; i < 15; i++)
  {
   for (int j = 0; j < 20; j++)
   {
    cout << map[i][j]; // в циклах поэлементно выводится массив
   }
   cout << "\n"; // переход на новую строку после каждого "ряда"
  }

  act = _getch();
  ch = static_cast<int>(act);

  switch (static_cast<int>(act))
  {
   case -32:
   break;
   case 27:
    exit(0);
   break;
   case 75:
    map[x][y] = ' '; // "Убираем" объект со старой координаты
    y--;             // изменяем координаты
    map[x][y] = 'Т'; // "рисуем" объект на новом месте
   break;
   case 77:
    map[x][y] = ' ';
    y++;
    map[x][y] = 'Т';
   break;
   case 80:
    map[x][y] = ' ';
    x++;
    map[x][y] = 'Т';
   break;
   case 72:
    map[x][y] = ' ';
    x--;
    map[x][y] = 'Т';
   break;
  }
} // конец цикла while

  _getch();
  return 0;
}
Lord_ZeonДата: Понедельник, 30 Июля 2012, 23:18 | Сообщение # 3
частый гость
Сейчас нет на сайте
GrossCage,
У switch - case ты забыл - break;
GrossCageДата: Понедельник, 30 Июля 2012, 23:24 | Сообщение # 4
Плюсовый Сишник
Сейчас нет на сайте
fmangust, Не, не то, мне нужно получать координаты для спрайтов, а у тебя просто вывод в консоль
Lord_Zeon, Спасибо, но все равно не помогло smile


PixelPong - готов
НохчиДата: Понедельник, 30 Июля 2012, 23:31 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
классы floor, player и wall кривые просто

Многие вопросы по Windows отпадут, если посмотреть тут
ArchidoДата: Вторник, 31 Июля 2012, 08:10 | Сообщение # 6
Сэнсэй
Сейчас нет на сайте
Да, тут наверное надо полностью весь код смотреть, а то многое неясно.

А просто пробовал без всяких циклов сделать:
Code

    player.o_move(128, 128);   
    player.o_addinworld();   

Окажется ли Player в нужной позиции?


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Вторник, 31 Июля 2012, 08:11
GrossCageДата: Вторник, 31 Июля 2012, 08:47 | Сообщение # 7
Плюсовый Сишник
Сейчас нет на сайте
Нохчи, Не, все правильно... Класс:
Code

class obj{
     public:
     float x, y;  
     ETexture tex;
     ESprite spr;
      
     void o_init(char* path);
     void o_draw();   
     void o_move(float nx, float ny);   
     void o_aiworld();
};
Реализация:
Code
void obj::o_init(char* path){
     tex = textureLoad(path);
     spr = spriteCreate(tex);    
}

void obj::o_draw(){
     spriteSetPosition(spr, x, y);
     drawSprite(spr);     
}

void obj::o_move(float nx, float ny){
     x = nx;
     y = ny;
}

void obj::o_aiworld(){
     worldAddSprite(spr);
}

Archido, Хмммм.... нет, не оказался... Сделал по-другому:
Code
for (int i = 0; i < 9; i++){
         for (int j = 0; j < 5; j++){
             for (int g = 0; g < 64; g++){
                 switch (room[j][i]){
                     case 0:  
                         floor[g].o_move(32 * i, 32 * j);
                         break;
                     case 1:  
                         wall[g].o_move(32 * i, 32 * j);
                         break;
                     case 2:  
                         player.o_move(32 * i, 32 * j);
                         break;
                     }
             }
         }
     }
          
     sceneBegin();
   sceneClear(0,0,0);
         for (int i = 1; i < 64; i++){
             floor[i].o_draw();
             wall[i].o_draw();
         }  
         player.o_draw();
     sceneEnd();
вот что получилось:


PixelPong - готов
ArchidoДата: Вторник, 31 Июля 2012, 09:09 | Сообщение # 8
Сэнсэй
Сейчас нет на сайте
Хм, т.е. у тебя floor/wall/player просто массивы типа obj, да? А "worldAddSprite(spr);" чего делает? По логике она должна копировать спрайт в некий объект World, который умеет делать всем Draw, Update и т.п. Но спрайты ты ручками рисуешь да?

Code

int SpriteCount = 0;
for (int i = 0; i < 9; i++){  
          for (int j = 0; j < 5; j++){  
                          floor[SpriteCount].o_move(32 * i, 32 * j);  
                          SpriteCount++;
    
          }  
      }  
             
      sceneBegin();  
    sceneClear(0,0,0);  
          for (int i = 0; i < SpriteCount; i++){  
              floor[i].o_draw();  
          }   
      sceneEnd();

Вот так чего получится?


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
GrossCageДата: Вторник, 31 Июля 2012, 09:13 | Сообщение # 9
Плюсовый Сишник
Сейчас нет на сайте
Archido, О, все, спасибо, помогло! :)))

PixelPong - готов
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг