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

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

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

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
GameMixДата: Четверг, 23 Мая 2013, 18:23 | Сообщение # 861
старожил
Сейчас нет на сайте
Всем привет smile
Есть кусок кода:
Код
bank = a[0][0];
a[0][0] = a[0][1];
a[0][1] = bank;

То же самое затем нужно выполнить с a[1][0] и a[1][1].
Можно ли, как-нибудь назначить им "общего родителя", к которому можно будет обратиться и проделать этот код для a[0][х] и a[1][х]? Если да, то интересно узнать реализацию.


Steel Standoff - 2D аркада.
Мои статьи


Сообщение отредактировал GameMix - Четверг, 23 Мая 2013, 18:24
stalker5889Дата: Четверг, 23 Мая 2013, 18:35 | Сообщение # 862
Свободный игродел
Сейчас нет на сайте
GameMix, не рациональней будет просто скопипастить код два раза и подредактировать?

GameMixДата: Четверг, 23 Мая 2013, 18:39 | Сообщение # 863
старожил
Сейчас нет на сайте
stalker5889, рациональнее будет через for заменять 0 на 1. Что-то совсем уже устал видимо )))
Но всё-таки интересно, можно ли как-то по-другому?


Steel Standoff - 2D аркада.
Мои статьи
ArchidoДата: Пятница, 24 Мая 2013, 05:56 | Сообщение # 864
Сэнсэй
Сейчас нет на сайте
А почему бы не взять и не вынести Swap отдельно:
Код

template <class TypeA1, class TypeA2> void Swap(TypeA1 &A1, TypeA2 &A2) {
  TypeA1 tmp = A1;
  A1 = A2;
  A2 = tmp;
}

А потом просто делать:
Код
for (int i = 0; i < x; i++) Swap(a[i][0], a[i][1]);


Если нужно что-то иное, то я не до конца улавливаю мысль того, что нужно.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
GameMixДата: Пятница, 24 Мая 2013, 07:06 | Сообщение # 865
старожил
Сейчас нет на сайте
Archido, вот так код happy Мне до понимания этого кода нужно ещё подрасти )) Спасибо =)

Steel Standoff - 2D аркада.
Мои статьи
sem6666Дата: Пятница, 24 Мая 2013, 12:39 | Сообщение # 866
участник
Сейчас нет на сайте
Есть:

Как сделать ограничение на ввод букв? Чтоб только числа можно было вводить.
Писалось в Dev C++


Сообщение отредактировал sem6666 - Пятница, 24 Мая 2013, 16:48
НохчиДата: Пятница, 24 Мая 2013, 15:23 | Сообщение # 867
заслуженный участник
Сейчас нет на сайте
sem6666, с помощью getch() получаешь введеный символ, с помощью isdigit проверяешь является ли он цифрой.

Многие вопросы по Windows отпадут, если посмотреть тут
sem6666Дата: Пятница, 24 Мая 2013, 20:59 | Сообщение # 868
участник
Сейчас нет на сайте
Нохчи, спасибо. Но можно где-то про это поподробнее посмотреть, как правильно использовать?

Добавлено (24.05.2013, 17:14)
---------------------------------------------
Код

// ConsoleApplication2.cpp: определяет точку входа для консольного приложения.
//

      #include "stdafx.h"
      #include <cstdlib>      
      #include <iostream>      
      #include <math.h>      
      #include <conio.h>

      using namespace std;      

      int main(int argc, char *argv[])      

      {      
      setlocale(LC_CTYPE,"Russian");
      if(isdigit((char = getchar())))
       int x=0;      
      start:      
      cout << "1. Сложение, 2. Вычитание, 3. Умножение, 4. Деление, 5. Степень числа, 6. Корень квадратный, 7 Выход." << endl;      
      cin >> x;      
      if(x==1){      
      cout <<"Введите первое слогаемое:" << endl;      
      double a;      
      cin >> a;      
      cout <<"Введите второе слогаемое:" << endl;      
      double b;      
      cin >> b;      
      double s=a+b;      
      cout <<"Сумма= " << s << endl;      
      goto start;      
      }      
      if(x==2){      
      cout <<"Введите уменьшаемое:" << endl;      
      double c;      
      cin >> c;      
      cout <<"Введите второе слогаемое:" << endl;      
      double d;      
      cin >> d;      
      double r=c-d;      
      cout <<"Разность= " << r << endl;      
      goto start;      
      }      
      if(x==3){      
      cout <<"Введите первый множитель:" << endl;      
      double y;      
      cin >> y;      
      cout <<"Введите второй множитель:" << endl;      
      double q;      
      cin >> q;      
      double t=y*q;      
      cout <<"произведение= " << t << endl;      
      goto start;      
      }      
      if(x==4){      
      cout <<"Введите делимое:" << endl;      
      double h;      
      cin >> h;      
      cout <<"Введите делитель:" << endl;      
      double j;      
      cin >> j;      
      if(j==0){      
      do{      
      cout <<"Введите другой делитель:" << endl;      
      cin >> j;      
      }while (j==0);      
      }      
      double k=h/j;      
      cout <<"Частное= " << k << endl;      
      goto start;      
      }      
      if(x==5){      
      cout <<"Введите число:" << endl;      
      double z;      
      cin >> z;      
      cout <<"Введите степерь:" << endl;      
      double l;      
      cin >> l;      
      double w=pow(z,l);      
      cout <<"Степень= " << w << endl;      
      goto start;      
      }      
      if(x==6){      
      cout <<"Введите число:" << endl;      
      double i;      
      cin >> i;      
      double m=sqrt(i);      
      cout <<"Корень= " << m << endl;      
      goto start;      
      }      
      if(x==7){      
      cout <<"Чтобы выйти нажмите любую клавишу." << endl;      
      }      

      system("PAUSE");      
      return EXIT_SUCCESS;      
      }

И всё равно не получается:(

Добавлено (24.05.2013, 18:28)
---------------------------------------------
Как ими правильно воспользоваться getch(), isdigit sad никак не пойму
Неужели ни кто с этим не может помочь sad завтра уже надо сдать зачёт

Добавлено (24.05.2013, 20:59)
---------------------------------------------
Добавлю ещё, может кто сможет помочь с этим. На одном форуме нашёл и вставил:


Вобщем получилось так:

В чём причина может быть?


Сообщение отредактировал sem6666 - Пятница, 24 Мая 2013, 19:27
Vadim_UДата: Воскресенье, 26 Мая 2013, 14:39 | Сообщение # 869
участник
Сейчас нет на сайте
При создания класса выскакивает такая ошибка:
Код
warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]


Сам класс:
Код

class dragon_class
     {
     public:
       int hp = 50, strh = 70, sta = 90;

     };


Критика должна учить, но не убивать.
kSky7000Дата: Воскресенье, 26 Мая 2013, 15:31 | Сообщение # 870
частый гость
Сейчас нет на сайте
Vadim_U, Инициализировать переменные в объявлении класса нельзя. Инициализируй их в конструкторе по умолчанию так:
Код
class dragon_class  
      {  
      public:  
        int hp, strh, sta;
        dragon_class()
         {
             hp=50; strh=70; sta=90;
         }
      };
Animan2010Дата: Среда, 29 Мая 2013, 16:23 | Сообщение # 871
постоянный участник
Сейчас нет на сайте
Что бы вы использовали?
Предположим, у нас много файлов с текстурами для игры, и есть два варианта их хранения:
Создание большого количества переменных, наподобие:
HTEXTURE gTexBackground, gTexPlayer, gTexBubble;
Или же объявить константы с названиями текстур и хранить все текстуры в массиве?
HTEXTURE gTexture[100];
gTexture[TEX_PLAYER] //Обращение к текстуре


Anima Games
Animan Publishing
ArchidoДата: Среда, 29 Мая 2013, 18:03 | Сообщение # 872
Сэнсэй
Сейчас нет на сайте
Есть некий класс, скажем для 2д игры - это класс спрайта, в котором определены различные параметры-переменные и в том числе хендл текстуры. При создании спрайта указываем (в конструкторе, в методе инициализации, etc) из какого файла грузим текстуру. Путь до файла можно прописать хардкорно в коде, либо использовать какой-нить внешний файл с "конфигурацией" (доп. файл на спрайт или общее хранилище).

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
НохчиДата: Среда, 29 Мая 2013, 19:35 | Сообщение # 873
заслуженный участник
Сейчас нет на сайте
Цитата (Archido)
При создании спрайта указываем (в конструкторе, в методе инициализации, etc) из какого файла грузим текстуру.

Тогда одна и та же текстура будет загружена очень много раз. Animan2010 потому и хочет загрузить текстуру один раз, сохранить ее, и на ее основе создавать спрайты.
Цитата (Animan2010)
есть два варианта их хранения:

Мне больше первый вариант нравится. Можно для порядка в отдельный namespace их запихнуть
Код
namespace Textures
{
      HTEXTURE TexPlayer;
      ...
}


Многие вопросы по Windows отпадут, если посмотреть тут
ArchidoДата: Четверг, 30 Мая 2013, 08:29 | Сообщение # 874
Сэнсэй
Сейчас нет на сайте
Нохчи
Текстурный менеджер будет расстроен, что его оставили без работы smile Там конечно есть небольшой оверхед, но для большинства спрайтов подходит в самый раз. Для динамики (частое создание \ удаление спрайтов) уже имеет смысл вынести текстуру отдельно и закэшировать... Имхо.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Animan2010Дата: Суббота, 01 Июня 2013, 23:34 | Сообщение # 875
постоянный участник
Сейчас нет на сайте
Ещё одна проблемка =)
В общем, не люблю когда при компиляции выскакивают предупреждения, ещё больше не люблю, когда выскакивают ошибки, но сейчас о предупреждениях:
В общем, в func(float y) мне надо передать float-параметр.
Но мне нужно абсолютное значение этого параметра, а abs() возвращает и принимает тип int.
Так вот, когда я передаю этой функции func(abs(_MoveY)) выскакивает предупреждение о неявной конвертации float (_MoveY) в int.
Ладно, напишу func(abs((int)_MoveY)).
Теперь выскакивает предупреждение о конвертации int во float, так как func принимает float.
Теперь напишу func((float)abs((int)_MoveY)). Но выглядит не очень симпатично =)
Так что делать? Написать свой abs, или отключить к чертям эти предупреждения, или ещё что?


Anima Games
Animan Publishing
НохчиДата: Суббота, 01 Июня 2013, 23:49 | Сообщение # 876
заслуженный участник
Сейчас нет на сайте
Отключить именно там, где нужно. См #pragma_warning

Многие вопросы по Windows отпадут, если посмотреть тут
Revolver_45Дата: Суббота, 01 Июня 2013, 23:59 | Сообщение # 877
почетный гость
Сейчас нет на сайте
Цитата (Animan2010)
Так что делать?

Абсолютное значение вещ. чисел fabs() вычисляет.

Цитата (Animan2010)
Написать свой abs, или отключить к чертям эти предупреждения, или ещё что?

Ну или сам.
float f_abs (float x) {
return (x >= 0.0f) ? x : -x;
}
А предупреждения не игнорируй никогда.


rtytyrtyr
NazaДата: Воскресенье, 02 Июня 2013, 00:16 | Сообщение # 878
GMUser
Сейчас нет на сайте
Как и сказал Revolver_45, используй fabs. Для нее нужна библиотека <cmath>.
Animan2010Дата: Воскресенье, 02 Июня 2013, 13:57 | Сообщение # 879
постоянный участник
Сейчас нет на сайте
А приемлем ли такой стиль программирования в каких-нибудь "компаниях", будь то казуальщики или серьезные ребята?

К примеру, есть SceneManager, там стек сцен, в этот стек добавляются сцены и обрабатывается первая в списке.
Но при добавлении сцены не передаются никакие параметры, а нужна временная информация хранится в глобальных переменных.
К примеру, в сцене меню кликаем на "Новую игру", и происходит что-то такое:

_Manager->AddScene("Game");

_Manager - указатель на менеджер сцен. AddScene добавляет сцену в зависимости от типа, сейчас это Game - игра.

А в AddScene происходит лишь:

cScene* NewScene;
if(param == "Game") NewScene = new cSceneGame;
_SceneStack.push_front(NewScene);


А уже при создании сцены игры в конструкторе сцены игры происходит загрузка уровня, в зависимости от значения глобальной переменной gCurrentLevel.

Так вот, такая структура кода приемлема или нужно нечто более изощренное, чтобы стать "продвинутым" программистом?


Anima Games
Animan Publishing
sem6666Дата: Понедельник, 03 Июня 2013, 23:37 | Сообщение # 880
участник
Сейчас нет на сайте
Может кто срочно помочь?
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList *r = new TStringList;
int pr = Form1->Memo1->Lines->Count;
for (int i = 0; i < pr; i++)
{
r->Add(Form1->Memo1->Lines->Strings[i]);
}
Form1->Memo1->Lines->Clear();
r->Sort();
Form1->Memo1->Lines->AddStrings(r);
delete r;
}

Как сделать, чтоб сортировка шла в обратном порядке? не 1,2,3, а 3,2,1
Поиск:

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