Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Графический режим. Перемещение фигуры по экрану. 
:(
    Опции темы
pavelslap
  Дата 13.12.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



Здравствуйте, ув. форумчане, программисты. Я пишу программку, мне нужно организовать движение фигуры, состоящей из многих фигур по экрану. Работаю в Borland'e v.3.1, в графическом режиме. Движение должно происходить по нажатии соответствующих клавиш (влево,вправо,вверх,вниз). 

Код

#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

void init() {
  int gd=DETECT,gm,errorcode;
  initgraph(&gd,&gm,"D:\\BORLANDC\\BGI");
  errorcode=graphresult();
   if(errorcode!=grOk) {
    printf("Graphics error: %s\n",grapherrormsg(errorcode));
    printf("Press any key to halt");
    getch();
    exit(1);
   }
}

void Rect() {
  circle(300,200,150);
  fillellipse(250,130,20,20);
  fillellipse(350,130,20,20);
  line(240,260,360,260);
  rectangle(320,170,280,220);
  ellipse(130,200,0,360,20,60);
  ellipse(470,200,0,360,20,60);
  arc(300,320,180,360,90);
  bar(250,30,350,50);
}


void main() {

  init();
  Rect();

  getch();
}


Заранее спасибо!
PM MAIL   Вверх
MightyCat
Дата 13.12.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 2.11.2008
Где: Донецк

Репутация: нет
Всего: нет



В таком виде как у вас, вам надо хранить координаты всех объектов и после любого изменения (передвижения/удаления фигур) рисовать все по новой.
PM MAIL ICQ   Вверх
bsa
Дата 13.12.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



pavelslap, в BGI есть две функции, которые работают с областями экрана - экран->память, память->экран. Не помню, как они называются, но их надо использовать для стирания области экрана, перед перемещением фигуры. Т.е. алгоритм такой, сохраняешь область экрана куда должен вывести фигуру, выводишь фигуру, ждешь нажатия клавиш, восстанавливаешь область экрана, сохраняешь, рисуешь в новых координатах...
PM   Вверх
chaos
Дата 14.12.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: нет
Всего: 44



setactivepage & setvisualpage тебе в помощь

вот те пища для ума
Код

for (int frame = 0; ; frame++) {
    clearviewport();

    drawScene();

    setactivepage(frame & 1);
    setvisaulpage((frame & 1) ^ 1);
}



Это сообщение отредактировал(а) chaos - 14.12.2009, 13:21
PM WWW   Вверх
chaos
Дата 14.12.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: нет
Всего: 44



PS так же нужно иметь ввиду что режим должен быть 2х страничный
PM WWW   Вверх
pavelslap
  Дата 17.12.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



Цитата(chaos @ 14.12.2009,  13:11)
setactivepage & setvisualpage тебе в помощь

вот те пища для ума
Код

for (int frame = 0; ; frame++) {
    clearviewport();

    drawScene();

    setactivepage(frame & 1);
    setvisaulpage((frame & 1) ^ 1);
}

как именно использовать эти функции? вместо Drawscene я подставил свою функцию, которая рисует фигуры. В итоге картинка сама скачет туда-сюда, а мне нужно по нажатии клавиш
PM MAIL   Вверх
bsa
Дата 17.12.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



pavelslap, там код для работы со страницами. т.е. есть две страницы, ты рисуешь на одной, в это время видна вторая, затем делаешь первую страницу видимой, а вторую активной  и на ней рисуешь... Но ты должен иметь в виду, что рисовать надо полностью все изображение, а не только фигуру.
PM   Вверх
pavelslap
  Дата 17.12.2009, 00:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



Вы не понимаете, что я чайник? Можно по подробнее?  smile 
PM MAIL   Вверх
bsa
Дата 17.12.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



pavelslap, представь, что у тебя есть книга. Одну станицу которой ты можешь видеть, а на другой рисовать (но не обязательно видеть).  Функция setactivepage() задает номер страницы, на которой ты рисуешь, а setvisaulpage() - которую ты видишь. И они могут (и должны!) не совпадать. Так как страниц обычно две используется для этих целей, то когда ты рисуешь изображение на рисуемой страницы отличается от того, что ты видишь ровно на один кадр.
Если опять не понял, то поищи информацию про "двойную буферизацию" (double buffer).
PM   Вверх
pavelslap
  Дата 17.12.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



А можете обьяснить, что делает каждая строка? 

Код

void main() {

  init(); //inicializacija gr. rezhima
    for (int frame=0; frame<5 ; frame++) {
     clearviewport();
     Rect();   //risuem figuri
     setactivepage(frame & 1);
     setvisualpage((frame & 1) ^ 1);
    }

  getch();
}


Это сообщение отредактировал(а) pavelslap - 17.12.2009, 23:00
PM MAIL   Вверх
bsa
Дата 17.12.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



подведи курсор к каждой функции и нажми Ctrl-F1
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0696 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.