Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2010, 16:25   #11
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
Уже хорошо, что серг понимает принадлежность его вопроса к играм, а не к ЛБ
Если изначально это лаба, то 95% вероятности, что карьера игростроя этой (максимум - также и подобными) лабами и ограничится. Так что теория геймдева ему без надобности. Тут нужно только хоть немного подучить язык, а больше и не нужно.
Если же ТС таки хочет писать игры, то первым делом - читать книжки, учить язык и переходить на среды разработки, поддерживающие стандарт.
По хорошему теме - место в Общих вопросах C/C++, т.к. проблемы тут чисто языковые.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 08.12.2010, 16:44   #12
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

Фактически это первая проба написания игрушки-лабы, а | пока, действительно, на очень примитивном уровне. Через полчасика кину код в котором есть проблема прохождения человека сквозь ящики (ps если за это время сам не исправлю).

Кстати, не факт, что карьера закончится, просто задание было - написать на процедурном языке, а на нем многого не сделаешь за нехваткой времени.
Следующая работа будет на объектно ориентированном языке и глядишь и дальше попрет.

И еще, кстати, последний раз на си писал год назад, естественно, многое забылось, стараюсь вспоминать, но не на все хватает времени, так что сильно не ругайте мне и так стыдно.
Но, как говорится "студент не знает тему в двух случаях: если он ее еще не проходил, либо уже давно прошел" )))

Поможете с кодом-то ? если что прост времени не очень много но много еще надо доделать в плане интерфейса.

Последний раз редактировалось Beermonza; 08.12.2010 в 17:28.
серг вне форума Ответить с цитированием
Старый 08.12.2010, 17:25   #13
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

короче вот код при однократном нажатии d(движение вправо) виснет цикл не врублюсь что не так подскажите плиз
Код:
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <time.h>

const int Width=16;
const int Height=16;
const int CellSize=30;
int i,j,x=8,y=14;

time_t u;
time_t u1;
time_t time1;
time_t time2;

int Cell[16][16]={
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};



void Graphinit()
{
	int gdriver=DETECT,gmode,errorcode;
	initgraph(&gdriver,&gmode,"");
	errorcode=graphresult();
	if(errorcode !=grOk)
	{
		printf("Grafics error:%s\n",grapherrormsg(errorcode));
		printf("Press any key to halt:");
		getch();
		exit(1);
	}
}

void DrawField()
{
	int i;
	int j;
	setcolor(WHITE);
	rectangle(0, 0, 30 * Width, 30 * Height);
	for (i = 1; i < (Width - 1); i++){
		line(i*CellSize,1, i*CellSize,Height*CellSize);
		for (j = 1; j <= (Height - 1); j++){
		line(1, i * CellSize, Width * CellSize, i * CellSize);
	setfillstyle(1, WHITE);
		}
	}

	for (i = 0; i < Height; i++)
	{
		for (j = 0; j < Width; j++)
		{
			if (Cell[i][j] == 1)
			{
				bar(j * CellSize, i * CellSize, (j + 1) * CellSize,  (i + 1) * CellSize);
			}
		}
	}
	setfillstyle(1, YELLOW);
for (i=0; i<Height;i++)
{
	for (j=0;j<Width; j++)
	{
		if (Cell[i][j] == 0)
		{
    bar(j * CellSize, i * CellSize, (j + 1) * CellSize, (i + 1) * CellSize);
		}
	}
}

	int Radius=15;
	setcolor(GREEN);
	setfillstyle(1, GREEN);
	for (i=0; i<Height;i++)
	{
		for (j=0;j<Width; j++)
		{
			if (Cell[i][j] == 2)
			{
				fillellipse((2 * x + 1) * Radius, (2 * y + 1) * Radius, Radius, Radius);
			}
		}
	}

	setfillstyle(1, BLUE);
	for (i=0; i<Height;i++)
	{
		for (j=0;j<Width; j++)
		{
			if (Cell[i][j] == 3)
			{
				bar(j * CellSize, i * CellSize, (j + 1) * CellSize, (i + 1) * CellSize);
			}
		}
	}
}


void MoveRight() // координа ты человека (х,у) координаты ящика[i][j] 
{
 i=x+1;
 j=y;
 while(Cell[i][j]!=1) // пока следующая клетка после рабочего !=1
 {
   Cell[x][y]=0;             //перерисовываем рабочего
   Cell[x+1][y]=2;


   if(Cell[i][j+1]==0){
    Cell[x][y]=0;
    Cell[x][y+1]=2;
   }
       // если клетка под перерисованным рабочим равна 0 то перерисовываем его вниз
    DrawField();

  }
  if(Cell[i][j]==3){
    if(Cell[i][j-1]==3){
    }

    if(Cell[i+1][j]==0)
    {
     Cell[i][j]=0;
     Cell[i+1][j]=3; //перерисовка ящика
     Cell[x][y]=0;               // перерисовка рабочего после передвижения ящика
     Cell[x+1][y]=2;

     if (Cell[i][j+1]==0)
     {
      Cell[i][j]=0; // если клетка под перерисованным ящиком равна 0 то перерисовываем его вниз
      Cell[i][j+1]=3;

      if (Cell[x][y+1]==0)
      {
       Cell[x][y]=0; // если клетка под перерисованным рабочим равна 0 то перерисовываем его вниз
       Cell[x][y+1]=2;
	  }
	 }
      }
     }
  DrawField();
  i=i++;
}

int randomstack(){
	int w=0;
	srand (time(NULL));
	int h=rand()%14+1;
	Cell[w][h]=3;
	return(h);
}
void quit()
	{
		closegraph();
	}

void main(void)
{
	Graphinit();
        button1();
	DrawField();


	int gameover=0;
	time1 = time(NULL);

cycle:

	int w;
	int h;
	w=0;
	h=randomstack();
	randomstack();
	while (Cell[w+1][h]==0)
	{
	time2 = time(NULL);
	if ((time2-time1)>0,5)
			{
			Cell[w][h]=0;
			Cell[w+1][h]=3;
	    w=w+1;
	DrawField();
	time1=time2;



	if(kbhit())
	{
		char m = getch();
		if (m == 0)
			m = getch();

		switch (m)
		{
		case 'a':
		case 'A':
		MoveLeft();
			break;
		case 'w':
		case 'W':
			Jump();
			break;
		case 'd':
		case 'D':
			MoveRight();
			break;
		case 'q':
		case 'Q':
			JumpLeft();
			break;
		case 'e':
		case 'E':
			JumpRight();
			break;
		case 'o':
		case 'O':
		quit();
			break;
		}
	}

		}
	}
	goto cycle;
};
По мере нахождения глюков буду спрашивать. Пожалуйста не отказывайте в помощи!! ( P.S.скорее всего это будут функции движения заданные в кбхит после муврайта) И да есть желание продолжать просто сейчас осталось маловато времени для хорошего описания физики процесса (( это меня конечно удручает но деваться некуда

Последний раз редактировалось серг; 08.12.2010 в 17:34.
серг вне форума Ответить с цитированием
Старый 08.12.2010, 17:36   #14
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

серг, если ты так дальше будешь печатать в кучу сливая мысли, то мы помогать не будем, поскольку не желаем тратить свое время еще и на правильное понимание твоих постов, ...ну можно же хоть начать предложение с прописной буквы, поставить запятые, чтобы не путаться в "казнить, нельзя помиловать" и "казнить нельзя, помиловать". Я подправил твои посты и показал как поступать, надеюсь ты прислушаешься, ...не создавай подряд сообщения в 1-2 мин. интервал, есть на то кнопка "Правка", дополняй уже созданные посты, если потребовалось.
С уважением.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 08.12.2010, 17:39   #15
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

Я понял свои недочеты,сори за такое смешение мыслей,буду стараться выражать свои мысли четче
серг вне форума Ответить с цитированием
Старый 08.12.2010, 17:45   #16
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Молодец, ...и еще, если не отправляет сообщение сразу, не жми многократно, дождись окончания отправки, ...это проблемы сети, у меня тоже бывает, ...я жду, иначе могут быть дублирования, а за них можно схлопотать штраф. Я пишу сюда это все, чтобы все прислушивались к пожеланиям, кто забрел в эту тему.

К сожалению, смутно представляю, что происходит в коде, посему пас помочь кодом, только теоретически.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 08.12.2010, 17:56   #17
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

Согласен и на теоретическую поддержку (кстати, ошибка в функции муврайт, там вроде комменты прописаны И ЦИФРА 2 в матрице - человек, цифра 3- ящик). Может взглянешь еще разок? ...просто я уже зашиваюсь в этом коде, баг на баге, либо чувак бегает скозь ящики как коперфильд, либо виснет. Свежий критический взгляд он же всегда укоряет и заставляет работать точнее. Вообще принцип игры заключается в том, что человек(зеленый кружок) должен сдвигать ящики в ряд и ряд сгорает, набирается какое то количество очков, и человек умирает если на него три раза падает ящик.

Блин народ помогите разобраться, а то уже мозг взрывается!!!

Последний раз редактировалось Beermonza; 08.12.2010 в 19:30.
серг вне форума Ответить с цитированием
Старый 08.12.2010, 19:54   #18
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

У тебя DrawField() рисует всю матрицу? ...похоже всю. Т.е. сначала ряд проверок на позицию человечка и ящики, затем в самом конце отрисовка. У тебя в процедуре void MoveRight() отрисовка дважды встречается, ...по-моему лишнее.

Сначала нужно создать список ящиков, и отдельно человечка. У всех есть тип, координата по-X и по-Y. Не должно быть одной матрицы в которой все записано кодами, это же не статические объекты, а динамические. Поэтому сначала проверка списка ящиков и отрисовка их в координатах, которые они хранят.
Каждый такт условие проверяет в списке каждый ящик. Если под ним пустота, то изменить положение на y+1, иначе пропустить ящик. После проверки всех ящиков беремся за человечка. Первая проверка так же на "пол" под ногами. Если клетка карты под ним пустая, то падать вниз: y+1.

Все. Это первое необходимое. Если положить ящик на карту сверху, то он сам начнет падать, т.к. проверка списка нащупает этот ящик (еще бы, он в списке пока один), проверит координаты и сместит ящик на клетку вниз. Так будет каждый такт, пока под ящиком ничего нет.

Теперь представь себе, как будет падать на голову человечку ящик. Это нужна проверка не только на пустоту под ним, но и на координаты человечка. Если клетка (y+1, x) это координаты человечка, то нужно удалить ящик из списка, а человечку отнять жизнь (переменная hp = hp - 1). Тут же проверка на число жизней, если hp <= 0, то все, тушим свет "game over".

Значит все, ящики падают, человечек гибнет. Теперь нужно научить человечка ходить. Это на клавишах. При нажатии вправо, проверяем список ящиков, у которого из них координаты равны координатам человечка +1 по-X, если таковой нашелся, проверяем его координаты +1 по-X, если там пусто, то ящик смещается на +1 по-X, а человечек от своих координат +1 по-X, т.е. и человечек и ящик оба они поехали вправо на 1 клетку. Мы помним, что первое условие на падение ящика работает, и как только эта парочка дойдет до провала, ящик сам рухнет вниз. Кстати и человечек тоже если вовремя не остановиться, ...вылезти потом из ямки в 1 клетку не удастся .

То же самое делается на левую клавишу. Отрисовка DrawField() один раз в самом конце процедуры, которая повторяется по таймеру.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 08.12.2010 в 20:01.
Beermonza вне форума Ответить с цитированием
Старый 08.12.2010, 20:06   #19
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

Такс, вроде все понял, кроме списка ящиков, можно ли поподробнее объяснить?
Как вот из этого сделать список ?
Код:
setfillstyle(1, BLUE);
	for (i=0; i<Height;i++)
	{
		for (j=0;j<Width; j++)
		{
			if (Cell[i][j] == 3)
			{
				bar(j * CellSize, i * CellSize, (j + 1) * CellSize, (i + 1) * CellSize);
			}
		}
	}
тьфу не из этого эт ж прорисовка
Я просто хотел бы понять принцип работы с этим списком и его функционал получше( как я понял нужно создать динамический список ящиков правильно ? )
Или же можно попробовать справиться статическим списком ?

Последний раз редактировалось серг; 08.12.2010 в 20:22.
серг вне форума Ответить с цитированием
Старый 08.12.2010, 20:23   #20
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Список ящиков - одномерный массив собственного типа. Я не в курсе как синтаксис это позволяет делать, но выглядит как создание типа, в котором три записи: Ex, X и Y. Затем одномерному массиву присваиваем этот тип. Можно выйти на конкретную запись так (в общем виде):

Mas[i].X - это x (Byte);
Mas[i].Y - это y (Byte);
Mas[i].Ex - это индекс, что ящик есть (Boolean).

i - это номер ячейки такого списка (массива). Ящик добавляется условием в цикле: если Mas[i].Ex = False (нет ящика), запишем в эту ячейку начальные координаты (Mas[i].X = 4, Mas[i].Y = 0) и Mas[i].Ex = True. Все, ящик есть. Теперь условие в таймере будет щупать массив Mas в таймере по i и искать Mas[i].Ex = True, ...найдет, значит будет обрабатывать его падение.

Сама DrawField() тоже будет отрисовывать ящики, проверяя Mas[i].Ex, и для этого ей уже не нужно сканировать всю матрицу карты, только список ящиков и человечка. Нужно будет только прогнать один раз восстановление карты позади и затем новое положение всех объектов.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работаю над гонками с гравитацией. Вадим Буренков Gamedev - cоздание игр: Unity, OpenGL, DirectX 255 05.09.2011 13:40
Проблема при написании компонента на основе TCustomControl Flip-er Компоненты Delphi 4 28.03.2010 19:27
Возникла проблема при написании чата HelP mar4elo Работа с сетью в Delphi 12 29.11.2008 22:16
Помогите при написании WebBrowser kuzmich Компоненты Delphi 17 15.12.2007 18:58
Как и с чего начать при создании 2д игрушки. fis Gamedev - cоздание игр: Unity, OpenGL, DirectX 17 14.05.2007 18:14