1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Robloxで簡易電卓をつくってみた

Last updated at Posted at 2022-11-23

はじめに

robloxでゲームを作るための練習として、電卓を作ってみました。
ボタンを押して、なんか処理をしてくれることがしたかったんですね。
calculator-with-only-plus

構成

image.png

image.png

  • 数字ボタンButtonPart1~9
  • クリアボタン ButtonPartClear
  • 足すボタン ButtonPartPlus
  • イコールボタン ButtonPartEqual

コード

ButtonPart1~9
local ButtonPart =  script.Parent
local clickdetector = ButtonPart.ClickDetector
local displayPart = workspace.DisplayPart
local colorMemory = ButtonPart.BrickColor
local MY_NUMBER = tonumber(ButtonPart.SurfaceGui.TextLabel.Text)

--先に宣言しておかないといけない
local function countMouseClick(player)
	print(MY_NUMBER)
	ButtonPart.BrickColor = BrickColor.new(0.7,0.9, 0.9)
	displayPart.setValueFunction:Invoke(MY_NUMBER)  --他の関数に記載されている関数を呼び出す
	wait(0.2)
	ButtonPart.BrickColor = colorMemory
end

wait(1)
--初期化中はanswerValueを叩かれると困る

clickdetector.MouseClick:Connect(countMouseClick)


while true do
	wait(1)
end
ButtonPartClear
--電卓のクリア

local ButtonPart =  script.Parent
local clickdetector = ButtonPart.ClickDetector
local displayPart = workspace.DisplayPart
local colorMemory = ButtonPart.BrickColor

--先に宣言しておかないといけない
local function countMouseClick(player)
	print("+")
	ButtonPart.BrickColor = BrickColor.new(0.7,0.9, 0.9)
	displayPart.clear:Invoke()
	wait(0.2)
	ButtonPart.BrickColor = colorMemory
end

wait(1)
--初期化中はanswerValueを叩かれると困る

clickdetector.MouseClick:Connect(countMouseClick)


while true do
	wait(1)
end
ButtonPartEqual
--電卓のイコール

local ButtonPart =  script.Parent
local clickdetector = ButtonPart.ClickDetector
local displayPart = workspace.DisplayPart
local colorMemory = ButtonPart.BrickColor

--先に宣言しておかないといけない
local function countMouseClick(player)
	print("=")
	ButtonPart.BrickColor = BrickColor.new(0.7,0.9, 0.9)
	displayPart.calculate:Invoke()
	wait(0.2)
	ButtonPart.BrickColor = colorMemory
end

wait(1)
--初期化中はanswerValueを叩かれると困る

clickdetector.MouseClick:Connect(countMouseClick)


while true do
	wait(1)
end
ButtonPlus
--電卓のプラス

local ButtonPart =  script.Parent
local clickdetector = ButtonPart.ClickDetector
local displayPart = workspace.DisplayPart
local colorMemory = ButtonPart.BrickColor
local MY_NUMBER = 1 --it means plus

--先に宣言しておかないといけない
local function countMouseClick(player)
	print("+")
	ButtonPart.BrickColor = BrickColor.new(0.7,0.9, 0.9)
	displayPart.setOperator:Invoke(MY_NUMBER)
	wait(0.2)
	ButtonPart.BrickColor = colorMemory
end

wait(1)
--初期化中はanswerValueを叩かれると困る

clickdetector.MouseClick:Connect(countMouseClick)


while true do
	wait(1)
end
DisplayPart

local displayPart = script.Parent
local answerValue = Instance.new("IntValue")
answerValue.Name = "answerValue"
answerValue.Value = 0
answerValue.Parent = displayPart



while true do
	displayPart.SurfaceGui.TextLabel.Text = displayPart.answerValue.Value
	wait(0.2)
end
calculate
local bindableFunction = script.Parent
local displayPart = bindableFunction.Parent



wait(1)

local function calclate()
	if displayPart.flagOperator.Value == false then
		if displayPart.operator.Value == 1 then
			displayPart.answerValue.Value = displayPart.valueMemory.Value + displayPart.answerValue.Value
		end
		displayPart.valueMemory.Value = displayPart.answerValue.Value
		displayPart.flagOperator.Value = true
		displayPart.operator = 0
	end
end

bindableFunction.OnInvoke = calclate

clear
local bindableFunction = script.Parent
local displayPart = bindableFunction.Parent



wait(1)

local function clear()
	displayPart.valueMemory.Value = 0
	displayPart.answerValue.Value = 0
	displayPart.flagOperator.Value = false
	displayPart.operator.Value = 0
end

bindableFunction.OnInvoke = clear

setOperator
local bindableFunction = script.Parent
local displayPart = bindableFunction.Parent
displayPart.flagOperator.Value = false


wait(1)

local function setOperator(operator)
	if displayPart.flagOperator.Value == false then
		displayPart.answerValue.Value = displayPart.answerValue.Value + displayPart.valueMemory.Value
	end
	displayPart.operator.Value = operator
	displayPart.flagOperator.Value = true
	displayPart.valueMemory.Value = displayPart.answerValue.Value
end

bindableFunction.OnInvoke = setOperator

setValueFanction
local bindableFunction = script.Parent
local displayPart = bindableFunction.Parent

wait(1)

local function setValue(intValue)
	if displayPart.flagOperator.Value == true then
		displayPart.answerValue.Value = intValue
		displayPart.flagOperator.Value = false
	else
		displayPart.answerValue.Value = displayPart.answerValue.Value * 10 + intValue
	end
end

bindableFunction.OnInvoke = setValue

つかったもの

  • 非同期処理もどき
  • クリックのイベント処理
  • オブジェクト指向もどき
  • 変数値の表示
    robloxでは、各オブジェクト(Part)ごとにプログラムが(非同期的に)走っているのがゲーム作りしやすいと感じました。他のプログラムの値を参照できる(変更できる)のも出来ました。なので、出来ることが増えますね。

おわりに

必要な要素は揃ったので、次は作りたいゲームをつくろうと思います。
エラーが含まれてもなんとか動いてくれるのは、プログラムしやすいです。デバッグも出来るので、エラー箇所も推定しやすいです。あと、ローカル環境で動いてたら、本番環境でも同じように動いてくれるのはつよつよです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?