exgdreamer 2023-05-31 22:47 采纳率: 53.3%
浏览 26
已结题

我正在写一个斗地主程序 现在想实现点牌上移,但是每次点牌时候只是瞬间上移,松开鼠标之后牌还是回原位(语言-c++)

我正在写一个斗地主程序
现在想实现点牌上移,但是每次点牌时候只是瞬间上移,松开鼠标之后牌还是回原位
下面是部分代码(所有代码都在main.cpp的一个大循环中)

//gamingView.cpp
bool isClick[20] = { false };
int clicked[20];  // 点击了哪张牌
int clicked_count = 0;  // 当前处于点击状态的牌的数量
void moveImg(dealCards a, int x, int clicked[], int& clicked_count) {

    if (!isClick[x]) {
        cardPos[x][1] -= 40;
        isClick[x] = true;
        clicked[clicked_count++] = x;
    }
    else
    {
        cardPos[x][1] += 40;
        isClick[x] = false;

        // 把当前牌从 clicked 数组中移除
        for (int i = 0; i < clicked_count; i++) {
            if (clicked[i] == x) {
                clicked[i] = clicked[clicked_count - 1];
                clicked_count--;
                break;
            }
        }
    }

    for (int t = 0; t < 17; t++) {
        int j = a.player1[t].order;
        // 更新已经被点击过的牌的位置
        bool updated = false;
        for (int i = 0; i < clicked_count; i++) {
            if (clicked[i] == t) {
                putimage(cardPos[t][0], cardPos[t][1], &t_cards[j]);
                updated = true;
                break;
            }
        }
        if (!updated) {
            putimage(cardPos[t][0], cardPos[t][1], &t_cards[j]);
        }
    }



}

void gameingView::render() {
    if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {
        curView = new menuView;
    }

    //发牌
    static dealCards a;
    putimage(0, 0, &img_bg[1]);
    if (!this->isRandom) {
        a.Initalize();
        a.send();
        this->isRandom = true;
    }
    a.show();

    //点牌上移
    ExMessage msg = getmessage(EX_MOUSE);

    //拆出来的按钮
    for (int i = 0; i < 20; i++)
    {
        if (msg.x >= cardPos[i][0] && msg.x <= cardPos[i][0] + 50 &&
            msg.y >= cardPos[i][1] && msg.y <= cardPos[i][1] + cards[0].getheight()) {
            switch (msg.message) {
            case WM_LBUTTONDOWN://鼠标按键动作    
                moveImg(a, i, clicked, clicked_count);
                break;
            }
        }
    }

    return;
}
//dealCard.cpp
void dealCards::show() {

    for (int i = 0; i < 17; i++) {
        int j = player1[i].order;
        int x = 178, y = 494;         
        cardPos[i][0] = x + 50 * i;//图片左上角x
        cardPos[i][1] = y; //图片左上角y
        transparentimage(NULL, cardPos[i][0], cardPos[i][1], &t_cards[j]);

        //三张可能的地主牌初始为零
        cardPos[17][0] = cardPos[18][1] = cardPos[18][0] = 
            cardPos[18][1] = cardPos[19][0] = cardPos[19][1] = 0;
    }

    //左右两个小牌代表两个bot的牌(不详细展示)
    IMAGE t;
    loadimage(&t, "img/card_bg.png", 68, 100);
    putimage(194, 292, &t);
    putimage(1019, 292, &t);
}
//dealCard.h
#pragma once
#include<iostream>
#include<string>
#include<easyx.h>
#include"img.h"
using namespace std;
#include"headInclude.h"
class dealCards
{
public:
    enum color {
            spade,
            heart,
            diamond,
            club,
            joker
        };//黑桃,红桃,方块,梅花,王

    struct poker
    {
        int num;//点数
        color colors;//花色
        int score;//分数(在斗地主中牌的大小,2最大3最小)
        int order;//牌的顺序,从黑桃a(0)开始到大王(53)
    };
    void send();
    void show();
    void Initalize();
    void rule(poker* card);
    poker pokers[54];
    poker player1[17];
    poker player2[17];
    poker player3[17];
    poker landlord[3];

    

};
//图片左上角的x和y
    extern int cardPos[20][2];

请尽量不要使用gpt

  • 写回答

2条回答 默认 最新

  • qq_53090785 2023-06-01 09:33
    关注

    代码暂时没看出啥,moveImg你在哪里还调用过吗

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月10日
  • 已采纳回答 6月2日
  • 创建了问题 5月31日

悬赏问题

  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件
  • ¥15 逐月累计,月份不连续,补齐月份
  • ¥15 应用简单的Python代码完成一个学生成绩管理系统
  • ¥15 用matlab求微分方程初值问题
  • ¥15 vscode下编写第三方库opencv与pcl代码时没有代码提示
  • ¥15 能够跑通不报错,如何解决?(标签-matlab)
  • ¥15 MOS在RDS较大,频率高时开关波形异常
  • ¥15 SCENIC分析报错求解答