Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
myloran

Вызов Keypress события из собственного класа и другие общие неясности по windows forms. Критика проэкта, пожелания и предложения.

08.04.2012, 20:58. Показов 1000. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте форумчане cyberforum.ru!
Есть несколько проблем, связаные с написанием моего проэкта. Суть проэкта - создать примитивную игру в стиле ооп, в которой будет реализовано движение, стрельба, искуственный интелект(в дальнейшем АИ) и прочее. С windows forms я столкнулся впервые, немного почитав кое-что об этом и спроэктировал проэкт и сразу принялся за написание кода, естественно не совсем все идет гладко. Планируется создать несколько форм, которые послужат для выбора опций игры и запуска самой игры, а также классы, в которых будет реализован сам движок игры.

Итак, имеется 2 класса(соответственно 2 файла .h и .cpp для каждого):
Game - в котором создается карта уровня, добавляется игрок, АИ и прочее.
Level - cоздание уровня, а также(пока что) все ниже перечисленное.
//Еще не реализованые, только задуманые - это минимум:
Player - добавления игрока.
Enemy - добавление АИ.
На форме, где находится button, запускающий игру, при батн.клике инициализуется экземляр класса Game и выполнятся функция run.

//Не по теме: как засунуть в спойлер?
Сразу выкидываю все, что есть:

1) Level.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#pragma once
 
//#include <list>
using namespace System::Windows::Forms;
 
#include "Play.h"
 
class Easy;
class Game;
//class Play;
 
//#include "Play.h"
 
//#include "Easy.h"
 
enum
{
    tileWall,
    tileEmpty
};
 
struct vector 
{
    int x;
    int y;
};
 
value class Level
{
public:
    Level(Form ^ae, int xSize, int ySize);
    // Level:
    void newLevel();
    // Player:
    void addPlayer(Form ^abc, int lives);
    void addKeypress(char w, char s, char a, char d);
    // Enemies:
    //int addEnemies(int num, int lives);
    bool move(float x, float y);
    //void idleUpdate(int speed);
 
private:
    int height, width;
    //vector pos;
    char w_key, s_key, a_key, d_key;
    int num_lives;
    int **memory;
    int video;
    //LevelForm *levelForm;
    // Level:
    void createMemory();
    void createLevel();
    void drawLevel(Form ^form);
    //void form_KeyPress(System::Object^  sender, KeyPressEventArgs^  e);
    //std::list <int *> npc;
    //std::list <int *>::iterator Iter; 
};
2) Level.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "StdAfx.h"
#include <msclr/auto_gcroot.h>
#include "Level.h"
 
#include <stdlib.h>
 
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
 
Level::Level(Form ^ae, int xSize, int ySize)
{
    height = xSize;
    width = ySize;
    video = 70;
}
 
void Level::newLevel()
{
    // Create Form:
    Form ^frm1 = gcnew Form();
    //Form ^frm1 = new msclr::auto_gcroot<Play>; 
    frm1->ControlBox = false;
    frm1->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
 
    // Draw sprites:
 
    createMemory();
    createLevel();
    drawLevel(frm1);
    addPlayer(frm1, 3);
 
    frm1->ShowDialog();
}
 
 
void Level::addPlayer(Form ^form, int lives)
{
    num_lives = lives;
    PictureBox ^picture = gcnew PictureBox();
    picture->Load("image1.png");
    picture->Location = Point(video, video);
    picture->Size = System::Drawing::Size(video, video);
    picture->SizeMode = PictureBoxSizeMode::StretchImage;
    form->Controls->Add(picture);
    //if (picture->KeyPress = KeyPressEventHandler(picture,HANDLE hande)) picture->Location = Point(10, 10);
    //if (picture->OnKeyPress(KeyPressEventArgs::KeyPressEventArgs('w')) picture->Location = Point(100, 100);
    //KeyPressEventArgs ^ex;
    //if(ex->KeyChar == 'f') picture->Location = Point(100, 100);
    //form->KeyPress += gcnew System::Windows::Forms::KeyPressEventHandler(form, &form::form_KeyPress);
}
 
/*void form_KeyPress(System::Object^  sender, KeyPressEventArgs^  e) 
{
    PictureBox ^picture = gcnew PictureBox();
    if (e->KeyChar == 'f')  picture->Location = Point(100,100);
    if (e->KeyChar == 'v')  picture->Location = Point(100,100);
    if (e->KeyChar == 'c')  picture->Location = Point(100,100);
    if (e->KeyChar == 'b')  picture->Location = Point(100,100);
}*/
 
void Level::addKeypress(char w, char s, char a, char d)
{
    w_key = w;
    s_key = s;
    a_key = a;
    d_key = d;
}
 
void Level::createMemory()
{
    memory = new int *[width];
    for (int x = 0; x < width; x++)
    {
        memory[x] = new int[height];
    }
}
 
void Level::createLevel()
{
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            int random = rand() % 100;
            if (i > 2 || j > 2 || i == 0 || j == 0)
            {
                if (random < 10 || i == 0 || j == 0 || i == height - 1 || j == width - 1)
                {                               
                    memory[i][j] = tileWall;
                }
 
                else
                {
                    memory[i][j] = tileEmpty;
                }
            }
        }
    }
}
 
void Level::drawLevel(Form ^form)
{
    form->ClientSize = Size(width * video, height * video);
    form->BackColor = Color::White;
 
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            if (memory[i][j] == tileWall)
            {
                PictureBox ^picture = gcnew PictureBox();
                //picture->Image = Image::FromFile("2.jpg");
                //picture->ImageLocation = "2.jpg";
                picture->Load("Wall1.png");
                //picture->Load("rustic_stone_wall_1.6asyqh0yiqskw4sws0wwkkc40.ck7qz69lrcow4wwg0s4w8c4wc.th.jpeg");
                picture->Location = Point(i * video, j * video);
                picture->Size = System::Drawing::Size(video, video);
                //Picture->BackgroundImage = System::Drawing::Image::FromFile(filename);
                //picture->BackgroundImageLayout = ImageLayout::Stretch;
                picture->SizeMode = PictureBoxSizeMode::StretchImage;
                form->Controls->Add(picture);
            }
        }
    }
}
 
bool Level::move(float x, float y)
{
    return true;
}
3) Game.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
 
#include "Level.h"
 
#include "Play.h"
 
class Game
{
public:
    Game();
    Game(int diff, int video, int audio, char up, char down, char left, char right, char fire);
    bool run();
 
private:
    Level *level;
    int dif, vid, aud;
    char up_key, down_key, left_key, right_key, fire_key;
 
};
4) Game.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "StdAfx.h"
#include "Game.h"
#include "Play.h"
 
Game::Game()
{   
    dif = 1;
    vid = 1;
    aud = 1;
 
    up_key = 'w';
    down_key = 's';
    left_key = 'a';
    right_key = 'd';
    fire_key = ' ';
}
 
Game::Game(int diff, int video, int audio, char up, char down, char left, char right, char fire)
{
    dif = diff;
    vid = video;
    aud = audio;
 
    up_key = up;
    down_key = down;
    left_key = left;
    right_key = right;
    fire_key = fire;
 
}
 
bool Game::run()
{
    Form ^ae = gcnew Form();
    Level level(ae, 10, 10);
    level.newLevel();
    return true;
}
5) Код кнопки в форме:
C++
1
2
3
4
5
6
7
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
             this->Hide();
             Game game;
             game.run();
             this->Show();
             
         }
Код очень далек от идеала и я это понимаю, но прошу сильно не бить ... сначала, думаю, функционал настроить, а потом уже порядки наводить ...

А теперь пора перейти к самой проблеме, которая у меня пока что одна, но без ее решения дальше двигатся не охотно. Суть проблемы в том, что нужно добавить событие Keypress на новосозданную форму, что у меня не получается. Можно-ли событие Keypress добавить на форму непосредственно с класа Level, а если можно, то как? Возможно-ли заинклудить форму(в даном случае Play.h), чтобы на ней создать событие Keypress и через функцию addKeypress в соответственном классе передавать на какие клавиши двигать игрока. Или же есть альтернативное решение моей проблемы?

З.Ы. Очень надеюсь, что хотя бы кто-то это прочитает, хотя в любом случае попытка не пытка ... Заранее спасибо!
З.Ы.Ы. Любая критика, любые пожелания, примечания, все приму с огромнейшим удовольствием!
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2012, 20:58
Ответы с готовыми решениями:

Пожелания и критика автомобильного сайта
Привет всем, хотел бы чтобы Вы высказали свое мнение по сайту Автомобильный гид хотя содержимое сайта может еще не полностью...

Нужен совет SEOшников, критика проэкта
Спецы посмотрите пожалуйста ld-print.com.ua Хотелось бы услышать мнения по поводу юзабилити, дизайна, да и вообще интересно ваше...

Использование собственного класса в Windows Forms
Здравствуйте! Прошу помочь мне с использованием собственного класса (последовательный алгоритм шифрования RSA) - представлен усеченный...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.04.2012, 20:58
Помогаю со студенческими работами здесь

Использование собственного класса в Windows Forms
Здравствуйте, есть такая проблема, никак не могу понять как в Winwows Forms использовать свой класс. Есть у меня класс class.cpp, form1.h,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru