1

私の問題は単純です。以前は、自分の線 (写真を参照) が他の線 (または他の線の跡) にぶつかるかどうかを確認するためにこれを行っていました。しかし、私が今これを行う方法は、多くの if ステートメントを実行することです。これは良くありません。だからここに私が使用したコードがあります:

function Bumper:draw()
 for id,posx1 in pairs(tableposx1) do
    posy1 = tableposy1[id]
    posx2 = tableposx2[id]
    posy2 = tableposy2[id]
    posx3 = tableposx3[id]
    posy3 = tableposy3[id]
    posx4 = tableposx4[id]
    posy4 = tableposy4[id]
        if (posx1 ~= nil) and (posy1 ~= nil) and
        ((math.abs(xposplayer1 - posx1) < 5) and (math.abs(yposplayer1 - posy1) < 5))
        and (id < (count - 5) and killp1 == "false") then
            killp1 = "true"
            tint(255, 0, 0, 162)
            sprite("Dropbox:kill",xposplayer1,yposplayer1)
            noTint()
        end
        if (posx2 ~= nil) and (posy2 ~= nil) and
        ((math.abs(xposplayer1 - posx2) < 5) and (math.abs(yposplayer1 - posy2) < 5))
        and killp1 == "false" then
            killp1 = "true"
            tint(255, 0, 0, 162)
            sprite("Dropbox:kill",xposplayer1,yposplayer1)
            noTint()
        end
        if (posx3 ~= nil) and (posy3 ~= nil) and
        ((math.abs(xposplayer1 - posx3) < 5) and (math.abs(yposplayer1 - posy3) < 5))
        and killp1 == "false" then
            killp1 = "true"
            tint(255, 0, 0, 162)
            sprite("Dropbox:kill",xposplayer1,yposplayer1)
            noTint()
        end
        if (posx4 ~= nil) and (posy4 ~= nil) and
        ((math.abs(xposplayer1 - posx4) < 5) and (math.abs(yposplayer1 - posy4) < 5))
        and killp1 == "false" then
            killp1 = "true"
            tint(255, 0, 0, 162)
            sprite("Dropbox:kill",xposplayer1,yposplayer1)
            noTint()
        end
        if (posx1 ~= nil) and (posy1 ~= nil) and
        ((math.abs(xposplayer2 - posx1) < 5) and (math.abs(yposplayer2 - posy1) < 5))
        and killp2 == "false" then
            killp2 = "true"
            tint(0, 29, 255, 162)
            sprite("Dropbox:kill",xposplayer2,yposplayer2)
            noTint()
        end
        if (posx2 ~= nil) and (posy2 ~= nil) and
        ((math.abs(xposplayer2 - posx2) < 5) and (math.abs(yposplayer2 - posy2) < 5))
        and (id < (count - 5) and killp2 == "false")then
            killp2 = "true"
            tint(0, 29, 255, 162)
            sprite("Dropbox:kill",xposplayer2,yposplayer2)
            noTint()
        end
        if (posx3 ~= nil) and (posy3 ~= nil) and
        ((math.abs(xposplayer2 - posx3) < 5) and (math.abs(yposplayer2 - posy3) < 5))
        and killp2 == "false" then
            killp2 = "true"
            tint(0, 29, 255, 162)
            sprite("Dropbox:kill",xposplayer2,yposplayer2)
            noTint()
        end
        if (posx4 ~= nil) and (posy4 ~= nil) and
        ((math.abs(xposplayer2 - posx4) < 5) and (math.abs(yposplayer2 - posy4) < 5))
        and killp2 == "false" then
            killp2 = "true"
            tint(0, 29, 255, 162)
            sprite("Dropbox:kill",xposplayer2,yposplayer2)
            noTint()
        end
        if (posx1 ~= nil) and (posy1 ~= nil) and
        ((math.abs(xposplayer3 - posx1) < 5) and (math.abs(yposplayer3 - posy1) < 5))
        and killp3 == "false" then
            killp3 = "true"
            tint(1, 255, 0, 162)
            sprite("Dropbox:kill",xposplayer3,yposplayer3)
            noTint()
        end
        if (posx2 ~= nil) and (posy2 ~= nil) and
        ((math.abs(xposplayer3 - posx2) < 5) and (math.abs(yposplayer3 - posy2) < 5))
        and killp3 == "false" then
            killp3 = "true"
            tint(1, 255, 0, 162)
            sprite("Dropbox:kill",xposplayer3,yposplayer3)
            noTint()
        end
        if (posx3 ~= nil) and (posy3 ~= nil) and
        ((math.abs(xposplayer3 - posx3) < 5) and (math.abs(yposplayer3 - posy3) < 5))
        and (id < (count - 5) and killp3 == "false") then
            killp3 = "true"
            tint(1, 255, 0, 162)
            sprite("Dropbox:kill",xposplayer3,yposplayer3)
            noTint()
        end
        if (posx4 ~= nil) and (posy4 ~= nil) and
        ((math.abs(xposplayer3 - posx4) < 5) and (math.abs(yposplayer3 - posy4) < 5))
        and killp3 == "false" then
            killp3 = "true"
            tint(1, 255, 0, 162)
            sprite("Dropbox:kill",xposplayer3,yposplayer3)
            noTint()
        end
        if (posx1 ~= nil) and (posy1 ~= nil) and
        ((math.abs(xposplayer4 - posx1) < 5) and (math.abs(yposplayer4 - posy1) < 5))
        and killp4 == "false" then
            killp4 = "true"
            tint(255, 0, 229, 162)
            sprite("Dropbox:kill",xposplayer4,yposplayer4)
            noTint()
        end
        if (posx2 ~= nil) and (posy2 ~= nil) and
        ((math.abs(xposplayer4 - posx2) < 5) and (math.abs(yposplayer4 - posy2) < 5))
        and killp4 == "false" then
            killp4 = "true"
            tint(255, 0, 229, 162)
            sprite("Dropbox:kill",xposplayer4,yposplayer4)
            noTint()
        end
        if (posx3 ~= nil) and (posy3 ~= nil) and
        ((math.abs(xposplayer4 - posx3) < 5) and (math.abs(yposplayer4 - posy3) < 5))
        and killp4 == "false" then
            killp4 = "true"
            tint(255, 0, 229, 162)
            sprite("Dropbox:kill",xposplayer4,yposplayer4)
            noTint()
        end
        if (posx4 ~= nil) and (posy4 ~= nil) and
        ((math.abs(xposplayer4 - posx4) < 5) and (math.abs(yposplayer4 - posy4) < 5))
        and id < (count - 5) and killp4 == "false" then
            killp4 = "true"
            tint(255, 0, 229, 162)
            sprite("Dropbox:kill",xposplayer4,yposplayer4)
            noTint()
        end
end


end

これが私の初期化です:

    -- Main
a = 1
gameover = 0
tx = 0
paused = 1
count = 0
stagecount = 0
player1count = 0
player2count = 0
player3count = 0
player4count = 0
-- Random hole times
thistime1 = 0
thistime2 = 0
thistime3 = 0
thistime4 = 0
-- Dead players
killp1 = "false"
killp2 = "false"
killp3 = "false"
killp4 = "false"
kills = 0
-- Touch control
touches = {}
-- Player direction
pi = math.pi
o5pi = 50 * pi
mo5pi = - (50 * pi)
minpi = - (100*pi)
    -- Random start direction
    r1t = math.random(0,o5pi)
    r2t = math.random(mo5pi,0)
    r3t = math.random(minpi,mo5pi)
    r4t = math.random(o5pi,100*pi)
r1 = r1t / 100
r2 = r2t / 100
r3 = r3t / 100
r4 = r4t / 100
deltar1 = pi / 55
deltar2 = pi / 55
deltar3 = pi / 55
deltar4 = pi / 55
-- Player speed
speed1 = 2.5
speed2 = 2.5
speed3 = 2.5
speed4 = 2.5
-- Player random start position
xposplayer1 = math.random(123,300)
yposplayer1 = math.random(123,300)
xposplayer2 = math.random(123,300)
yposplayer2 = math.random(468,645)
xposplayer3 = math.random(724,901)
yposplayer3 = math.random(468,645)
xposplayer4 = math.random(724,901)
yposplayer4 = math.random(123,300)
-- Player coordinate tables
tableposx1 = {}
tableposy1 = {}
tableposx2 = {}
tableposy2 = {}
tableposx3 = {}
tableposy3 = {}
tableposx4 = {}
tableposy4 = {}

今、私は次のことを試みましたが、変数変数名の使用方法がわからないため失敗しました:

for id,posx[a] in pairs(tableposx[a]) do
    posy[a] = tableposy[a][id]
        if ((posx[a] ~= nil) and (posy[a] ~= nil))
        and (math.abs(xposplayer[a] - posx[a]) < 5)
        and (math.abs(yposplayer[a] - posy[a]) < 5)
        and (id < (count - 5)) 
        and (killp[a] == "false") 
        then
            killp[a] = "true"
            tintp[a]
            sprite("Dropbox:kill",xposplayer[a],yposplayer[a])
            noTint()
        end
   end
a = a + 1
if a = 4 then
    a = 1
end

-- 編集: 4 人のプレイヤーで 4 回使用します。

function Player:draw1()
    fill(255, 0, 11, 255)
    xposplayer1 = xposplayer1 + speed1 * math.cos(r1)
    yposplayer1 = yposplayer1 + speed1 * math.sin(r1)
    if player1count == 0 then 
        thistime1 = math.random(200,500)
    end
    player1count = player1count + 1
if player1count < thistime1 then
    table.insert(tableposx1,count,xposplayer1)
    table.insert(tableposy1,count,yposplayer1)
    tint(255, 0, 0, 162)
    ellipse(xposplayer1,yposplayer1,10,10)
    noTint()
elseif player1count > thistime1 then
    tint(255, 0, 0, 162)
    ellipse(xposplayer1,yposplayer1,5,5)
    noTint()
    if player1count > thistime1 + 20 then
        player1count = 0
    end
end

終わり

- 編集

これを正しく行うにはどうすればよいですか?前もって感謝します!

画像:ここに画像の説明を入力

4

3 に答える 3

2

おそらく、あなたが言ったような変数変数名は本当に必要ないでしょうが、それはできます...

すべてのグローバルは という名前_Gのテーブルからアクセスでき、次のようにしてグローバル変数にアクセスできます。

_G['killp1']
_G['killp2']
-- etc

その後、通常どおり文字列操作を使用できます。

local i = 1
_G['killp' .. tostring(i)] -- same as _G['killp1']
i = i + 1
_G['killp' .. tostring(i)] -- same as _G['killp2']

しかし、これは非常に厄介で急速になります。代わりにおそらくやりたいことは、 objects の使用を開始することです。オブジェクトは次のようになります。

Linething = { x = 0, y = 0, dead = false, speed = 2.5 }

function Linething:new(o)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  return o
end

function Linething:checkCollision(other)
  if self.x - other.x < 5 and self.y - other.y < 5 then
    self.dead = true
    -- other stuff
  end
end

function Linething:update(delta_t)
   -- update the game logic
   self.x = self.x + self.speed * cos(self.angle) * delta_t
   self.y = self.y + self.speed * sin(self.angle) * delta_t
end

function Linething:draw()
  -- do line drawing here
  tint(255, 0, 0, 162)
  ellipse(self.x, self.y, 10, 10)
  noTint()
  -- etc
end

-- in main:
linething1 = Linething:new()
linething2 = Linething:new()
linething1.checkCollision(linething2)

編集: 通常、ゲーム ロジックをレンダリングから分離する必要があります。ほとんどのゲームには、次のようなループがあります。

function main_loop()
  while true do
    delta_t = get_change_in_time()
    update_all(delta_t)
    draw_all()
  end
end

-- where update_all is something like this:
function update_all(delta_t)
  player1:update(delta_t)
  player2:update(delta_t)
  -- things in a table:
  for _, x in pairs(table_of_x) do
    x:update(delta_t)
  end
end

-- and draw all is basically the same
function draw_all()
  player1:draw()
  player2:draw()
  -- things in a table:
  for _, x in pairs(table_of_x) do
    x:draw()
  end
end

あなたのPlayerオブジェクトにはオブジェクトがある Linethingようです。Linethingそのため、オブジェクトにオブジェクトを追加して、 callPlayerに変更したい場合があります。次に、それぞれがオブジェクトを持つ 4 つのオブジェクトを持つことができます。それは理にかなっていますか?Player:draw()players_linething:draw()PlayerLinething

于 2013-01-14T16:07:09.867 に答える
1

問題は、配列 (player[1]、player[2] など) ではなく添字付きの変数 (player1、player2 など) を使用しているため、ループ内で変数を反復処理できないことです。

また、関連するアイテムをグループ化する必要があります。プレイヤー 1 が一連のグローバル変数で表されるのではなく、次のようにします。

player1count = 0
speed1 = 2.5

これらのものは、表に整理する必要があります。

player1.count = 0
speed1.speed = 2.5

そして、前に述べたように、添え字によって変化する変数がたくさんある場合はいつでも、配列を使用する必要があります (または、より一般的には、ある種の繰り返し可能なリスト型で、Lua ではたまたまテーブル/配列になります):

players = {}

-- initialize players
for i=1,NUM_PLAYERS do
    players[i] = {
        count = 0,
        speed = 2.5
    }
end

これを一般的にプログラムに適用すると、巨大なifステートメントは自然に消え、ネストされた比較的小さな for ループに置き換えられます。

于 2013-01-14T19:19:09.867 に答える
0

私はすべてを読んだわけではありませんが、最後のスニペットでは:

  • for id,posx[a]ループによって割り当てられた変数forはローカルであるため、実行できません。posx[a]これを修正するには、 のインスタンスをなどのローカル変数名に置き換えますposx_a

  • ここにタイプミスがあります: if a = 4 then(つまり==)。

  • この行は何の意味もありません: tintp[a].

于 2013-01-14T16:07:58.477 に答える