我正在尝试在 ALLEGRO c++ 中对许多墙进行整理
I am trying to do collation in ALLEGRO c++ with many walls
所以我正在尝试制作一款包含整理的游戏,我一直在尝试并寻找适合我的游戏。
这是 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 个 player._Draw_wall 工作(我需要不确定数量的它们)。
我不太确定你到底想达到什么目的,你的问题是什么,但是通过查看你的代码,我立即发现了一些问题:
al_install_keyboard
(顾名思义)安装键盘子系统,应该只在游戏初始化时调用一次(在程序开始时发生)
获取键盘状态并检查是不好的做法,您应该研究一下 allegro 的事件系统。应该有一个主循环,它检查新事件(例如 al_get_next_event
)并根据它们的类型通过 switch
处理它们。在此开关中,您调用处理这些事件的函数(例如,当从键 A 接收到 ALLEGRO_EVENT_KEY_DOWN
事件时,应调用 Player::moveLeft
。此函数随后应更改播放器对象的状态(递减x).
将这些方法与不断 运行 并打开前门以检查是否有人,或者安装门铃并在门铃响时做出反应的方法进行比较。
游戏逻辑和渲染应该发生在不同的函数中。绘制墙函数应该只绘制一堵墙,而不是改变对象的状态。
如果你能进一步说明,你原来的问题是什么(第一面墙没有画出来吗?),我也会调查一下。
所以我正在尝试制作一款包含整理的游戏,我一直在尝试并寻找适合我的游戏。
这是 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 个 player._Draw_wall 工作(我需要不确定数量的它们)。
我不太确定你到底想达到什么目的,你的问题是什么,但是通过查看你的代码,我立即发现了一些问题:
al_install_keyboard
(顾名思义)安装键盘子系统,应该只在游戏初始化时调用一次(在程序开始时发生)获取键盘状态并检查是不好的做法,您应该研究一下 allegro 的事件系统。应该有一个主循环,它检查新事件(例如
al_get_next_event
)并根据它们的类型通过switch
处理它们。在此开关中,您调用处理这些事件的函数(例如,当从键 A 接收到ALLEGRO_EVENT_KEY_DOWN
事件时,应调用Player::moveLeft
。此函数随后应更改播放器对象的状态(递减x). 将这些方法与不断 运行 并打开前门以检查是否有人,或者安装门铃并在门铃响时做出反应的方法进行比较。游戏逻辑和渲染应该发生在不同的函数中。绘制墙函数应该只绘制一堵墙,而不是改变对象的状态。
如果你能进一步说明,你原来的问题是什么(第一面墙没有画出来吗?),我也会调查一下。