Я пытаюсь сделать сопоставление в ALLEGRO C ++ со многими стенами - PullRequest
0 голосов
/ 26 января 2019

Итак, я пытаюсь создать игру, в которой есть сопоставление, и я пытаюсь найти то, что мне подходит.

Это файл class.cpp

    #include "Player.h"
#include <iostream>
#include <string>
#include <allegro5/allegro.h>
#include <allegro5/allegro_ttf.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro.h>
#include <locale>
#include <sstream>
#include <Windows.h>
#include <math.h>
#include "allegro5/allegro_primitives.h"
#include <fstream>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h> 
#include <conio.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>
#include <stdio.h>

using namespace std;


Player::Player()
{
}


Player::~Player()
{
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool _Touch(int allegro_key) {
    al_install_keyboard();
    ALLEGRO_KEYBOARD_STATE keyState;
    al_get_keyboard_state(&keyState);

    if (allegro_key >= 256) return false;
    if (al_key_down(&keyState, allegro_key)) {
        cout << allegro_key << endl;
        return true;
    }
    else {
        return false;
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////



void Player::_Draw_cross(ALLEGRO_EVENT &event, ALLEGRO_EVENT_QUEUE *queue, ALLEGRO_BITMAP *CROSS, int &x, int &y) {
    Cross = CROSS;
    al_draw_bitmap(CROSS, x, y, 0);
    if (_FLAG_s) {
        if (_Touch(ALLEGRO_KEY_W)) {
            y -= 5;
        }
        if (_Touch(ALLEGRO_KEY_A)) {
            x -= 5;
        }
        if (_Touch(ALLEGRO_KEY_D)) {
            x += 5;
        }

    }
    else if (_FLAG_t) {

        if (_Touch(ALLEGRO_KEY_S)) {
            y += 5;
        }
        if (_Touch(ALLEGRO_KEY_A)) {
            x -= 5;
        }
        if (_Touch(ALLEGRO_KEY_D)) {
            x += 5;
        }
    }
    else if (_FLAG_x) {
        cout << "DD" << endl;
        if (_Touch(ALLEGRO_KEY_W)) {
            y -= 5;
        }
        if (_Touch(ALLEGRO_KEY_S)) {
            y += 5;
        }
        if (_Touch(ALLEGRO_KEY_A)) {
            x -= 5;
        }

    }
    else if (_FLAG_y) {
        if (_Touch(ALLEGRO_KEY_W)) {
            y -= 5;
        }
        if (_Touch(ALLEGRO_KEY_S)) {
            y += 5;
        }

        if (_Touch(ALLEGRO_KEY_D)) {
            x += 5;
        }

    }
    else {
    if (_Touch(ALLEGRO_KEY_W)) {
        y -= 5;
    }
    if (_Touch(ALLEGRO_KEY_S)) {
        y += 5;
    }
    if (_Touch(ALLEGRO_KEY_A)) {
        x -= 5;
    }
    if (_Touch(ALLEGRO_KEY_D)) {
        x += 5;
    }
    }
}
bool Player::_Draw_wall(float x, float y, float x2, float y2, ALLEGRO_COLOR color, int s, int t) {
    al_draw_filled_rectangle(x, y, x2, y2, color);
    int s1 = (al_get_bitmap_height(Cross) + s), t1 = (al_get_bitmap_width(Cross) + t);
    if (s1 >= x && s <= x2 && t1 >= y && t <= y2) {
        if      (s <= x) {
            _FLAG_x = true;
        }
        else if (s >= x2) {
            _FLAG_y = true;
        }
        else if (t1 <= y) {
            _FLAG_s = true;
        }
        else if (t >= y2) {
            _FLAG_t = true;
        }
        else {
            _FLAG_x = false, _FLAG_y = false, _FLAG_s = false, _FLAG_t = false;
        }
        return true;
    }
    else { 
        _FLAG_x = false, _FLAG_y = false, _FLAG_s = false, _FLAG_t = false;
        return false; }
}

и я пытаюсь использовать

        player._Draw_wall(0, 0, 20, 1080, al_map_rgb(255, 255, 255), x, y);
        player._Draw_wall(0, 0, 1920, 20, al_map_rgb(255, 255, 255), x, y);

но работает только последний.

Может ли кто-нибудь помочь с работой более 1 игрока ._Draw_wall (мне нужно их неопределенное количество).

1 Ответ

0 голосов
/ 05 февраля 2019

Я не совсем уверен, чего именно вы пытаетесь достичь, и в чем ваша проблема, но, посмотрев на ваш код, я сразу обнаружил некоторые проблемы:

  • al_install_keyboard (как следует из названия) устанавливает подсистему клавиатуры и должна вызываться только один раз при инициализации игры (происходит при запуске программы)

  • Получив состояние клавиатуры и проверив, что это плохая практика, вы должны взглянуть на систему событий allegro. Должен быть основной цикл, который проверяет новые события (например, с al_get_next_event) и обрабатывает их через switch в зависимости от их типа. В этом переключателе вы вызываете функции, которые имеют дело с этими событиями (например, Player::moveLeft должен вызываться при получении события ALLEGRO_EVENT_KEY_DOWN от клавиши A. Затем эта функция должна изменить состояние объекта игрока (уменьшив x). Сравните их с методами постоянного бега и открытия входной двери, чтобы проверить, есть ли там кто-то, или установки дверного звонка и просто реагирования, когда он звонит.

  • Логика игры и рендеринг должны происходить в разных функциях. Функция рисования стены должна только рисовать стену, а не изменять состояние объекта.

Если бы вы могли уточнить, в чем заключается ваша изначальная проблема (разве первая стена не прорисована?), Я также рассмотрю ее.

...