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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2010, 13:18   #1
chebumisha
 
Регистрация: 05.05.2010
Сообщений: 6
По умолчанию Графика.Движение кораблика.

Задание-кораблик,который двигаеться при помощи стрелочек клавиатуры.Острова еще не доделаны.У меня кораблик это еллипс и линия(парус).Дело в том что линия поворачиваеться при нажатии клавиш,но как я не колдовал над еллипсом он как ехал прямо так и едет.Что нужно подправить что бы и еллипс и прямая поворачивались в одну сторону и по человечески?

Код:
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <math.h>

void draw_ship(int x, int y, float fi )
{
     setfillstyle(1,LIGHTBLUE);
     bar(0,0,640,350);
     setfillstyle(1,BROWN);
     fillellipse(x,y,25,10);
     line(x,y,x+10*cos(fi),y-10*sin(fi));
}

int main(void)
{
   int gdriver = VGA, gmode = VGAMED, errorcode;
   int xmax, ymax;
   initgraph(&gdriver, &gmode, "../bgi");
   errorcode = graphresult();
   if (errorcode != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);
   }

   float x=0, y=50;
   float v=2;
   float fi=0;
   int flag=1;
   int page=0;

   for(;flag;)
   {
	while(kbhit())
	{
		int ch=getch();
		if(ch==0)
		{
			ch=getch();
			switch(ch)
			{
				case 80:
					v-=0.3;
					break;
				case 75:
					fi+=0.2;
					break;
				case 72:
					v+=0.3;
					break;
				case 77:
					fi-=0.2;
					break;
			}
		}
		else if (ch == 27 )
		{	flag=0;
			break;
		}
	}
	x+=v*cos(fi);
	y-=v*sin(fi);
	setactivepage(page);
	cleardevice();
	draw_ship(x,y,fi);

	setfillstyle(1,YELLOW);
	fillellipse(320,0,100,20);
	fillellipse(340,200,90,60);
	fillellipse(640,150,60,240);

	setvisualpage(page);
	delay(100);
	page=!page;

   }

   getch();
   closegraph();
   return 0;
}
заранее спасибо)
chebumisha вне форума Ответить с цитированием
Старый 05.05.2010, 13:37   #2
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Непонятно как рисуется элипс, учитывается ли угол наклона при его рисовании? Для начала попробуй реализовать просто движение линии, потом добавишь и элипс и еще:
Код:
                                      switch(ch)
			{
				case 80:
					v-=0.3;
					break;
				case 75:
					fi+=0.2;
					break;
				case 72:
					v+=0.3;
					break;
				case 77:
					fi-=0.2;
					break;
			}
в этом случае если твой лайнер будет плыть по горизонтали, и ты нажмешь кнопку вверх, то он и сдвинется вверх повернутым хоть каким боком.
Логика должна быть такой: маршрут задается точкой начала движения (x,y) и углом под которым движение должно осуществляться fi, еще должна быть переменная которая показывает на сколько сдвигается крейсер пусть будет v (будем использовать твои переменные). Далее, при нажатии кнопки вперед, к текущим координатам добавляем v с учетом угла под которым движется баржа, предварительно стререв старый рисунок, теперь рисуем новый по новым координатам.
При нажатии кнопки налево или направо меняем угол, но не меняем положение лодки, просто перерисовываем под новым углом...
При рисовании паруса и элипса (теплохода) нужно учитывать угол под которым он находится...
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.

Последний раз редактировалось mrChester; 05.05.2010 в 13:56.
mrChester вне форума Ответить с цитированием
Старый 05.05.2010, 13:47   #3
chebumisha
 
Регистрация: 05.05.2010
Сообщений: 6
По умолчанию

ндяя...
ну,будем розбераться...
все равно спасибо большое
*ушел применять новые данные*
chebumisha вне форума Ответить с цитированием
Старый 05.05.2010, 13:57   #4
chebumisha
 
Регистрация: 05.05.2010
Сообщений: 6
По умолчанию

просто я думал что в fillellips`е нужно было бы добавить тоже синус и косинус фи..как у меня в прямой.но тогда не корректно работает.
с линией проблем вообще никаких.работает как часы)
может можно как-то разворачивать оси еллипса относительно x и y?
chebumisha вне форума Ответить с цитированием
Старый 05.05.2010, 14:00   #5
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Цитата:
Сообщение от chebumisha Посмотреть сообщение
может можно как-то разворачивать оси еллипса относительно x и y?
А что означают параметры которые ты передаешь в функцию? fillellipse(320,0,100,20);
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 05.05.2010, 14:04   #6
chebumisha
 
Регистрация: 05.05.2010
Сообщений: 6
По умолчанию

Код:
setfillstyle(1,YELLOW);
	fillellipse(320,0,100,20);
	fillellipse(340,200,90,60);
	fillellipse(640,150,60,240);
то вообще-то острова)
вот сюда я передаю х и у и угол
Код:
void draw_ship(int x, int y, float fi )
{
     setfillstyle(1,LIGHTBLUE);
     bar(0,0,640,350);
     setfillstyle(1,BROWN);
     fillellipse(x,y,25,10);
     line(x,y,x+10*cos(fi),y-10*sin(fi));
}
х и у у меня меняються тут
Код:
x+=v*cos(fi);
	y-=v*sin(fi);
я просто думал что нужно вот тут что-то сделать что бы оно норм поворачивало(в draw_ship)
Код:
  fillellipse(x,y,25,10);
chebumisha вне форума Ответить с цитированием
Старый 05.05.2010, 14:26   #7
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

fillellipse(x,y,25,10); что означают параметры этой функции, (х, у) точка, 25 и 10 что означают?
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 05.05.2010, 14:39   #8
chebumisha
 
Регистрация: 05.05.2010
Сообщений: 6
По умолчанию

ну на сколько я знаю,длина по иксу и игрику
Код:
fillellipse(int x,int y,int xradius,int yradius)
из справки
chebumisha вне форума Ответить с цитированием
Старый 05.05.2010, 15:08   #9
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

ну тогда с помощью этой функции ничего не получится...
можно написать свою функцию:
Код:
ellipse(int x,int y,int xradius,int yradius, float fi) //добавляем к старой угол налона эллипса
{//x^2/xradius^2+y^2/yradius^2=1 - формула элипса
  //ну а здесь вырисовывать попиксельно, ну или с шагом каким-нибудь, допустим 3 пикселя
}
все что пришло в голову
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 05.05.2010, 15:10   #10
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

А вообще, не мучался бы ты и сделал свой катер в виде спасетельной лодки, т.е. круглой, и проблема бы пропала сама собой
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение dampirik Общие вопросы C/C++ 15 10.10.2009 18:47
движение alex(21) Паскаль, Turbo Pascal, PascalABC.NET 9 20.08.2009 00:08
Движение с Миганиями? Deiv Мультимедиа в Delphi 13 15.11.2008 16:19
Движение Mickle Общие вопросы Delphi 5 19.04.2007 23:24