[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(); } } } Вроде все правильно, но все равно получается это: То есть все рисуется в одной координате... В чем же дело?
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, Спасибо, но все равно не помогло
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 - готов
|
|
| |
|