Пятница, 15 Ноября 2024, 15:49

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
TikaraДата: Среда, 02 Января 2013, 14:25 | Сообщение # 781
частый гость
Сейчас нет на сайте
goldsphere,

Ну во-первых

Код
template <int sizeX, int sizeY> class Map {   
    int a[sizeX][sizeY];   

public:   
    Map()   
    {   
     register int i, j;   
     for(i=0;i<sizeX;i++)   
      for(j=0;j<sizeY;j++)   
       a[i][j]=0;   
    }   
    int *operator[](int i) // возвращаем указатель, т.к. ссылка и указатель это разные вещи (указатель нам позволит обращаться к массиву, на который указывает массив "i")
    {   
     if(i<0 || i>size-1){   
      exit(1); // если выходим за пределы массива вываливаемся из программы? А отлаживать-то потом как? =)
     }   
     return a[i];   
    }   
};


Во-вторых, вы неправильно обьявляете ваш "массив". Очевидно, нужно так:

Код
Map< 5 , 8 > map;

map[2][5] = 7;


Сообщение отредактировал Tikara - Среда, 02 Января 2013, 14:26
AlexeyBondДата: Среда, 02 Января 2013, 14:39 | Сообщение # 782
был не раз
Сейчас нет на сайте
Цитата (goldsphere)
Принцип в том, что после размер будет браться из файла


В таком случае, использовать шаблон - неправильное решение т.к. аргументы передаваемые в шаблон можно определить только на этапе компиляции ( из исходного кода ), а изменить их во время исполнения невозможно.
В данном случае рекомендую использовать динамическое выделение памяти с помощью оператора new или функций malloc/calloc и имитацию двухмерного массива с использованием одномерного.
SaiteiДата: Среда, 02 Января 2013, 15:31 | Сообщение # 783
старожил
Сейчас нет на сайте
Цитата (Tikara)
#include <time.h>
int main(){
clock_t time;
   
time = clock();
/* вызов функции */
time = clock() - time;
return 0;
}

Спасибо большое. Есть немного мелких вопросов (пожалуйста, ответьте, если я вам ещё не сильно надоел)) ):
time = clock(); - это мы "заводим" таймер?
time = clock() - time; - а это мы его останавливаем? Я правильно понимаю?
TikaraДата: Среда, 02 Января 2013, 16:04 | Сообщение # 784
частый гость
Сейчас нет на сайте
Цитата (Saitei)
time = clock(); - это мы "заводим" таймер?
time = clock() - time; - а это мы его останавливаем? Я правильно понимаю?


С практической точки зрения, можно и так сказать

time = clock(); // получаем время прошедшее с момента старта программы (то есть теперь мы знаем, когда начал выполняться наш блок кода)
time = clock() - time; // теперь определяем разницу между временем в данный момент и временем, с которого начал выполняться блок кода
goldsphereДата: Четверг, 03 Января 2013, 08:55 | Сообщение # 785
заслуженный участник
Сейчас нет на сайте
AlexeyBond, массив должен быть глобальным.

FinderX - Android Аркада
AlexeyBondДата: Четверг, 03 Января 2013, 18:03 | Сообщение # 786
был не раз
Сейчас нет на сайте
Цитата (goldsphere)
массив должен быть глобальным.


А в чём, собственно, проблема?
Можно же создать глобальный объект для массива, а память выделять только тогда, когда становится известно, сколько её нужно ( при загрузке данных из файла в данном случае ).
Например это можно сделать так:
Код

class Map
{
private:
   int* Data;
   int  sizeX, sizeY;
public:
   Map( )
   :Data(NULL),sizeX(0),sizeY(0)
   {};
   ~Map( )
   {
     if( Data ) delete [] Data;//Если память была выделена, освобождаем её.
   }
   void Alloc( int x, int y )
   {//Выделить память под массив размером x на y
     Data = new int[(sizeX = x)*(sizeY = y)];
   }
   
   int& operator () ( int y, int x )
   {//Получение ссылки на элемент  a[y][x]
     if( (x >= sizeX)||(y>=sizeY) )
       throw;//выход за пределы массива
     return Data[x+sizeX*y];
   }
};

//Объявляем глобальный объект
Map map;
.
.
.
   //Перед записью в массив:
   map.Alloc( newSzX, newSzY );

   //И доступ к элементу:
   map( i, j ) = n;

goldsphereДата: Четверг, 03 Января 2013, 18:15 | Сообщение # 787
заслуженный участник
Сейчас нет на сайте
код
Смысл данного кода, при нажатие на клавишу отобразить на пол секунды другую текстуру и вернуть потом прежнюю. Проблема в том, что он мне не отрисовывает новую текстуру. Однако при нажатие(в моём случае на пробел) он в функцию заходит, и даже switch работает. Возможно это особенность класса hgeSprite..


FinderX - Android Аркада
НохчиДата: Четверг, 03 Января 2013, 18:31 | Сообщение # 788
заслуженный участник
Сейчас нет на сайте
Код
switch(position)

Что за position?


Многие вопросы по Windows отпадут, если посмотреть тут
AlexeyBondДата: Четверг, 03 Января 2013, 19:15 | Сообщение # 789
был не раз
Сейчас нет на сайте
Цитата (goldsphere)
Смысл данного кода, при нажатие на клавишу отобразить на пол секунды другую текстуру и вернуть потом прежнюю.


Похоже, проблема в том, что всё это происходит в течение одного кадра, т.е. один спрайт просто накладывается на другой, и только потом это всё выводится.
goldsphereДата: Пятница, 04 Января 2013, 07:05 | Сообщение # 790
заслуженный участник
Сейчас нет на сайте
Цитата (Нохчи)
Что за position?

char position;
При передвижении допустим вверх(W) она принимает значение 'U', и в уже этой функции определяется спрайт, нарисованный в какую сторону, должен отобразиться.
Цитата (AlexeyBond)
Похоже, проблема в том, что всё это происходит в течение одного кадра, т.е. один спрайт просто накладывается на другой, и только потом это всё выводится.

Сомневаюсь, просто до этого была практически идентичная функция, только без обратно смены спрайта, то есть нажал, спрайт отобразился и остался, пока не произойдёт действие которое вновь его сменит, допустим движение. Выглядело это так.
Функция SetTexture:
Код
void Sprite::SetTexture(FPath filename)
{
    hge->Texture_Free(texture);
    texture = hge->Texture_Load(filename);
    sprite->SetTexture(texture);
}


FinderX - Android Аркада

Сообщение отредактировал goldsphere - Пятница, 04 Января 2013, 07:09
AlexeyBondДата: Пятница, 04 Января 2013, 09:59 | Сообщение # 791
был не раз
Сейчас нет на сайте
goldsphere, правильно. Старая функция просто меняла спрайт и выводила его, а новая меняет его, выводит, ждёт, потом снова меняет и выводит, а между сменами спрайтов вывода графики не происходит.
И ещё: пожалуй, задам наводящий вопрос: где вызывается Gfx_EndScene( ) и что она делает?
SaiteiДата: Пятница, 04 Января 2013, 23:50 | Сообщение # 792
старожил
Сейчас нет на сайте
ругается на строку:
Код
    if(map[0][0] & map[0][2] & map[0][4] = 'x') {
    finished = true;
   }

почему? как быть? Делаю крестики-нолики
НохчиДата: Пятница, 04 Января 2013, 23:55 | Сообщение # 793
заслуженный участник
Сейчас нет на сайте
Saitei, не уверен, что понял суть условия, но мб должно быть так:
Код

if(map[0][0]=='x' && map[0][2]=='x' && map[0][4] == 'x')


Многие вопросы по Windows отпадут, если посмотреть тут
SaiteiДата: Пятница, 04 Января 2013, 23:59 | Сообщение # 794
старожил
Сейчас нет на сайте
Код
#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;

char map[6][6] ={"1|2|3",
      "-+-+-",
      "4|5|6",
      "-+-+-",
      "7|8|9"};
int input; bool finished = false;

int main() {
  while(!finished) {
   system("cls");
   for(int i = 0; i < 6; i++) {
    for(int j = 0; j < 6; j++) {
     cout<<map[i][j];
    }
    cout<<'\n';
   }
   input = getch();
   if(input=='1') {
    if(map[0][0]!='O') {
     map[0][0] = 'X';
     input=0;
    }
   }
   if(input=='2') {
    if(map[0][2]!='O') {
     map[0][2] = 'X';
     input=0;
    }
   }
   if(input=='3') {
    if(map[0][4]!='O') {
     map[0][4] = 'X';
     input=0;
    }
   }
   if(map[0][0]=='x' && map[0][2]=='x' && map[0][4] == 'x') {
    finished = true;
   }
  }
  cout<<"YOU WIN!!!";
  getch();
  return 0;
}

сделал так, но из цикла программа не вышла => условие работает некорректно
НохчиДата: Суббота, 05 Января 2013, 00:06 | Сообщение # 795
заслуженный участник
Сейчас нет на сайте
Saitei, 'x' и 'X' - это разные символы, регистр имеет значение.

Многие вопросы по Windows отпадут, если посмотреть тут
SaiteiДата: Суббота, 05 Января 2013, 00:18 | Сообщение # 796
старожил
Сейчас нет на сайте
Нохчи, извините, совсем не заметил. Спасибо большое за помощь
Edison6Дата: Суббота, 05 Января 2013, 00:39 | Сообщение # 797
TRUE Programmer
Сейчас нет на сайте
Вот вопросик по кросс-платформенной разработки, допустим написал я консольную программку в Code::Blocks на С++ она скомпилировалась и все хорошо, а как мне теперь сделать чтобы она работала на других системах типа Linux?
Насколько я понимаю то нужно скомпилировать эту программу в Linux чтобы она работала там и в Windows чтобы она работала под виндой.Если так то это получается необходимо ставить вторую ОС или виртуальную машину на которой компилить?
И вопрос сразу второй мне для моей первой сетевой игры где будут бегать два спрайта необходима кроссплатформенная библотека для работы с сетью какие есть предложения?
если boost::asio
То пожалуйста представьте пример обычной проги посылающей Hello world!


Берил сбрей усы
SaiteiДата: Суббота, 05 Января 2013, 00:47 | Сообщение # 798
старожил
Сейчас нет на сайте
Цитата (Edison6)
И вопрос сразу второй мне для моей первой сетевой игры где будут бегать два спрайта необходима кроссплатформенная библотека для работы с сетью какие есть предложения?

Мне вот тоже интересно. Какую-нибудь легенькую и с целой кучей русских уроков...
на WinSock мало что находил (в основном книги).
Edison6Дата: Суббота, 05 Января 2013, 00:57 | Сообщение # 799
TRUE Programmer
Сейчас нет на сайте
Цитата
Какую-нибудь легенькую и с целой кучей русских уроков...

Из всего найденного думаю пока в сторону boost::asio
ЗЫ .Первый вопрос актуален.


Берил сбрей усы
НохчиДата: Суббота, 05 Января 2013, 01:12 | Сообщение # 800
заслуженный участник
Сейчас нет на сайте
Цитата (Edison6)
необходимо ставить вторую ОС или виртуальную машину на которой компилить?

Да.
По boost::asio есть очень много документации и уроков. Гуглите.


Многие вопросы по Windows отпадут, если посмотреть тут
Поиск:

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