irpg Community
ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ - Printable Version

+- irpg Community (https://irpg.in.th)
+-- Forum: irpg Fabella RPG Maker Academia (https://irpg.in.th/forum-4.html)
+--- Forum: RPG Maker Engine School (https://irpg.in.th/forum-7.html)
+--- Thread: ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ (/thread-1801.html)



ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ - freemancer - 04-21-2014

RM XP (เปลี่ยนโปรแกรมเล่นแล้วจากRMVX )
อยากให้เหตุการ์ณคือทหารฝ่ายเรา (ไม่ใช่ตัวฮีโร่ ฮีโร่ทำหน้าที่ชี้นิ้วสั่ง)
เดินไปเจอทหารฝ่ายศัตรู หรือทหารฝ่ายศัตรูเดินมาชนทหารฝ่ายเรา แล้วเกิดทริกเหตุการณ์โจมตีใส่กัน ต้องทำยังไงหรือครับ ตอนนี้พอมันชนกันก็ไม่รู้จะให้มันเช็คการชนกันยังไง น่ะครับ

เอาแบบคิดค่าบาดเจ็บให้ตายไปข้าง วัดพลังโจมตีกับเลือด น่ะครับ
ขอบคุณคับDerp


RE: ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ - Jirayu - 04-21-2014

จำได้คร่าวๆ ว่ามันเช็คตำแหน่งของเหตุการณ์ได้ครับ event ตัวแปร มันจะมีให้เก็บค่าพิกัดของเหตุการณ์ แล้วค่อยเอามาคำนวน


RE: ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ - Mysticphoenix - 04-21-2014

ยากหน่อยนะ


RE: ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ - jojo741963 - 04-21-2014

แนะนำสคริปต์ตัวหนึ่งก่อนครับ
http://littledrago.blogspot.com/2012/01/rgss23-advanced-game-variables.html
เป็นสคริปต์ที่กำหนดตัวแปรได้อิสระ เหมาะจะไว้กำหนดเลือดครับ

ถ้าใช้คำสั่งเหตุการณ์อาจจะยากครับ แนะนำว่าอาจจะต้องสร้าง alias update ใน Game_Map
เลยน่าจะสะดวกกว่าครับ

Code:
class Game_Map
alias war_update update
  def update
    war_update
    -- คำสั่ง --

  end
end

ลองแกะโค้ดมาจาก Enemy Detection System ดูครับ พอจะบอกได้คร่าวๆ

Code:
for soldier in @events.values #สมมติให้ soldierคืออีเว้นจากอีเว้นทั้งหมด
if !soldier.name.include?("soldier") #อีเว้นไหนไม่มีชื่อว่า soldier
  next #ให้ข้ามไป อย่าไปสนใจมัน
else #จากนั้นก็มาพิจรณาอีเว้นต่อ
  if soldier.character_name != "" #ถ้าอีเว้นนั้น รูปตัวละครจะต้องไม่ว่างเปล่า
   #พักมาเช็คฝ่ายศัตรูกันบ้าง
   for enemy in @events.values #สมมุติให้ enemy คืออีเว้นจากอีเว้นทั้งหมด
    if enemy.name.include?("enemy") && enemy.character_name != ""#อีเว้นไหนบ้างที่ชื่อว่า enemy และรูปตัวละครจะต้องไม่ว่างเปล่า
     #หลังจากได้ ทหารฝ่ายเราและศัตรูมาแล้วก็มาคำนวณกัน
     range = (soldier.x - enemy.x).abs + (soldier.y - enemy.y).abs #บรรทัดนี้ผมยังไม่เข้าใจครับ รู้แค่ว่าหาระยะ
     if range <= 1 #ถ้าระยะน้อยกว่าหรือเท่ากับหนึ่ง แปลว่าอีเว้นทั้งสองอยู่ในระยะประชิดแล้วครับ
     #เพื่อความสมจริง อาจจะต้องเช็คการหันหน้าเพิ่ม ว่าหันหน้าเข้าไปหาศัตรูรึเปล่า
     #เช็คฝ่ายทหารโจมตี
     if (soldier.direction == 2 && enemy.y == soldier.y + 1 ) or
      (soldier.direction == 4 && enemy.x == soldier.x - 1 ) or
      (soldier.direction == 6 && enemy.x == soldier.x + 1 ) or
      (soldier.direction == 8 && enemy.y == soldier.y - 1 )
      #บรรทัดนี้เป็นการ สร้างความเสียหายให้ศัตรูครับ จากสคริปต์ข้างต้น
      $game_variables[[@map_id,enemy.id,"A"]] += 1
      enemy.animation_id = 7 #สร้างภาพเคลื่อนไหวใส่เหตุการณ์
     end
     #เช็คฝ่ายศัตรูโจมตี
     if (enemy.direction == 2 && soldier.y == enemy.y + 1 ) or
      (enemy.direction == 4 && soldier.x == enemy.x - 1 ) or
      (enemy.direction == 6 && soldier.x == enemy.x + 1 ) or
      (enemy.direction == 8 && soldier.y == enemy.y - 1 )
      #บรรทัดนี้เป็นการ สร้างความเสียหายให้ทหารเราครับ จากสคริปต์ข้างต้น
      $game_variables[[@map_id,soldier.id,"A"]] += 1
      soldier.animation_id = 7 #สร้างภาพเคลื่อนไหวใส่เหตุการณ์
     end    
    end
   else
    next #อีเว้นไหนที่ไม่ใช่ศัตรูก็ข้ามไป
   end
  end
end
end
end
มี end เกินรึเปล่าไม่ค่อยแน่ใจแล้วแฮะ ตาลาย
ยังไม่แน่ใจด้วยว่ามีบัครึเปล่า แต่ระบบเกมปืนฉีดน้ำของผมก็ระบบประมาณนี้ครับ

เมื่อเราจะเช็คเลือดของศัตรู เมื่อกี้คำสั่งเพิ่มความเสียหายให้ศัตรูถูกกำหนดด้วย
$game_variables[[ไอดีแมพ,อีเว้นไอดี,"A"]]
เช็คโดยสร้างเหตุการณ์ทหารหรือศัตรูตั้งเป็นพร้อมเนืิ้อเรื่อง ตรวจเช็คเงื่อนไขด้วยสคริปตว่า
$game_variables[[@map_id,@event_id,"A"]] >= จำนวนเลือดของอีเว้นนั้น
เพราะเราได้บวกตัวแปรเหล่านี้ไปแล้ว เมื่อเข้าประชิดกัน ถ้าความเสียหายถึงที่กำหนด อีเว้นนั้นก็ตายครับ อาจจะลบเหตุการณ์ทิ้ง หรือเปลี่ยนภาพตัวละครเป็นภาพตอนตาย แต่ต้องแก้สคริปต์ที่เช็คด้วยนะครับ เพราะใส่เป็น character_name != "" อยู่ เปลี่ยนให้เหมือนกันด้วย หรือให่สวิตช์เฉพาะเปิดแล้วสร้างเหตุการณ์ของตอนที่ตายก็ได้ครับ

ปล.เหนื่อย+สคริปต์ดูแปลกๆ บ้างเพราะก็อบEnemy Detection System มา แล้วเปลี่ยนชื่อ
ผู้รู้ท่านอื่นถ้ามาช่วยแปลง ตรวจบัค+ลงวิธีแก้ จะดีมากครับ /chan


RE: ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ - hengmana - 04-22-2014

ถ้าเป็น NPC หรือเหตุการณ์ ตัวเช็คตำแหน่งนั้นก็
$game_map.events[@event_id].x
$game_map.events[@event_id].y


RE: ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ - freemancer - 04-22-2014

ขอบคุณมากครับ ของผมจะลองไปปรับใช้ดูนะครับ

ถ้าใช้อีเวนท์ก้ต้องเช็กตัวแปรพิกัดx y สองตัวแปรต่อ1event. แล้วสร้างอีเวนท์เปล่าๆ สำหรับเช็คระยะมาวาวหน้าอีเวนตัวนี้
อีเวนทศัตรูก้มีเช็คเก็บค่าตัวแปรxyเหมือนกัน กับมีสร้างอีเวนท์เช็คระยะหน้าอีเวนทตัวศัตรู แล้วให้้ทั้งสองตัวททำเหมือนกันคือ
ถ้าพิกัดxyของตัวเอง เท่ากับxyของอีเวนนท์เช็คระยะฝั่งตรงข้ามเมื่อไหร่ให้เกิดอนิเมชั่นถูกฟันและบาดเจ็บ ตามค่าดาเมจของฝั่งตรงข้ามที่ตั้งไว้ในตัวแปรใดๆแล้วแต่กำหนด ส่วนท่่าฟันก็ให้เปลี่นรรูปคนฟันแล้วแต่กำหนด
สรุปทหาร1ตัวมี
ตัวแปรพิกัดx
ตัวแปรพิกัดy
อีเวนท์ตตรวจจับเช็คระยะ
มีตัวแปรพิกัดx ให้คอยติดตามพิกกัดxของอีเวนทตัวบนโดระบุตำแหน่วบวกค่าตัวแปรหรือลบตัวแปรเต
มีตัวแปรพิกัดy
ตัวแปรดาเมจ กับตัวแปรเลือดและอื่นๆทีี่ใช้ต่อสู้
คร่าวๆประมาณนี้
ขอบคุณครับ


RE: ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ - Mysticphoenix - 04-22-2014

ลองใช้สคริปที่ผมเอามาโพสเมื่อวานสิ
http://irpg.in.th/thread-1798.html

แล้วใส่comment ว่า
-----------------------------
Code:
Custom Trigger
(($game_map.events[-1].direction == 2 && $game_map.events[6].y == $game_map.events[-1].y + 1 ) ||
      ($game_map.events[-1].direction == 4 && $game_map.events[6].x == $game_map.events[-1].x - 1 ) ||
      ($game_map.events[-1].direction == 6 && $game_map.events[6].x == $game_map.events[-1].x + 1 ) ||
      ($game_map.events[-1].direction == 8 && $game_map.events[6].y == $game_map.events[-1].y - 1 )) ||
(($game_map.events[-1].direction == 2 && $game_map.events[7].y == $game_map.events[-1].y + 1 ) ||
      ($game_map.events[-1].direction == 4 && $game_map.events[7].x == $game_map.events[-1].x - 1 ) ||
      ($game_map.events[-1].direction == 6 && $game_map.events[7].x == $game_map.events[-1].x + 1 ) ||
      ($game_map.events[-1].direction == 8 && $game_map.events[7].y == $game_map.events[-1].y - 1 ))||
(($game_map.events[-1].direction == 2 && $game_map.events[8].y == $game_map.events[-1].y + 1 ) ||
      ($game_map.events[-1].direction == 4 && $game_map.events[8].x == $game_map.events[-1].x - 1 ) ||
      ($game_map.events[-1].direction == 6 && $game_map.events[8].x == $game_map.events[-1].x + 1 ) ||
      ($game_map.events[-1].direction == 8 && $game_map.events[8].y == $game_map.events[-1].y - 1 ))
-----------------------------

คำสั่งดังกล่าวจะทำให้eventทำงานเมื่อ event นี้ อยุ่ติดกับ event เบอร์ 6 7 8

เนื่องจากโค้ดยาวมาก สามารถใช้กล่อง comment หลายอันต่อกันได้

ผมยังไม่ได้ลองนะคับ เพราะตอนนี้อยู่ที่ทำงาน เอิ้กๆ ผิดถูกขออภัย

ปล. $game_map.events[-1] คือตัวมันเอง

ปล. อันที่จริงไม่ต้องใช้สคริปก็ได้ แค่ใช้คำสั่งเงื่อนไขแบบscript แล้วก็อปวางโค้ดข้างบนไป (ให้มันอยู่บรรทัดเดียวกันนะ)

ปล. เนื่องจากมันจะเช็คตลอด ทำให้อาจเกิดการ trigger รัวๆ ดังนั้นอย่าลืมทำกลไก delay ไว้ด้วย จะได้ไม่ trigger รัวๆ

ปล. แบบคุณ jojo ก็ clean ดีนะ ผมสนับสนุนแบบคุณ jojo ถ้าทำได้ก็ทำเลย


RE: ทำให้เหตุการ์ณ ตีกันเองทำยังไงครับ - freemancer - 04-22-2014

ขอบคุณครับ ปัญหาคือผมไม่เป็นงานสคริปน่ะครับ แต่ถนัดeventมากกว่า แต่จะเอาแนวคิดไปปรับใช้กับพยายามยุบให้สั้นเท่าที่ทำได้น่ะครับ
แต่ถ้าก็อปไปวางผมก้รุ้สึกไม่เข้าใจระบบตัวเอง อาจจะทำงานขั้นตอนต่อไปยากน่ะครับ แต่ขอบคุณนะครับ