Дата: Воскресенье, 09.10.2011, 15:29 | Сообщение # 1
Группа: Удаленные
Всем привет! Кто делал лабораторные по АОМГ, прошу дать совет. Очень нужно! В какой среде делать лабы, где прорисовывать фигуры и создавать их анимацию. Пробовала в Visual Studio - там нет библиотеки <graphics.h>. Может надо где-то ещё это делать или как-то проще?
Дата: Понедельник, 10.10.2011, 18:01 | Сообщение # 4
Admin
Группа: Администраторы
Сообщений: 1446
Статус: Оффлайн
liza, Borland C++ 3.0, Borland C++ 3.1, Borland C++ 4.0. Хотя можно попробовать и другим путем пойти - через Code::Blocks. Все вышесказанное является моим личным мнением.
Дата: Понедельник, 10.10.2011, 23:02 | Сообщение # 5
Группа: Удаленные
Писал как-то курсовой - игра Pacman в Dos. Прочитал кучу инфы, и да, как вам уже сказали выше, рисование в консоли - привилегия ранних версий Borland C++. В вижле очень мутно, но можно тоже, но я, в силу ограниченности времени решил выбрать BC. С графикой там очень чудно можно работать. не разобрался, правда, как использовать свои бмп-изображения (вроде и нужное количество бит, и файл читает правильно, заголовки там всякие, а выводит криво), в итоге забил и нарисовал на примитивах. Вот приведу вам один класс для примера.
Code
#include "pacman.h"
Pacman::Pacman() //Собственно конструктор { //Тут какие-то поля, которые характеризуют персонажа, не важно Color = YELLOW; Speed = 1.5; Direction = 3; score = 0; lifes = 3; NextDirection = 3; RX = 14*15; RY = 23*15; curX = 14*15; curY = 23*15; anim = 0;
//т.к игра вертится фактически в цикле while(true), то количество обновлений экрана большое, //поэтому вместо того, чтобы каждый раз рисовать из примитивов (будет большой фпс), //рисуем на экране в конструкторе, копируем рисунок с экрана в память (есть такая ф-ция) //и сохраняем фактически указатель на область в памяти с этим рисунком //Ну вот начинаем рисовать. Нам надо пакман смотрящий влево(LOp), вправо(ROp), вверх(TOp), вниз(BOp) и закрытый(CLo) будет для всех один. Тут рисуем желтые круги и вырезаем сектора. Или рисуем сектора, там как-то криво с этим делом, так что подгонял. setcolor(Color); setfillstyle(SOLID_FILL,Color); fillellipse(CreatureSize/2,CreatureSize/2, CreatureSize/2, CreatureSize/2); //bottom oriented fillellipse(CreatureSize/2, CreatureSize/2 + CreatureSize, CreatureSize/2, CreatureSize/2); //top oriented sector(CreatureSize/2, CreatureSize/2 + 2*CreatureSize, 315, 405, CreatureSize/2, CreatureSize/2); //right oriented fillellipse(CreatureSize/2, CreatureSize/2 + 3*CreatureSize, CreatureSize/2, CreatureSize/2); //left oriented fillellipse(CreatureSize/2, CreatureSize/2 + 4*CreatureSize, CreatureSize/2, CreatureSize/2); //closed setcolor(BLACK); setfillstyle(SOLID_FILL, BLACK); sector(CreatureSize/2,CreatureSize/2 + CreatureSize, 135, 45, CreatureSize/2,CreatureSize/2); //top sector(CreatureSize/2,CreatureSize/2, 225, 315, CreatureSize/2,CreatureSize/2); //bottom sector(CreatureSize/2,CreatureSize/2 + 3*CreatureSize, 135, 225, CreatureSize/2,CreatureSize/2); //left
//выделяем память под рисунки CLo = malloc(imagesize(0*CreatureSize,4*CreatureSize,1*CreatureSize,5*CreatureSize)); ROp = malloc(imagesize(0*CreatureSize,2*CreatureSize,1*CreatureSize,3*CreatureSize)); LOp = malloc(imagesize(0*CreatureSize,3*CreatureSize,1*CreatureSize,4*CreatureSize)); TOp = malloc(imagesize(0*CreatureSize,1*CreatureSize,1*CreatureSize,2*CreatureSize)); BOp = malloc(imagesize(0*CreatureSize,0*CreatureSize,1*CreatureSize,1*CreatureSize)); //Блэкскуаре - квадрат размером с пакмана, чтобы когда тот сдвигается не перерисовывать все, а зарисовывать его квадратом, а потом отображать в новой позиции BlackSquare = malloc(imagesize(0*CreatureSize,5*CreatureSize,1*CreatureSize,6*CreatureSize)); //Вот тут копируем рисунки в память и передаем указатели полям класса getimage(0*CreatureSize,4*CreatureSize,1*CreatureSize,5*CreatureSize,CLo); getimage(0*CreatureSize,2*CreatureSize,1*CreatureSize,3*CreatureSize,ROp); getimage(0*CreatureSize,3*CreatureSize,1*CreatureSize,4*CreatureSize,LOp); getimage(0*CreatureSize,1*CreatureSize,1*CreatureSize,2*CreatureSize,TOp); getimage(0*CreatureSize,0*CreatureSize,1*CreatureSize,1*CreatureSize,BOp); getimage(0,300,CreatureSize,300+CreatureSize,BlackSquare); //и чистим что тут намалякали, это будет типа загрузка игры.. cleardevice(); }
//реализация движения в невизуальной части (проверки всякие на столкновения со стенками, врагами, бонусами... void Pacman::Update(int maplink[][29]) { anim = (anim + 1) % 12; //150 <6*25> ms for frame float timeX = curX, timeY = curY; int can_ch_dir = 1, i, j; switch (NextDirection) { case 0: { timeY -= CreatureSize/2; break; } case 1: { timeX += CreatureSize/2; break; } case 2: { timeY += CreatureSize/2; break; } case 3: { timeX -= CreatureSize/2; break; } }
for (i = (int)timeY/15; i <= ((int)(timeY+CreatureSize)/15); i++) for (j = (int)timeX/15; j <= ((int)(timeX+CreatureSize)/15); j++) { if (maplink[i][j] == -4) { can_ch_dir = 0; break; } } if (can_ch_dir) Direction = NextDirection; timeX = curX, timeY = curY; switch (Direction) { case 0: { timeY -= Speed; break;} case 1: { timeX += Speed; break;} case 2: { timeY += Speed; break;} case 3: { timeX -= Speed; break;} } int intersects = 0; for (i = (int)timeY/15; i <= ((int)(timeY+CreatureSize)/15); i++) for (j = (int)timeX/15; j <= ((int)(timeX+CreatureSize)/15); j++) { if (maplink[i][j] == -4) intersects++; } if (!intersects) { curX = timeX; curY = timeY; } if (curX >=27*15) curX = 1; if (curX <= 0) curX = 27*15-1; if (maplink[(int)curY/15][(int)curX/15] == -2)//if dot { maplink[(int)curY/15][(int)curX/15] = -1; score += 10; } }
//собственно функция рисования void Pacman::Draw() { putimage(RX,RY,BlackSquare,COPY_PUT); //зарисовываем с параметром COPY_PUT RX = (int)curX; RY = (int)curY;
if (anim < 6) { switch (Direction) { case 0: { putimage(RX,RY,TOp,XOR_PUT); break; } //рисуем с параметром XOR_PUT, потому как остальные вызывают какие-нибудь инверсии цветов, ну визуально можно подобрать case 1: { putimage(RX,RY,ROp,XOR_PUT); break; } case 2: { putimage(RX,RY,BOp,XOR_PUT); break; } case 3: { putimage(RX,RY,LOp,XOR_PUT); break; } } } else putimage(RX,RY,CLo,XOR_PUT); }