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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2010, 20:21   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию Замедление игры во время одновременного движения со снарядом

Добрый вечер. Я решил написать простенькую игрушку. Поначалу затруднялся, путался, но потом все шло нормально, хотя не долго. Заметил, так сказать, "Игровой баг". Когда я жму на пробел (выстрел) и двигаю угол в какую-нибудь сторону (кнопками-стрелочками), то начинается торможение. Я прикрепил архив.
Это моя первая разработка игры, поэтому сильно не ругайте. Просьба: если заметите какой-нибудь недочет, то сообщите. Например, что-то можно улучшить, в поток засунуть и т.п.
Заранее спасибо.
Вложения
Тип файла: rar Game OpenGL.rar (165.1 Кб, 33 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 06.10.2010 в 20:22. Причина: Забыл добавить архив
_PROGRAMM_ вне форума Ответить с цитированием
Старый 06.10.2010, 21:16   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Странно, у меня не глючит.
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 06.10.2010, 21:34   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

У меня тоже все стабильно, независимо от нажатия клавиш.
А что касается замечаний, то
1. Окошко игры пустое пока не нажмешь на какую-нибудь клавишу. Это приводит в изрядное смущение.
2. Угол спокойно уезжает за пределы экрана. Добавьте ему сравнение координат с координатами краев экрана, чтоб не уезжал.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 06.10.2010, 21:45   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

у меня intel Core 2 Quate 4гига оперативки, 512 мегабайт видео карта. Что мало?
Цитата:
1. Окошко игры пустое пока не нажмешь на какую-нибудь клавишу. Это приводит в изрядное смущение.
у меня все сразу появляется.
Попробуйте одновременно пробел и вправо. У меня если двигаться одновременно с полетом пули, то будет заметно торможение.
P.S. компьютер последние игры тянет без тормозов, а мою?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 06.10.2010 в 21:51.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 06.10.2010, 21:49   #5
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

У меня такой вид, что походу не очищается буфер кадра.... Хотя в коде есть. Походу, с какими-то функциями намудрили. А так, задержки нет, есть только задержка рисования.
И ещё:
вот тут, кажется, вместо "+" должен быть "or":
Код:
Tpfd.dwFlags:= PFD_DOUBLEBUFFER+PFD_SUPPORT_OPENGL+PFD_DRAW_TO_WINDOW+ PFD_GENERIC_ACCELERATED;
Кроме того, glFinish = glFlush + ожидание освобождения ГПУ: выбирайте что-то одно.

P.S.
Цитата:
у меня все сразу появляется.
У меня тоже пустой экран до нажатия. И конфигурация тут вряд ли при делах.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 06.10.2010, 22:09   #6
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Вот намудрил с очищением. Не помогло. Другие советы тоже не изменили.
Вложения
Тип файла: rar Project1.rar (154.3 Кб, 14 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 06.10.2010, 22:19   #7
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Вообще организовано плохо: что-то вы рисуете по событию клавиатуры, что-то по таймеру... Обычно делают один цикл (или таймер) и в нём производят отрисовку всего и вся. Т.е. скажем пули рисуются из той же процедуры, что и треугольник. У вас же стёрся экран - нарисовалась пуля - пауза - стёрся экран - нарисовался треугольник. Отсюда и проблемы.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 06.10.2010, 23:28   #8
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Баг завязан опять таки на вертик. синхр. Поэтому и получается у всех по разному. Попробуйте принудительно в настройках видеодрайвера повключать/повыключать этот параметр.

Вообще при таком построении программы у вас логика игрового процесса получается завязана на графику. Заметьте, что при выключенной VSync. скорость перемещения и стрельбы выше, чем при включенной (это ещё может немного от настроек зависеть).
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 07.10.2010, 16:20   #9
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Цитата:
Вообще организовано плохо: что-то вы рисуете по событию клавиатуры, что-то по таймеру
Нет. Когда сработает таймер, идет проверка на нажатие клавиш.
Цитата:
Т.е. скажем пули рисуются из той же процедуры, что и треугольник
Потом не разберешь, что и куда.
Цитата:
У вас же стёрся экран - нарисовалась пуля - пауза - стёрся экран - нарисовался треугольник. Отсюда и проблемы.
Вот за эти слова я говорю вам спасибо. Я BeginPaint, EndPaint, glFlush, и т.д. вынес в таймер. Вообщем, если кому надо, вот код
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
  dc:HDC;
  hrc:HGLRC;
  FireUser, FireComp: boolean;
  YFireUser,YFileCopm, XFireUser:Real48;
  pubPS:TPaintStruct;
  procedure PixelFormat;
  procedure KeyUp(XPixelPaint:Real48);
  procedure Fire;
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;
  Xf : Real48;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
dc:=GetDC(Form1.Handle);
PixelFormat;
hrc:=wglCreateContext(DC);
wglMakeCurrent(DC,hrc);
Xf:=0.0;
Form1.DoubleBuffered:=True;
YFireUser:=-0.8;

end;

procedure TForm1.PixelFormat;
var
Tpfd:TPixelFormatDescriptor;
nPixelFormat:integer;
begin
FillChar(Tpfd,SizeOf(Tpfd), 0);
Tpfd.nSize:=SizeOf(Tpfd);
Tpfd.nVersion:=1;
Tpfd.dwFlags:= PFD_DOUBLEBUFFER+PFD_SUPPORT_OPENGL+PFD_DRAW_TO_WINDOW;
Tpfd.cColorBits:=24;
Tpfd.iPixelType:=PFD_TYPE_RGBA;
Tpfd.iLayerType:=PFD_MAIN_PLANE;
nPixelFormat:=choosePixelFormat(DC,@Tpfd);
if nPixelFormat <> 0 then
 SetPixelFormat(DC,nPixelFormat,@Tpfd);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
ps: TPaintStruct;
begin
BeginPaint(Form1.Handle,ps);
glClearColor(0,0.10,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(20);
glColor3f(1,0,0);
glBegin(GL_LINES);
glVertex2f(Xf, -0.8);
glVertex2f(Xf-0.1, -1);
glVertex2f(Xf, -0.8);
glVertex2f(Xf+0.1, -1);
glEnd;
glFlush;
swapBuffers(dc);
EndPaint(Handle,ps);
end;



procedure TForm1.Timer1Timer(Sender: TObject);
var
ue:Real48;
begin
ue:=0.01;
BeginPaint(Handle, pubPS);
glPointSize(30);
 glBegin(GL_LINES);
if GetAsyncKeyState(VK_LEFT)<>0 then
KeyUp(Xf-ue);

if GetAsyncKeyState(VK_RIGHT)<>0 then
KeyUp(XF+ue);

if GetAsyncKeyState(VK_SPACE)<>0 then begin
 if FireUser=False then XFireUser:=Xf;
 FireUser:=True;
 end;

Fire;
glEnd;
glFlush;
swapBuffers(dc);
EndPaint(Handle,pubPS);
end;



procedure TForm1.KeyUp(XPixelPaint:Real48);
var
ps: TpaintStruct;
begin
 glColor3f(0,0.10,0);
 glBegin(GL_LINES);
  glVertex2f(Xf, -0.8);
  glVertex2f(Xf-0.1, -1);
  glVertex2f(Xf, -0.8);
  glVertex2f(Xf+0.1, -1);
 glEnd;

 Xf:=XPixelPaint;  // Здесь происходит глобальное сохранение координаты. Один раз(Выполнение таймера)

 glColor3f(1,0,0);

 glBegin(GL_LINES);
  glVertex2f(Xf, -0.8);
  glVertex2f(Xf-0.1, -1);
  glVertex2f(Xf, -0.8);
  glVertex2f(Xf+0.1, -1);
 glEnd;
end;

procedure TForm1.Fire();
var
ps:TpaintStruct;
begin
 if FireUser=true then begin
  glColor3f(0,0.10,0);
  glBegin(GL_LINES);
   glVertex2f(XFireUser, YFireUser-0.05);
   glVertex2f(XFireUser, YFireUser);
  glEnd;

  glColor3f(1,0,0);
  glBegin(GL_LINES);
  glVertex2f(XFireUser,YFireUser);
  glVertex2f(XFireUser,YFireUser+0.05);
  glEnd;
  YFireUser:=YFireUser+0.05;
  if YFireUser>=1.05 then begin

    FireUser:=False;
    YFireUser:=-0.8;
  end;
 end;
end;

end.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависает и перезагружается комп во время игры аЯвКЕДАХ Компьютерное железо 22 12.06.2010 21:31
Виртуальное время для игры aleksandr278 Помощь студентам 13 20.03.2010 21:22
Как улеличивать скорость движения во время движия Нур Помощь студентам 9 23.12.2009 13:00
Проблема одновременного нажатия клавиш, Pascal kupik Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 26.05.2009 17:11