昨日営業再開しました。
ぼっちはコロナにも負けない。
入店前に手をアルコール消毒し、お肉を取りに行く時は、お店で用意されたビニール手袋とマスクをつけてください、ということでした。
久しぶりのお店焼肉・・・
堪能して参りました。
花火、きれいでしたねー
さて、いよいよRASの実装が近づいてきましたよ~
ノスタルジックレインフォール
テレビアニメ「恋は雨上がりのように」のOPテーマです。
予想レベル24
ほぼほぼバンドリ3rdシーズンの内容ですね。
EXPOSE ‘Burn Out!!!’がイベント開始と同時に実装されます。
予想レベル26
同時にカバー曲「ヒトリノ夜」が実装されます。
アニメ「GTO」のOPテーマでした。
カバーコレクションに収録されている曲ですね。
予想レベル25
イベント後編にはバンドリ3rdシーズンの13話で披露されたBeautiful Birthdayが実装されます。
まとめ。
イベントは6月10日開始です。
次のイベントですね。
星配布と無料ガチャは嬉しい。
イベントで勝ち抜くにはメンツが必要。
ガチ課金勢には敵わないけどな。
前回までの状況はこちら。
PythonコードをgitHubにアップしました。
https://github.com/takishita2nd/GLCD
サンプルソースにフォントのビットパターンデータがありましたので、これを置換処理を使ってPython用に書き換えました。
https://github.com/takishita2nd/GLCD/blob/master/Font.py
これを使用して、ディスプレイにアスキー文字を表示させます。
[ 0x7e, 0x11, 0x11, 0x11, 0x7e ], # A 0x41
1文字8×5のサイズになっているようです。
お試しで表示させてみました。
chara = [0x7e, 0x11, 0x11, 0x11, 0x7e]
def __main():
PinsInit(20, 7, 8, 9, 18, 19, 10, 11, 12, 13, 14, 15, 16, 17)
GLCDInit()
GLCDDisplayClear()
addr = 0
SelectIC(1)
SetPage(0)
for c in chara:
SetAddress(addr)
WriteData(c)
addr += 1
try:
while True:
time.sleep(1.0)
except KeyboardInterrupt:
GPIO.cleanup()
このデータを表示するサンプルコードをPython用に書き換えました。
def GLCDPutc(Xp, Yp, c):
code = ord(c)
#ページ内のラインを選択
L = Yp % 8
#8×5のキャラクター文字を描画する
for i in range(5):
SetLocation(Xp + i, Yp)
f = Font.Array[code - 0x20][i] << L
WriteData(f)
if (L != 0) & (SetPg < 7):
SetPage(SetPg + 1)
SetAddress(SetCol)
f = Font.Array[code - 0x20][i] >> (8 - L)
WriteData(f)
def SetLocation(Xp, Yp):
global SetPg
global SetCol
cs = 0
#チップの選択とカラムのアドレスの処理を行う
if Xp < 64:
#左側(IC1)を選択
cs = 1
SetCol = Xp
else:
#右側(IC2)を選択
cs = 2
SetCol = Xp - 64
#ページとラインの選択
SetPg = Yp // 8
#LCDに描画するアドレスの位置を設定
SelectIC(cs)
SetPage(SetPg)
SetAddress(SetCol)
好きな場所に文字を書くことができます。
ページ跨ぎとか、チップ跨ぎにも対応しているようです。
def __main():
PinsInit(20, 7, 8, 9, 18, 19, 10, 11, 12, 13, 14, 15, 16, 17)
GLCDInit()
GLCDDisplayClear()
GLCDPutc(20, 5, "B")
try:
while True:
time.sleep(1.0)
except KeyboardInterrupt:
GPIO.cleanup()
前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/diet-mng
データ削除処理を作成します。
とはいっても、もう追加、編集処理が出来上がっているので、そんなに難しくありませんでした。
ぱぱっとやってしまいます。
public function delete($id, $user)
{
$model = $this->getItemById($id);
$this->detachToUser($model, $user);
$model->delete();
}
/**
* データを1件削除する
*/
public function delete(Request $request)
{
$this->weightManagement->delete($request->contents["id"], Auth::user());
return response()->json();
}
Route::post('api/weight/delete', 'Weight\ApiController@delete');
<template>
<div>
<div id="overlay" v-show="show">
<div id="content">
<p v-if="error_flg == true" class="error">
<ui>
<li v-for="error in errors">{{ error }}</li>
</ui>
</p>
<table class="edit">
<tbody>
<tr>
<td>日時</td>
<td>{{contents.date}}</td>
</tr>
<tr>
<td>体重</td>
<td>{{contents.weight}}</td>
</tr>
<tr>
<td>体脂肪</td>
<td>{{contents.fat_rate}}</td>
</tr>
<tr>
<td>BMI</td>
<td>{{contents.bmi}}</td>
</tr>
</tbody>
</table>
<p id="command">
<button @click="clickDelete">OK</button>
<button @click="closeModal">キャンセル</button>
</p>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['show'],
data() {
return {
errors: [],
error_flg: [],
param: {},
contents: {
date: "",
weight: "",
fat_rate: "",
bmi: "",
},
};
},
created: function() {
},
methods: {
dataSet: function(data) {
this.contents = data;
},
clickDelete: function() {
var self = this;
this.param.contents = this.contents;
axios.post('api/weight/delete', this.param).then(function(response){
self.closeModal();
self.$emit('update');
}).catch(function(error){
self.error_flg = true;
self.errors = error.response.data.errors;
});
},
closeModal: function() {
this.$parent.showDeleteDialogContent = false;
},
}
}
</script>
<weight-delete-dialog-component ref="deleteDialog" :show="showDeleteDialogContent" @update="invokeUpdateList"></weight-delete-dialog-component>
onClickDelete: function(id) {
var editData = {};
this.datalists.forEach(element => {
if(element.id == id){
editData.id = id;
editData.date = element.date;
editData.weight = element.weight;
editData.fat_rate = element.fat_rate;
editData.bmi = element.bmi;
return true;
}
});
this.$refs.deleteDialog.dataSet(editData);
this.showDeleteDialogContent = true;
},
いいかんじです。
前回までの状況はこちら。
最新ソースはこちら。(gitHub)
https://github.com/takishita2nd/Picross
いままではデータ入力値がパレットの陰に隠れて見えづらい、という問題をうすうすと感じていましたが、これを修正したいと思います。
具体的には、パレットの上に入力値を表示し、ENTERボタンを押下することで入力データを反映させます。
なので、パレットを拡張。
そして、パレット周りの処理をがっつり書き換えました。
class Palette
{
public void OnClick(asd.Vector2DF pos)
{
if (paletteZeroSquareObject.IsClick(pos))
{
if(_valueText.Text != "" && _valueText.Text != "0")
{
if (_valueText.Text.Length < 2)
{
_valueText.Text += "0";
}
}
}
else if (paletteBSSquareObject.IsClick(pos))
{
if(_valueText.Text.Length > 0)
{
_valueText.Text = _valueText.Text.Remove(_valueText.Text.Length - 1);
}
}
else if (paletteCRSquareObject.IsClick(pos))
{
_valueText.Text = "";
}
else if (paletteENSquareObject.IsClick(pos))
{
value = _valueText.Text;
_isClickEnter = true;
}
else
{
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
if (paletteSquareObjects[row, col].IsClick(pos) == true)
{
if(_valueText.Text.Length < 2)
{
if(_valueText.Text == "0")
{
_valueText.Text = paletteSquareObjects[row, col].GetValue();
}
else
{
_valueText.Text += paletteSquareObjects[row, col].GetValue();
}
}
}
}
}
}
}
public bool IsClickEnter()
{
return _isClickEnter;
}
public string GetValue()
{
return value;
}
パレットを使用する側もがっつり書き換えます。
if (palette.IsClick(pos))
{
string value = string.Empty;
palette.OnClick(pos);
if(palette.IsClickEnter())
{
palette.Hide();
if (selectedNumberSquare != null)
{
selectedNumberSquare.SetValue(palette.GetValue());
if (selectedNumberSquare.GetStringValue() != string.Empty)
{
if (selectedRowIndex >= 0)
{
if (Math.Abs(selectedColIndex - 1) > rowNumberSquare[selectedRowIndex].Count)
{
var square = new NumberSquare(selectedRowIndex, selectedColIndex - 1);
asd.Engine.AddObject2D(square.getBackTexture());
asd.Engine.AddObject2D(square.getTextObject());
rowNumberSquare[selectedRowIndex].Add(square);
}
}
else if (selectedColIndex >= 0)
{
if (Math.Abs(selectedRowIndex - 1) > colNumberSquare[selectedColIndex].Count)
{
var square = new NumberSquare(selectedRowIndex - 1, selectedColIndex);
asd.Engine.AddObject2D(square.getBackTexture());
asd.Engine.AddObject2D(square.getTextObject());
colNumberSquare[selectedColIndex].Add(square);
}
}
}
else
{
if (selectedRowIndex >= 0)
{
if (Math.Abs(selectedColIndex - 1) <= rowNumberSquare[selectedRowIndex].Count)
{
asd.Engine.RemoveObject2D(rowNumberSquare[selectedRowIndex][Math.Abs(selectedColIndex + 1)].getBackTexture());
asd.Engine.RemoveObject2D(rowNumberSquare[selectedRowIndex][Math.Abs(selectedColIndex + 1)].getTextObject());
rowNumberSquare[selectedRowIndex].RemoveAt(Math.Abs(selectedColIndex + 1));
for (int col = selectedColIndex + 1; Math.Abs(col) < rowNumberSquare[selectedRowIndex].Count; col--)
{
rowNumberSquare[selectedRowIndex][Math.Abs(col)].SetPosition(selectedRowIndex, col - 1);
}
}
}
else if (selectedColIndex >= 0)
{
if (Math.Abs(selectedRowIndex - 1) <= colNumberSquare[selectedColIndex].Count)
{
asd.Engine.RemoveObject2D(colNumberSquare[selectedColIndex][Math.Abs(selectedRowIndex + 1)].getBackTexture());
asd.Engine.RemoveObject2D(colNumberSquare[selectedColIndex][Math.Abs(selectedRowIndex + 1)].getTextObject());
colNumberSquare[selectedColIndex].RemoveAt(Math.Abs(selectedRowIndex + 1));
for (int row = selectedRowIndex + 1; Math.Abs(row) < colNumberSquare[selectedColIndex].Count; row--)
{
colNumberSquare[selectedColIndex][Math.Abs(row)].SetPosition(row - 1, selectedColIndex);
}
}
}
selectedNumberSquare.SetValue("0");
}
selectedNumberSquare = null;
}
}
}
else
{
palette.Hide();
}
とりあえず、UI周りはこれで十分かと思います。
じゃあ、ロジックに戻りましょうか。