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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2010, 21:15   #1
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
Вопрос Проблема с гравитацией при написании игрушки

значится так тема содержит часть программы(игрушка Stack Attack) в которой описывается прорисовка и падение ящиков
последнего (т.е. падения не происходит) никак не могу исправить это
программирование в графическом режиме в среде bc3.1 с использованием псевдо-графики вот код
Код:
#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);
		}
	}
}
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);
			}
		}
	}
}
int randomstack(){
	int w=0;
	srand (time(NULL));
	int h=rand()%14+1;
	Cell[w][h]=3;
	return(h);
	return(w);
}

int death()
{
	int gameover;
	int w,h;
	int life=3;
	if (w==x&&h==y-1)
	{
		life=life-1;
	}
	if(life==0)
	{
		gameover=1;
	}
	return(gameover);
}


	void quit()
	{
		closegraph();
	}

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


	int gameover=0;
	time1 = time(NULL);
cycle:
	int r=0;
	randomstack();
	for(w=r;w<15;w++){     // собственно цикл падения 
	time2 = time(NULL);
	if ((time2-time1)>1){
		w=w+1;
		while (Cell[w][h]==0){
			w=w-1;
			Cell[w][h]=0;
			w=w+1;
			Cell[w][h]=3;
			r=w;
			DrawField();
			}
	time1=time2;
	}
	}
goto cycle;
	death();
	if(gameover!=1)
	{
	quit();
	}

};
в конце есть не совсем приятная метка cycle прошу не ругаться я знаю что это нехороший стиль но пока пусть будет
язык - читсый си в этом то и суть задания

Последний раз редактировалось серг; 06.12.2010 в 21:19.
серг вне форума Ответить с цитированием
Старый 06.12.2010, 22:36   #2
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

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

Я мало понимаю в синтаксисе. Расшифруйте запись цикла:

Код:
for(w=r;w<15;w++)
...т.е. цикл от сих до сих, с шагом и тд. Если это цикл то зачем нужны вот эти записи:

Код:
w=w+1;
...
w=w-1;
...
w=w+1;
...причем в while сначала w=w-1, следом w=w+1, ...по логике оно и будет стоять на месте, если w это координата по-Y.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 06.12.2010, 23:18   #4
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

значит прикол такой все рисуется вручную с помощью функции drawfield и эти записи я применил для стирания и прорисовки кубиков в следующей клетке
хотя я не уверен что прав в реализации этого действия может предложите способ попроще
а цикл от нуля до пятнадцати количество клеток падения вниз кстати его можно заменить циклом while пока клетка под ящиком не будет равна 3 т е другому ящику или 1 - нижний край стакана (поля)

Последний раз редактировалось серг; 06.12.2010 в 23:22.
серг вне форума Ответить с цитированием
Старый 06.12.2010, 23:32   #5
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

вообще говоря полносьтю согласен эти записи оставляют на месте кубики но что то на более разумную реализацию цикла пока не пробивает предлжите хотя бы идею остальное опишу сам
с координатами было напутано но исправлено вследствие этого w- координата по оси y
серг вне форума Ответить с цитированием
Старый 06.12.2010, 23:38   #6
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию

Код:
cycle:
	int w;
	int h;
	randomstack();
	time2 = time(NULL);
	if ((time2-time1)>1){
		while (Cell[w+1][h]==0){
			Cell[w-1][h]=0;
			Cell[w+1][h]=3;
			}
	DrawField();
	time1=time2;
	}
goto cycle;
	death();
	if(gameover!=1)
	{
	quit();
	}

};
есть вот такой вариант реализации но практически такой же
серг вне форума Ответить с цитированием
Старый 07.12.2010, 00:15   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Первым делом вам нужно основательно учить язык!
Код:
int randomstack(){
	int w=0;
	srand (time(NULL));
	int h=rand()%14+1;
	Cell[w][h]=3;
	return(h);
	return(w);
}
Функция может возвращать строго одно значение! Какое из них вы хотели вернуть? И почему это функция вызывается, а возвращаемое значение нигде не используется?
То же самое с death - вызов происходит, результат нигде не проверяется. Подозреваю, вы хотели изменить внешние переменные, только так у вас ничего не получится.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 07.12.2010, 00:59   #8
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Вообще что есть гравитация в математическом понимании? ...это когда некоторый параметр начинает изменять свое положение в пространстве под действием какой-то силы, ...в данном случае силы притяжения, направленной вертикально вниз. У вас за это должна отвечать некоторая переменная, это обычно так и есть "g", она константа и всегда равна некоторому значению тяготения. Нужна так же переменная обычно типа Real, т.е. число с запятой, как отрицательное так и положительное, которое накапливает в себе гравитацию. Суть состоит в том, что если это точное воспроизведение гравитации, то некоторая переменная Real типа, пусть это "r" - накапливает в себе значение с ускорением, т.е. грубо r = 0.1, 0.2, 0.4, 0.8 и тд. так можно задавать баллистическую траекторию перемещения объектов.
У вас, я так понял, примитивное перемещение ящиков по оси-Y вниз, пока не появится "пол". Нужно создать проверку для ящиков в цикле, на условие: если клетка ниже ящика не равна полу, нарисовать ящик там, с этими координатами. Если бы это был Delphi, предложил бы в качестве примера исходник аркады.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 08.12.2010, 00:52   #9
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Цитата:
как я понял никто не желает или не умеет не знаю какая формулировка уместнее
Ну а что вы хотели. Писать игры под ДОС в век 64-х разрядных процессоров. Отсюда сразу напрашивается вывод, что это не какой-то развивающийся проект, а скорее всего задание на лабу в универе. В раздел помощи студентам - самое оно.

во-вторых - ваша программа не компилируется ввиду отсутствия в функции main переменных w и h. После этого как то совсем расхотелось даже дальше чего-то смотреть, уж извините. Про остальные безобразия Гром уже намекнул.

Добавлено:
Beermonza, да какая тут гравитация Тут w=w+1. Причём +1 это даже не точек, это шаг сетки, а он тут равен 16*16.

К ТС - у меня сложилось впечатление, что это не ваша программа, ибо вы совершенно не понимаете, как работают написанные вами же функции. Вот вам рабочий майн, а что именно возвращает randomstack - это задание на дом (сюрприз так сказать).

Код:
void main(void)
{
	int w=0;
	int h=0;
	int d=1;
	char c=0;

	Graphinit();
	h=randomstack();
	DrawField();
	delay (1000);
do
{
	 if(kbhit()!=0)
	 {
		c=getch();
	 }
		switch (c)
	 {
		case (27): d=0;break;
	 }

	if(w<15-1)
	{
		Cell[w][h]=0;
		w=w+1;
		Cell[w][h]=3;
	}
		DrawField();
		delay (40);
}
while(d==1);

 quit();
}
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

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

Ulex, если человеку просто сказать, что он невежда, у него остаются все те же вопросы, плюс обида на сложный завуалированный ответ с сарказмом и язвлением внутри. Уже хорошо, что серг понимает принадлежность его вопроса к играм, а не к ЛБ, ...т.е. не все потеряно. Пусть знает о существовании модели гравитации теоретически, поймет - хорошо, не поймет - время лечит все, если есть желание дальше разбираться.
Руководитель проекта 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