铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 1565|回复: 4

关于复刻版图像图形显示

[复制链接]
发表于 2009-5-14 00:48 | 显示全部楼层 |阅读模式
有两个问题。
第一个,我看见代码里有几个procedure是显示图形的,我用了display_img和putpixel。我先用putpixel,再用display_img,可是display_img画出的图像竟然在putpixel之下?怎么没有覆盖?倒是putpixel画出的图形把display_img的图像覆盖了。我试着调换了一下这两个procedure的位置,先用display_img,再用putpixel,这时putpixel显示出的图像是上一次使用时画出的的,不是最近这次画出的图形,而且总是滞后一次。
第二个,SDL_UpdateRect会不会清除掉背景?我用display_img显示了一个图像,清屏范围稍微比这个图像大了一点儿(因为我使用putpixel画图形稍微画出去了一些),然后背景还有,但是再用display_img显示那个图像就显示不出来了……不知道为什么?
不过今天也做出了一个界面,五子棋的,看附件吧~~~(ai的算法还没有,只把界面做出来了)

[发帖际遇]: 真正的强强去长白山捉火蟾,掉入泥沼中,损失银两17.


[ 本帖最后由 真正的强强 于 2009-5-14 00:56 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-5-14 08:40 | 显示全部楼层
......组织上严重需要你。。
加入工作组吧。。。

[发帖际遇]: 黄顺坤跟踪成昆进入明教密道,结果:修炼成功乾坤大挪移,增加银两16.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-5-14 10:14 | 显示全部楼层
你贴源码来看看
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-5-14 19:32 | 显示全部楼层
那个五子棋的显示棋盘和棋子用display_img,画方框用putpixel:
举个鼠标移动时重画棋盘和边框的例子:
SDL_MOUSEMOTION:
  begin
  if (event.button.y > boardy + 2) and (event.button.y < boardy + 400 - 2) and (event.button.x > boardx + 2) and (event.button.x < boardx + 400 - 2) then
  begin
    Fx := (event.button.x - boardx) * 2 div 53;
    Fy := (event.button.y - boardy) * 2 div 53;
    if (Fx <> tempx) or (Fy <> tempy) then
    begin
      tempx := Fx;
      tempy := Fy;
      DrawSquare(tempx, tempy);
      DrawBoard;

      event.key.keysym.sym := 0;
      event.button.button := 0;
    end;
  end;

上面是先用的DrawSquare,再用DrawBoard。我开始的时候写的是先用DarwBoard再用DrawSquare,结果边框总是显示的是上一次画的位置,而调整顺序后就好了,不知道为什么?

其中DrawBoard和DrawSquare是自己定义的procedure:

procedure DrawSquare(x, y: integer);
var
  i: integer;
begin
  for i := 0 to 27 do
  begin
    putpixel(screen, x * 53 div 2 + boardx + i, y * 53 div 2 + boardy, colcolor($64));
    putpixel(screen, x * 53 div 2 + boardx + i, y * 53 div 2 + boardy + 28, colcolor($64));
    putpixel(screen, x * 53 div 2 + boardx, y * 53 div 2 + boardy + i, colcolor($64));
    putpixel(screen, x * 53 div 2 + boardx + 28, y * 53 div 2 + boardy + i, colcolor($64));
  end;
end;

procedure DrawBoard;
var
  ix, iy: integer;
begin
  SDL_UpdateRect(screen, boardx, boardy, boardx + 400, boardy + 400);
  display_img('resource\board.png', boardx, boardy);
  for ix := 0 to maxX do
  begin
    for iy := 0 to maxY do
    begin
      if chess[ix][iy] > 0 then
        DrawChess(ix, iy, chess[ix][iy] - 1);
    end;
  end;
end;

DrawBoard中的DrawChess也是自己定义的:

procedure DrawChess(x, y, mode: integer);
var
  chx, chy: integer;
  str: string;
begin
  chx := x * 53 div 2 + boardx;
  chy := y * 53 div 2 + boardy;
  str := 'resource\chess' + inttostr(mode) + '.png';
  if fileexists(str) then
    display_img(@str[1], chx, chy);
  chess[x][y] := mode + 1;
end;

在DrawBoard中那句SDL_UpdateRect,其中有一个参数是boardx + 400,如果改成boardx + 401棋盘就不能显示出来了,也不知道为什么?(400是是棋盘图片的宽度)

补充:
文件开头新定义了一些  
  chess: array of array of integer;
  Fx, Fy, boardx, boardy, maxX, maxY: integer;

[发帖际遇]: 真正的强强遭太岳四侠打劫,落荒而逃中丢失银两7.


[ 本帖最后由 真正的强强 于 2009-5-14 19:52 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-5-14 21:04 | 显示全部楼层
SDL_UpdateRect(screen, boardx, boardy, boardx + 400, boardy + 400);
应该放在所有绘图完成之后,你放在绘图之前当然会出问题
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-12-23 13:55

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表