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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2010, 03:05   #1
Корвин
Пользователь
 
Аватар для Корвин
 
Регистрация: 07.02.2010
Сообщений: 31
По умолчанию Аномалии

прототип:
Код:
class _engine{
protected:
	int px;
	int py;
	int map[20][20];
	HDC hdc;
	RECT rect;
	HWND hwnd;
	HBRUSH brush;
public:
	_engine();
	void init(HWND,HDC);
	void drawMap();
	void drawPlayer();
	bool driver();

};
Описание:
Код:
#include "engine.h"
_engine::_engine(){
	for(int i=0;i<20;i++)
		for(int j=0;j<20;j++)
			this->map[i][j]=0;
	this->px=0;
	this->py=0;
}
void _engine::init(HWND _hwnd,HDC _hdc){
	GetWindowRect(_hwnd,&this->rect);
	this->hwnd = _hwnd;
	this->hdc = _hdc;
}
void _engine::drawMap(){
	this->brush = CreateSolidBrush(RGB(0xFF,0x36,0x26));
	SelectObject(this->hdc,this->brush);
	Rectangle(this->hdc,0,0,400,400);
	DeleteObject(this->brush);
}
void _engine::drawPlayer(){
	this->brush = CreateSolidBrush(RGB(0x33,0x00,0x00));
	SelectObject(this->hdc,this->brush);
	Rectangle(this->hdc,20*this->px,20*this->py,10*(this->px+1),20*(this->py+1));
	DeleteObject(this->brush);
}
bool _engine::driver(){
	int x=this->px;
	int y=this->py;

		if(GetAsyncKeyState(0x53) < 0)//down
		y+=1;
	else if(GetAsyncKeyState(0x57) < 0)//up
		y-=1;
	else if(GetAsyncKeyState(0x44) < 0)//right
		x+=1;
	else if(GetAsyncKeyState(0x41) < 0)//left
		x-=1;

	if(x == this->px && y == this->py) return false;
	this->px=(((x) < 0) ? (19):(((x) > 19) ? (0):(x)));
	this->py=(((y) < 0) ? (19):(((y) > 19) ? (0):(y)));
	

	return true;
}
Описание:
Необходимый материал предоставлен, теперь можно перейти и к основному вопросу.
И так, приступим.
Есть некое поле размером 20х20секторов размером 20х20 (Размер поля 400)
Есть некий объект размером 20
Описание:
при нажатии одноиз клавишь w a s d объект осуществляет действие в ту или иную сторону, в зависимости от клавиши.
Но в данном случае, вмессто того, что бы переместиться на 1 сектор вперед, объект перемещается через 2 сектора стабильно.
Вопрос:
Почему так и как это иправить?
(!)Ответ необходим только в рамках поставленного вопроса,не больше не меньше и по существу.
#define true false
У сверхпрограммы будут сверхглюки, ха-ха!
Корвин вне форума Ответить с цитированием
Старый 09.02.2010, 12:50   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

И как вы вызываете метод driver? Приведите код главного цикла.
MaTBeu вне форума Ответить с цитированием
Старый 09.02.2010, 13:17   #3
Корвин
Пользователь
 
Аватар для Корвин
 
Регистрация: 07.02.2010
Сообщений: 31
По умолчанию

_tWinMain():
Код:
while (GetMessage(&msg, NULL, 0, 0))
	{			
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			if(engine.driver())
				InvalidateRect(msg.hwnd,NULL,TRUE);
			DispatchMessage(&msg);
		}
		
	}
WndProc():
Код:
case WM_PAINT:
		//UpdateWindow(hWnd);
		hdc = BeginPaint(hWnd, &ps);
		// TODO: Add any drawing code here...
		engine.init(hWnd,hdc);
		engine.drawMap();
		engine.drawPlayer();
		EndPaint(hWnd, &ps);
		break;
engine - Глобальная переменная
#define true false
У сверхпрограммы будут сверхглюки, ха-ха!
Корвин вне форума Ответить с цитированием
Старый 09.02.2010, 16:50   #4
Корвин
Пользователь
 
Аватар для Корвин
 
Регистрация: 07.02.2010
Сообщений: 31
По умолчанию

Идей ни у кого не появилос, в чем может быть проблема?
#define true false
У сверхпрограммы будут сверхглюки, ха-ха!
Корвин вне форума Ответить с цитированием
Старый 09.02.2010, 21:14   #5
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

не в том месте обработка клавишь. в процедуре окна нужно ловить правильные сообщения и там уже изменять координаты. а переход на две клеточки возможно происходит из-за того, что при нажатии на клавишу винда генерит несколько сообщений (допустим два), и на каждое такое сообщение вызывается драйвер. в драйвере проверяется состояние кнопки, она оказывается нажатой и т.о. происходит перемещение на две позиции.
В виндовых внутренностях не силен, так что все может быть и по другому. дебагер вам в помощь. ну или какие-нибудь логи/трейсы того, что происходит.
_Ч_ вне форума Ответить с цитированием
Старый 10.02.2010, 01:57   #6
Корвин
Пользователь
 
Аватар для Корвин
 
Регистрация: 07.02.2010
Сообщений: 31
Радость

Допустим, теоретически это так.
Но перехват клавишь у меня выкинуть восновной поток только для того, что бы недыло как раз таких проблем с дублированием сообщений...
Хотя надо попробывать вашу идею, может пойдет.
У кого есть еще какие идеи?
#define true false
У сверхпрограммы будут сверхглюки, ха-ха!
Корвин вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аномалии ListBox'a Viteef Компоненты Delphi 3 22.05.2007 20:09