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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2013, 14:40   #1
OnlyHope
Пользователь
 
Регистрация: 06.12.2013
Сообщений: 10
По умолчанию Кнопки в игре (Новая игра, справка и тд)

Всем Доброго времени суток!
Пишу "Змейку" в borland c++ builder
Змейка рабочая, но как только пытаюсь в форму сбоку от игры добавить кнопку, управление у змейки теряется. Сама кнопка становиться рабочей. Не знаю как зделать так что бы управление игры не терялось. Подскажите что нибудь.



Ошибок компелятор ни каких не выдает

Просто дело вот в чем, добавляю кнопку, прописываю вот это:

Код:
 //------------------------------------------------------
 void __fastcall TForm1::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
 {
     Timer1->Enabled=false;
     ShowMessage("Продолжить");
     Timer1->Enabled=true;
 }
 //-------------------------------------------------------
Появляется кнопка ПАУЗА, после первого ее нажатия, нажимаю ОК и змейка теряет управление, просто продолжает движение и все, на кнопки не реагирует. Вопрос такой: Как переключить обратно управление на змейку?

Прошу помоч не просто подсказать, а и разобраться.

Последний раз редактировалось OnlyHope; 06.12.2013 в 22:20.
OnlyHope вне форума Ответить с цитированием
Старый 06.12.2013, 15:31   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Мы должны догадаться что и как вы делаете и подсказать верное решение?
Хорошо - не используйте события клавиатуры а используйте TranslateAccelerator().
waleri вне форума Ответить с цитированием
Старый 06.12.2013, 15:37   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

ИТД, это уже интересно.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.12.2013, 15:39   #4
OnlyHope
Пользователь
 
Регистрация: 06.12.2013
Сообщений: 10
По умолчанию

Извиняюсь за не очень корректный вопрос вот код программы:

Код:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//-----------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;     						//Главная форма

Graphics::TBitmap*BackCanvas;			//Canvas границ
Graphics::TBitmap*ZmeyaBlock[6];		//Canvas змейки
Graphics::TBitmap*LevelImage;           //Canvas Level


TPoint Piton[100];			//Положение змейки
TPoint EdaPos;				//Положение еды

int PitonHead;              //Направление головы змеи
int PitonLength;  	    //Длина змеи
int PitonDirect;  	    //Куда движется змея
enum {Right,Down,LEFT,Up};  //Массив направления змеи
int NumberOfEatedEda;       //Кролличество съеденой еды
int Level;                  //Уровень

//-------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Level=1;

BackCanvas=new Graphics::TBitmap();
BackCanvas->Width =600;
BackCanvas->Height=600;


Graphics::TBitmap*temp=new Graphics::TBitmap();
temp->LoadFromFile("Zmeya.bmp");

for(int i=0;i<6;i++)                  //Изображение змейки
	{
	ZmeyaBlock[i]=new Graphics::TBitmap();
	ZmeyaBlock[i]->Width=40;
	ZmeyaBlock[i]->Height=40;
	ZmeyaBlock[i]->Canvas->CopyRect(Rect(0,0,40,40),temp->Canvas,Rect(i*40,0,i*40+40,40));
	ZmeyaBlock[i]->Transparent=true;
	}
temp->Free();
StartPositionPiton();
}
//-------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)          //Таймер
{
int temp=PitonHead-1;

if(temp<0)temp=PitonLength-1;

int tx=Piton[PitonHead].x;
int ty=Piton[PitonHead].y;

PitonHead=temp;

if(PitonDirect==LEFT) tx--;
if(PitonDirect==Right)tx++;
if(PitonDirect==Up)   ty--;
if(PitonDirect==Down) ty++;
													  //Проверка выхода змейки за границы
if((ty>14)||(ty<0)||(tx>14)||(tx<0))
	{
	End();
	}
else
	{
	Piton[PitonHead]=Point(tx,ty);
	}
//------------
if(HitTest())End();                   //Проверка скушала ли змейка

if(HitEda())
{
        EdaPos=Point(random(15),random(15));
        Piton[PitonLength]=Piton[temp];
        NumberOfEatedEda++;
        PitonLength++;
        {
        if(NumberOfEatedEda>25)
                {
                        Level++;
                        StartPositionPiton();
                        if(Level>4)
                        {
                                Timer1->Enabled=false;
                                ShowMessage("Поздравляем, вы прошли игру 'Snake'. Вы Win по жизни))");
                                Close();
                        }
                }
        }
}
ClearBuffer();
DrawPiton();
DrawEda();
FlipBuffer();
}
//-------------

void __fastcall TForm1::StartPositionPiton()   //Начало змейки
{
Piton[0]=Point(5,1);
Piton[1]=Point(4,1);
Piton[2]=Point(3,1);
Piton[3]=Point(2,1);
Piton[4]=Point(1,1);

PitonLength=3;
PitonHead=0;
PitonDirect=Right;
EdaPos=Point(random(15),random(15));
NumberOfEatedEda=0;
if(LevelImage!=NULL)LevelImage->FreeImage();
    else LevelImage=new Graphics::TBitmap();
LevelImage->LoadFromFile(IntToStr(Level)+".bmp");
Caption="Snake    Level "+IntToStr(Level);
}

//--------

void __fastcall TForm1::DrawPiton()      //Рисует змейку
{
for(int i=0;i<PitonLength;i++)
	{
	if(i!=PitonHead)
		{
        BackCanvas->Canvas->Draw(Piton[i].x*40,Piton[i].y*40,ZmeyaBlock[4]);
		}
	else
        {
        BackCanvas->Canvas->Draw(Piton[i].x*40,Piton[i].y*40,ZmeyaBlock[PitonDirect]);
		}
	}
}

//------------------
void __fastcall TForm1::ClearBuffer()    			//Очищает Canvas
{
BackCanvas->Canvas->CopyRect(Rect(0,0,600,15*NumberOfEatedEda), LevelImage->Canvas, Rect(0,0,300,15*NumberOfEatedEda));
BackCanvas->Canvas->FillRect(Rect(0,15*NumberOfEatedEda,600,600));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FlipBuffer() 			//Задает задний Canvas
{
Canvas->Draw(0,0,BackCanvas);
}
//-----------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,TShiftState Shift)   //Событие нажатия клавиш
{
if(PitonDirect!=Down)if(Key==VK_UP)   	{PitonDirect=Up;}
if(PitonDirect!=Up)if(Key==VK_DOWN) 	{PitonDirect=Down;}
if(PitonDirect!=Right)if(Key==VK_LEFT) 	{PitonDirect=LEFT;}
if(PitonDirect!=LEFT)if(Key==VK_RIGHT)	{PitonDirect=Right;}
}
OnlyHope вне форума Ответить с цитированием
Старый 06.12.2013, 15:39   #5
OnlyHope
Пользователь
 
Регистрация: 06.12.2013
Сообщений: 10
По умолчанию

Код:
//----------

bool __fastcall TForm1::HitTest()                       //Проверка положения змеи
{
for(int i=0;i<PitonLength;i++)
        {
                if(PitonHead!=i)
                {
                        if((Piton[PitonHead].x==Piton[i].x)&&(Piton[PitonHead].y==Piton[i].y))
                        return true;
                }
        }
return false;
}
//---------
void __fastcall TForm1::End()      //Конец
{
	  Timer1->Enabled=false;
	  ShowMessage("Game Over");
	  StartPositionPiton();
          Timer1->Enabled=true;

}
//---------------
void __fastcall TForm1::DrawEda()      //Рисует Еду
{
if (!HitTest())
        BackCanvas->Canvas->Draw(EdaPos.x*40,EdaPos.y*40,ZmeyaBlock[5]);
}
//---------------
bool __fastcall TForm1::HitEda()             //Взял Еду
{
        int tx=Piton[PitonHead].x;
        int ty=Piton[PitonHead].y;
        if((tx==EdaPos.x)&&(ty==EdaPos.y))return true;
        else return false;
}
//--------------
void __fastcall TForm1::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
        Timer1->Enabled=false;
        ShowMessage("Продолжить");
        Timer1->Enabled=true;
}
//-------------
OnlyHope вне форума Ответить с цитированием
Старый 06.12.2013, 15:44   #6
OnlyHope
Пользователь
 
Регистрация: 06.12.2013
Сообщений: 10
По умолчанию

Игра запускается, кнопка пауза работает, а змейкой управлять нельзя, если убрать кнопку пауза, то змея снова становиться управляемой
OnlyHope вне форума Ответить с цитированием
Старый 06.12.2013, 16:03   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от OnlyHope Посмотреть сообщение
Извиняюсь за не очень корректный вопрос вот код программы:
И чё с ним делать? Он не бумажный. Даже задницу подтереть и то не получится.
Проблеммный участок кода показываем. Ошибки компилятора. Мне, и 99,9% програпммёров, на твой код плевать с высокой горки.
Ели я выложу сюда, хотя-бы одну из своих прог (в тексте), это займёт страниц 200. Мне это нужно? А Вам?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 06.12.2013 в 16:14.
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.12.2013, 16:16   #8
OnlyHope
Пользователь
 
Регистрация: 06.12.2013
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
И чё с ним делать? Он не бумажный. Даже задницу подтереть и то не получится.
Вот проект http://yadi.sk/d/XJGCaVn_DsMEY
OnlyHope вне форума Ответить с цитированием
Старый 06.12.2013, 16:25   #9
OnlyHope
Пользователь
 
Регистрация: 06.12.2013
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
И чё с ним делать? Он не бумажный. Даже задницу подтереть и то не получится.
Проблеммный участок кода показываем. Ошибки компилятора. Мне, и 99,9% програпммёров, на твой код плевать с высокой горки.
Ели я выложу сюда, хотя-бы одну из своих прог (в тексте), это займёт страниц 200. Мне это нужно? А Вам?
Ошибок нет, дело в том, что когда добовляю:

void __fastcall TForm1::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
Timer1->Enabled=false;
ShowMessage("Продолжить");
Timer1->Enabled=true;
}
//-------------

Появляется кнопка ПАУЗА, после первого ее нажатия, нажимаю ОК и змейка теряет управление, просто продолжает движение и все, на кнопки не реагирует. Вопрос такой: Как переключить обратно управление на змейку?

Последний раз редактировалось OnlyHope; 06.12.2013 в 17:01.
OnlyHope вне форума Ответить с цитированием
Старый 12.12.2013, 13:08   #10
virtual3dmd
Новичок
Джуниор
 
Регистрация: 12.12.2013
Сообщений: 1
По умолчанию

void __fastcall TForm1::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
Timer1->Enabled=false;
ShowMessage("Продолжить");
Button1->Hide(); //+
Button1->Show(); //+
Timer1->Enabled=true;
TTimer *Timer1;

Вот добавь это и всё будет отлично ))

Последний раз редактировалось virtual3dmd; 12.12.2013 в 16:13.
virtual3dmd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новая Игра xxxtigrxxx Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 18.06.2011 16:20
Новая браузерная игра san1234 Gamedev - cоздание игр: Unity, OpenGL, DirectX 10 26.09.2009 18:53
Нажатие кнопки в игре програмно? KoSMoS Общие вопросы Delphi 4 27.07.2009 19:39